【环境】Rocky8使用gvm配置Go多版本管理的微服务开发环境(go-zero)

avatar
作者
筋斗云
阅读量:0

【环境】Rocky8使用gvm配置Go多版本管理的微服务开发环境(go-zero)

文章目录

文章目录
1、Rocky8介绍
2、Go与GoLand安装
3、Go多版本管理(gvm)
4、go微服务框架介绍(含rpc测试工具,proto协议介绍)
5、go-zero安装(web,rpc)
6、环境变量,brew,git,kubectl,ssh等

1、Rocky8介绍

Rocky Linux与CentOS一样,提供了适用于服务器的稳定版本,旨在作为CentOS的完全兼容替代版本。

Rocky Linux 是一个 Linux 发行版,由 Rocky Enterprise Software Foundation 开发,这是一家自称”自我约束的非营利性”的私营公益公司。Rocky Linux 的目标是成为一个开放的企业操作系统,100% 兼容 Enterprise Linux,即与 Red Hat Enterprise Linux 完全兼容。总之,Rocky Linux 是一个免费开源、兼容 RHEL 的 Linux 发行版,由社区驱动开发,可以用于服务器、工作站等企业级应用场景。

Rocky Linux 与 CentOS 有着密切的关系。CentOS 原本是 RHEL 的一个免费开源再发行版,由社区维护,广泛用于服务器领域。但 2020 年底,Red Hat 宣布 CentOS 项目重心转移,CentOS 8 提前 EOL。
Rocky Linux 的创始人 Gregory Kurtzer 也是 CentOS 的创始人之一。CentOS 的变故直接促使他创建了 Rocky Linux 项目,目标是代替 CentOS,给用户提供一个免费、稳定、可预测的生产环境。因此,从定位上说,Rocky Linux 是 CentOS 的接替者,很多原 CentOS 用户也转向了 Rocky。从技术上说,Rocky Linux 是 RHEL 源代码的再编译版,而 RHEL 之前就是 CentOS 的上游。

Rocky 8(代号 “Green Obsidian” )的一般支持直到2024年5月1日为止,安全支持直到2029年5月01日为止。 支持的架构是 x86_64 和 aarch64 。

Rocky 9(代号 “Blue Onyx” )的一般支持直到2027年5月31日为止,安全支持直到2032年5月31日为止。 支持的架构是 x86_64-v2、aarch64、ppc64le 和 s390x。

参考资料:1 , 2

2、Go与GoLand安装

可以从 Go 官方页面 下载一个相对较新的 Go 二进制版本,然后解压并安装。注意配置环境变量和GOPATH。

使用下面的命令安装:

curl -O https://dl.google.com/go/go1.18.linux-amd64.tar.gz sudo tar -C /usr/local -xzf go1.18.linux-amd64.tar.gz 

将 Go 添加到系统路径中:

export PATH=$PATH:/usr/local/go/bin echo "export PATH=$PATH:/usr/local/go/bin" >> ~/.profile source ~/.profile 

验证 Go 是否安装成功:

go version 

查看go的配置(注意修改)

go env go env -w GOPROXY=“xxxx" go env -w GONOSUMDB=“xxxx" 

go构建服务

本地运行: go run xxx.go go build xxx.go  指定系统: cat /etc/os-release GOOS=linux GOARCH=amd64 go build -o xxx-servers 

Jetbrains GoLand安装

本地有环境的情况下 使用远程开发-ssh,服务端会自动安装(配置要求,最低4H8G) 

3、Go多版本管理(gvm)

因为 GVM 需要一个现有的 Go 版本来引导编译另一个 Go 版本,建议先安装一个二进制版本的 Go 来引导 GVM 的工作。

官方开源项目:github地址

1、gvm安装要先有go
否则会出现以下报错

gvm install go1.18 Installing go1.18... * Compiling... /root/.gvm/scripts/install: line 93: go: command not found ERROR: Failed to compile. Check the logs at /root/.gvm/logs/go-go1.17.7-compile.log ERROR: Failed to use installed version 

