【环境】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。
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)进行交互。
- 微服务架构的优势在于提高了系统的灵活性和可维护性,使得开发团队可以更快地迭代和部署新功能。然而,它也带来了一些挑战,如服务之间的协调、数据一致性、分布式系统的复杂性等。
- 微服务架构,微服务的核心要素在于服务的发现、注册、路由、熔断、降级、分布式配置。
- 服务分解:将应用程序分解为一组小型服务,每个服务都封装了特定的业务功能。
- 独立部署:每个微服务可以独立于其他服务进行部署、更新和扩展。
- 技术多样性:不同的微服务可以使用不同的编程语言、数据库和存储技术。
- 业务对齐:每个服务都围绕特定的业务能力构建,使得服务更加专注和易于理解。
- 松散耦合:服务之间的耦合度较低,一个服务的更改不会直接影响到其他服务。
- 服务发现:服务实例需要能够发现并动态地找到其他服务的实例,通常通过服务注册中心实现。
- 负载均衡:在多个服务实例之间分配请求,以提高系统的可用性和伸缩性。
- 容错性:系统设计能够处理单个服务的故障,通过熔断机制和降级策略来保护系统。
- 服务注册中心:服务实例在启动时向注册中心注册自己,并定期发送心跳以表明存活状态。
- API网关:作为所有服务请求的入口点,提供路由、认证、监控和限流等功能。
- 配置管理:集中管理服务配置,支持动态更新,以适应不同环境的需求。
- 日志和监控:集中记录和管理服务日志,实施监控和警报机制,以便于问题诊断和性能优化。
- 数据管理:每个服务可以有自己的数据库,或者共享数据库,但需要设计数据一致性的策略。
- 安全:确保服务之间的通信安全,实施认证和授权机制。
- 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的特点:
- 语言无关性:Proto定义了一种中立的数据描述语言,可以用于多种编程语言,如Java、C++、Python等。
- 平台无关性:由于其语言无关性,Proto可以在不同的操作系统和平台上使用。
- 版本控制:Proto支持版本控制,允许向后兼容,即新版本的数据结构可以兼容旧版本的数据。
- 性能高效:Proto生成的序列化数据通常比XML或JSON更小,解析速度也更快。
- 自动生成代码:通过Proto编译器,可以从
.proto
文件自动生成数据访问代码,减少手动编写和维护代码的工作量。 - 自描述性:
.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