2、其他依赖安装(Redhat/Centos)
其他系统的依赖可以参考gvm官方项目

sudo yum install curl sudo yum install git sudo yum install make sudo yum install bison sudo yum install gcc sudo yum install glibc-devel 

3、安装gvm

安装命令: bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)  更新配置: Please restart your terminal session or to get started right away run source /root/.gvm/scripts/gvm 

4、使用不同版本的go

gvm listall gvm install go1.21 gvm list gvm use go1.21 

5、卸载gvm:

gvm implode 

4、go微服务框架介绍(含rpc测试工具,proto协议介绍)

Go:十大主流微服务框架

  • Istio(31.7K),地址
    由Google、IBM和Lyft开源的微服务管理、保护和监控框架。使用istio可以很简单的创建具有负载均衡、服务间认证、监控等功能的服务网络,而不需要对服务的代码进行任何修改。
  • Go-kit(24.1K),地址
    分布式开发包,用于开发微服务。
  • Go-zero(24.1K)地址
    集成了各种工程实践的 web 和 rpc 框架。
  • Go-micro(19.6K),地址
    icro是一个专注于简化分布式系统开发的微服务生态系统。
  • Kratos(19.2K),地址
    哔哩哔哩(B站)开源的一套Go微服务框架
  • CloudWeGo-Kitex(5.2K),地址
    KiteX 是字节跳动框架组研发的下一代高性能、强可扩展性的 Go RPC 框架。
  • Dubbo-go(4.2K) ,地址
    阿里,由Apache 软件基金会官方发布Go 语言加入 Dubbo 生态.
  • Tars-go(3.1K), 地址
    腾讯,Tarsgo是基于Golang编程语言使用Tars协议的高性能RPC框架
  • 北极星-polaris-go,地址
    北极星是腾讯开源的服务发现和治理中心,致力于解决分布式或者微服务架构中的服务可见、故障容错、流量控制和安全问题。
  • Go:十大主流微服务框架

微服务是什么?

  • 微服务(Microservices)是一种软件开发架构风格,它将一个大型的应用程序分解为一组小型、松散耦合的服务,每个服务都围绕特定的业务功能构建,并可以独立部署、扩展和维护。这些服务通常通过轻量级的通信机制(如HTTP RESTful API)进行交互。
  • 微服务架构的优势在于提高了系统的灵活性和可维护性,使得开发团队可以更快地迭代和部署新功能。然而,它也带来了一些挑战,如服务之间的协调、数据一致性、分布式系统的复杂性等。
  • 微服务架构,微服务的核心要素在于服务的发现、注册、路由、熔断、降级、分布式配置。
  1. 服务分解:将应用程序分解为一组小型服务,每个服务都封装了特定的业务功能。
  2. 独立部署:每个微服务可以独立于其他服务进行部署、更新和扩展。
  3. 技术多样性:不同的微服务可以使用不同的编程语言、数据库和存储技术。
  4. 业务对齐:每个服务都围绕特定的业务能力构建,使得服务更加专注和易于理解。
  5. 松散耦合:服务之间的耦合度较低,一个服务的更改不会直接影响到其他服务。
  6. 服务发现:服务实例需要能够发现并动态地找到其他服务的实例,通常通过服务注册中心实现。
  7. 负载均衡:在多个服务实例之间分配请求,以提高系统的可用性和伸缩性。
  8. 容错性:系统设计能够处理单个服务的故障,通过熔断机制和降级策略来保护系统。
  9. 服务注册中心:服务实例在启动时向注册中心注册自己,并定期发送心跳以表明存活状态。
  10. API网关:作为所有服务请求的入口点,提供路由、认证、监控和限流等功能。
  11. 配置管理:集中管理服务配置,支持动态更新,以适应不同环境的需求。
  12. 日志和监控:集中记录和管理服务日志,实施监控和警报机制,以便于问题诊断和性能优化。
  13. 数据管理:每个服务可以有自己的数据库,或者共享数据库,但需要设计数据一致性的策略。
  14. 安全:确保服务之间的通信安全,实施认证和授权机制。
  15. DevOps实践:微服务架构通常与持续集成/持续部署(CI/CD)、容器化(如Docker)和基础设施自动化等DevOps实践相结合。

rpc是什么?对比rpc和http

  • RPC(Remote Procedure Call)即远程过程调用,它允许程序调用另一个地址空间(通常是另一个机器上的)程序的函数或方法,就像调用本地函数一样简单。RPC 隐藏了网络编程的复杂性,让开发者可以像调用本地方法一样调用远程方法。
  • RPC 可以使用各种底层传输协议,如 TCP、HTTP、UDP 等。常见实现: gRPC、Thrift、Protobuf-RPC。
    HTTP: 基于 TCP 协议。常见实现: REST API、GraphQL。
  • 协议层
    RPC: 是一个更高层的抽象,用于封装复杂的分布式系统的调用细节。它并不关心具体的传输协议,底层可以是 HTTP、TCP、UDP 等。
    HTTP: 是一个具体的传输协议,规定了客户端和服务器之间如何通信及通信的格式。
  • 通信模式
    RPC: 典型的是同步调用(类似函数调用),客户端发送一个请求并等待响应。许多 RPC 框架也支持异步调用。
    HTTP: 基于请求-响应模式,客户端发送请求,服务器处理并返回响应。这是典型的无状态通信。
  • 使用场景
    RPC: 适合需要严格定义接口和高性能通信的内部服务调用,如微服务架构中的服务之间调用。它通常使用二进制协议(如 Protobuf)来提高效率。
    HTTP: 更通用,适合范围更广的应用场景,包括网页浏览、RESTful API 服务等。由于其高度普及性,适用于与外部系统或前端进行交互。
  • 数据格式
    RPC: 通常使用紧凑的二进制格式(如 Protobuf、Thrift、Avro)进行序列化和反序列化,以提升性能和效率。
    HTTP: 数据格式通常是人类可读的文本格式(如 JSON、XML),这使调试和开发更加直观。
  • 性能
    RPC: 基于二进制协议的 RPC(如 gRPC)通常比 HTTP 更高效,因为二进制格式比文本格式(如 JSON)更紧凑,序列化/反序列化速度更快。
    HTTP: HTTP 本身并不关注性能优化,因此在序列化和数据传输上通常不如基于二进制协议的 RPC 高效。
  • 互操作性
    RPC: 不同的 RPC 框架之间通常不兼容(如 gRPC 的客户端无法直接调用 Thrift 的服务)。需要特定的客户端和服务器库支持。
    HTTP: HTTP 基于开放标准,几乎所有系统和语言都支持 HTTP 请求,因此具有良好的互操作性。
  • 结论
    RPC 更适合于高性能、内部服务的通信,需要严格控制的接口和较高的序列化/反序列化效率。
    HTTP 更适合于开放、通用的应用场景,尤其是需要与外部系统交互的情况,并且由于其简易性和普及性,在 Web 开发中占有重要地位。

有哪些rpc接口测试工具?

  • Postman:这是一个广泛使用的 API 开发工具,支持 HTTP、HTTPS、SOAP、REST 等多种协议,可以发送请求、组织请求、使用环境变量,并具有测试与验证、数据驱动测试和 API 文档生成等高级功能
  • Apifox:Apifox 是一个一体化 API 协作平台,提供了 API 文档、API 调试、API Mock、API 自动化测试等功能。它支持 gRPC 接口的调试和管理,允许用户直接导入 .proto 文件,自动解析文件中的服务定义和消息结构,生成相应的测试用例模板。
  • BloomRPC: BloomRPC 是一个专门为 gRPC 服务设计的测试工具,提供了直观的用户界面,便于发现和调用 gRPC 方法。
  • rpc接口测试工具BloomRPC和Grpc UI, bloomrpc-github
  • grpcurl:grpcurl 是一个常用的命令行工具,用于与 gRPC 服务器交互。它类似于 cURL,但专门用于 gRPC 服务器。它支持直接使用 Protocol Buffers 文件(.proto)来描述接口和消息格式。
1、grpcurl brew install grpcurl grpcurl -plaintext -d '{"name": "World"}' localhost:50051 helloworld.Greeter/SayHello 这里 -plaintext 表示使用明文通信,-d 选项指定请求的 JSON 数据。  2、BloomRPC CLI 虽然 BloomRPC 本身是一个 GUI 工具,但其也提供了一个命令行版本,可以用于非图形环境中进行测试。 npm install -g @bloomrpc/cli bloomrpc-cli --host localhost:50051 --proto ./path/to/your/service.proto --service ServiceName --call MethodName --data '{"field1": "value1", "field2": "value2"}'  

数据序列化协议proto是什么?

  • Protocol Buffers(简称Proto)是一种由Google开发的数据序列化协议,用于数据存储或通信协议。它类似于XML或JSON,但更小、更快、更简单。
  • proto的特点:
  1. 语言无关性:Proto定义了一种中立的数据描述语言,可以用于多种编程语言,如Java、C++、Python等。
  2. 平台无关性:由于其语言无关性,Proto可以在不同的操作系统和平台上使用。
  3. 版本控制:Proto支持版本控制,允许向后兼容,即新版本的数据结构可以兼容旧版本的数据。
  4. 性能高效:Proto生成的序列化数据通常比XML或JSON更小,解析速度也更快。
  5. 自动生成代码:通过Proto编译器,可以从.proto文件自动生成数据访问代码,减少手动编写和维护代码的工作量。
  6. 自描述性.proto文件中定义的数据结构是自描述的,可以用于生成API文档。
  • Proto的使用场景非常广泛,包括但不限于:
    网络服务:用于定义RPC(远程过程调用)协议。
    数据存储:用于存储结构化数据到数据库。
    配置文件:用于定义配置数据结构。
    消息系统:用于定义消息格式,用于消息传递。

  • 使用Proto的步骤:

1、.proto文件定义数据结构  syntax = "proto3"; message Person {     string name = 1;     int32 id = 2;     string email = 3; }  2、编译生成特定编程语言的数据访问类, 例如,使用以下命令生成Java代码: protoc --java_out=. --proto_path=. your_file.proto  3、 使用生成的类,在程序中使用编译生成的类来序列化和反序列化数据。例如,在Java中: Person person = Person.newBuilder()     .setName("John Doe")     .setId(1234)     .setEmail("john.doe@example.com")     .build(); // 序列化 byte[] data = person.toByteArray(); // 反序列化 Person newPerson = Person.parseFrom(data);  

参考资料:

5、go-zero安装(web,rpc)

go-zero 是一个集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验。其中web是基于RESTful API的,rpc是基于gRPC服务的。

官方文档:地址

web服务(goctl安装)

go版本:go mod tidy -go=1.xx && go mod tidy -go=1.xx go-zero版本:goctl需要与go-zero版本一致,比如当前go.mod中的zero是1.3.2,那么ctl就是1.3.2  查看所有的ctl版本 go list -m -versions github.com/zeromicro/go-zero/tools/goctl  安装,注意这里的v很重要(漏了就找不到了) go install github.com/zeromicro/go-zero/tools/goctl@latest go install github.com/zeromicro/go-zero/tools/goctlv1.3.2  验证: goctl —version   使用: 生成API服务模板:goctl api new myproject 你可以在 myproject.api 文件中定义你的 API 接口。例如,默认情况下可能会有一个简单的 Ping 接口。 修改代码:goctl api go -api myproject.api -dir . 启动服务:go run myproject.go -f etc/myproject-api.yaml  

rpc服务(protoc安装),手动下载地址

注意: 需要提前将添加 Go 的 bin 目录到系统 PATH:  安装: 通过 goctl 可以一键安装 protoc,protoc-gen-go,protoc-gen-go-grpc 相关组件,你可以执行如下命令 goctl env check --install --verbose —force  手动安装: 解压下载的压缩包,并将其移动到 $GOBIN 目录,查看 $GOBIN 目录: go env GOPATH GOBIN 为 $GOPATH/bin,如果你的 $GOPATH 不在 $PATH 中,你需要将其添加到 $PATH 中。  使用: 生成rpc项目模板:goctl rpc new myrpcservice 打开 myrpcservice.proto 文件,根据需要定义你的 RPC 接口。例如,默认可能包含一个简单的服务。 生成代码:goctl rpc protoc myrpcservice.proto --go_out=. --go-grpc_out=. --zrpc_out=. 启动服务:go run myrpcservice.go -f etc/myrpcservice.yaml 

6、环境变量,brew,git,kubectl,ssh等

linux内核系统环境变量介绍

常见的配置文件及其用途:  1.全局配置文件(对系统中所有用户生效): /etc/profile:系统范围内的环境变量和启动脚本。 /etc/bashrc:系统范围内的bash shell设置。 /etc/environment:用于设置全局环境变量,但不会解析shell语法(例如变量替换)。  2.用户特定的配置文件(只对特定用户生效): ~/.bash_profile:对某个用户生效的登录shell配置。用于用户级别的登录shell配置。 ~/.bashrc:对某个用户生效的非登录shell配置。用于用户级别的非登录shell配置,通常在启动一个新的终端时执行。 ~/.profile:对某个用户生效的登录shell配置,适用于多种shell。  3.配置过程 nano ~/.bash_profile export MY_VARIABLE="my_value" source ~/.bash_profile echo $MY_VARIABLE XS 

mac 环境变量

export PATH=$PATH:$(go env GOPATH)/bin export PATH=$PATH:/Users/user/go/bin source ~/.bashrc  # 或者 source ~/.bash_profile, source ~/.zshrc 

mac安装homebrew

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"  环境变量: ls /opt/homebrew/bin/brew nano ~/.bash_profile export PATH="/opt/homebrew/bin:$PATH” 保存并退出文件(按 Ctrl + X,然后按 Y,再按 Enter) source ~/.bash_profile brew —version 

K8S相关

  • kubectl 是 Kubernetes 的命令行工具(CLI),是 Kubernetes 用户和管理员必备的管理工具。
  • Kubernetes(也称K8s 或“kube”)是一个开源容器编排平台,可以自动完成在部署、管理和扩展容器化应用过程中涉及的许多手动操作。
    有效的 Kubernetes 部署称为集群,也就是一组运行 Linux 容器的主机。您可以将 Kubernetes 集群可视化为两个部分:控制平面与计算设备(或称为节点)
  • kubectl安装,官方
安装相关: 下载本体:curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" 下载验证:curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256" 验证:echo "$(cat kubectl.sha256)  kubectl" | sha256sum --check 安装:sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl 版本:kubectl version --client  配置相关 mkdir .kube scp ~/.kube/config  root@xxx:xxx/xxx 

git安装,官方,

ssh相关(服务器同理) 生成ssh秘钥:ssh-keygen -t rsa -C “xxx.com” 公钥(远程配置):cat ~/.ssh/id_rsa.pub 私钥(本地使用):cat ~/.ssh/id_rsa  git配置 git config --global user.name "John Doe” git config --global user.email johndoe@example.com  git命令 git pull git fetch git checkout -b feat-xxx-xxx git add . git commit -m feat: xxx" git push origin  git branch -d branch_name 删除本地 git push origin --delete branch_name 删除远程  git报错(配置本机ssh服务) Enter passphrase for key '/Users/user/.ssh/id_rsa’: 系统pwd eval "$(ssh-agent -s)” ssh-add ~/.ssh/id_rsa  ssh服务管理 # 检查sshd服务状态 sudo systemctl status sshd # 启动sshd服务 sudo systemctl start sshd # 停止sshd服务 sudo systemctl stop sshd # 重启sshd服务 sudo systemctl restart sshd # 使sshd服务在系统启动时自动启动 sudo systemctl enable sshd # 禁止sshd服务在系统启动时自动启动 sudo systemctl disable sshd 

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!