Go微服务系统精讲 Go-Zero全流程实战即时通讯 ( IM )

2024-05-16 21:32:22 浏览数 (2)

微服务核心要素

一、微服务架构体系

微服务架构,作为软件开发领域的一个热门话题,它的核心不仅仅局限于技术层面,而是涵盖了业务建模、技术体系和研发过程的全方位考量。

(一)微服务架构基本概念

微服务的三大要素包括业务建模、技术体系和研发过程:

  • 业务建模:涉及将复杂业务系统拆分成独立运作的微服务,核心子域、通用子域和支撑子域的划分是关键。
  • 技术体系:包括服务治理、服务路由、服务容错等八大关键组件,它们共同构成了微服务架构的技术基础。
  • 研发过程:强调以功能为中心的团队建设,即Feature Team,以促进不同技能背景的人员协同工作。

微服务的扩展性通过AFK扩展立方体来描述,包括水平扩展(X轴)、垂直扩展(Y轴)和数据分区(Z轴)。

业务边界的划分采用领域驱动设计(DDD),通过界定上下文和聚合,形成稳定的业务内核。

数据管理方面,微服务架构倡导服务与数据的分离,并采用XQRS模式,将数据操作分为查询和命令两大类。

事务管理策略需要考虑跨服务的事务一致性,包括强一致性和弱一致性(最终一致性)的处理。

对于遗留系统的微服务化,可以采用绞杀者模式或修缮者模式进行架构演进。

(二)微服务架构核心技术组件

微服务架构的核心技术组件包括:

  1. 网络通信:在微服务中,HTTP协议因其开发、维护和性能的综合优势而成为主流选择。
  2. 服务治理:注册中心作为服务治理的核心,负责服务的注册与发现。
  3. 服务路由:通常与注册中心结合使用,通过负载均衡器实现服务调用。
  4. 服务容错:包括集群容错策略、服务隔离机制等。
  5. 服务配置:配置中心用于统一管理项目配置。
  6. 服务网关:负责请求监控、安全管理等。
  7. 服务安全:微服务间的访问需要安全认证,如基于Token机制。
  8. 服务监控:数据埋点、指标采集等,通过可视化工具展示。

Spring Cloud Alibaba作为Spring Cloud的扩展,提供了包括服务治理(Nacos)、服务配置(Nacos)、服务容错(Sentinel)等在内的一系列解决方案。

Go微服务系统精讲 Go-Zero全流程实战即时通讯 ( IM ) - Go-Zero入门

GO环境配置

在Linux系统中,配置GO环境的示例如下:

代码语言:javascript复制
bashexport GOROOT="/home/haima/local/go" # 设置Go源码包路径
export GOPATH=/media/haima/34E401CC64DD0E282/site/go  # 设置工作目录路径
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin # 添加Go编译器和工具到系统PATH

环境与依赖安装

搭建Go-Zero开发环境需要以下组件:

  • go-zero:使用go mod tidy命令自动下载依赖。
  • goctl:Go-Zero的命令行工具,安装命令如下:bashGOPROXY=https://goproxy.cn/,direct go install github.com/zeromicro/go-zero/tools/goctl@latest
  • protoc:Protocol Buffers的编译器,可以从这里下载。
  • protoc-gen-goprotoc-gen-go-grpc:用于生成Go语言的Protocol Buffers代码。

goctl工具安装与使用

对于Go 1.16及以上版本,安装goctl并检查版本:

代码语言:javascript复制
bashhaima@haima-PC:~/Desktop$ goctl -v
goctl version 1.3.5 linux/amd64

如果需要安装protocprotoc-gen-goprotoc-gen-go-grpc,可以使用以下命令:

代码语言:javascript复制
bashgoctl env check -i -f

这将自动安装所需的依赖。

API服务与文档生成

  • API文档生成:通过goctl api doc --dir ./命令,可以根据.api文件生成API文档。
  • 服务关键配置:使用@server注解定义服务的路由组和路由前缀:
代码语言:javascript复制
go@server(
  group: user,
  prefix: api/v1
)

三、深入Go-Zero开发

API代码编写

  1. 创建.api文件:例如user.api,手动创建或使用命令goctl api new user自动生成。
  2. 编写API定义:定义请求和响应类型,以及服务端点。
  3. 生成API代码:使用goctl api go命令或别名apigen生成API的Go代码。
  4. 构建项目结构:包括内部逻辑、服务上下文、类型定义等。
  5. 下载依赖:运行go mod tidy命令整理模块依赖。
  6. 生成Dockerfile和k8s配置文件:为部署准备必要的文件。

RPC代码编写

  1. 创建.proto文件:例如user.proto,定义RPC服务和消息类型。
  2. 生成RPC代码:使用goctl rpc protoc命令或别名rpcgen生成RPC的Go代码。
  3. 查看生成目录:确认生成的代码结构是否符合预期。
  4. 下载依赖:运行go mod tidy命令整理模块依赖。

Model代码生成

  1. 编写genModel.sh脚本:自动化Model代码的生成。
  2. 执行脚本:根据数据库表名生成Model代码。
  3. 移动和调整Model代码:将生成的Model代码放到正确的服务目录,并调整包名。

代码示例与结构

文章中提供了完整的代码示例和项目结构,展示了如何构建基于Go-Zero的微服务项目。以下是部分示例:

GO环境配置示例
代码语言:javascript复制
bashexport GOROOT="/home/haima/local/go"
export GOPATH=/media/haima/34E401CC64DD0E282/site/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
goctl安装命令
代码语言:javascript复制
bashGOPROXY=https://goproxy.cn/,direct go install github.com/zeromicro/go-zero/tools/goctl@latest
API定义示例 (user.api)
代码语言:javascript复制
gosyntax = "v1"

info(
  author: "user-api"
  date:   "2022-03-26"
  desc:   "api语法示例及语法说明"
)

type UserInfoRequest {
  UserId int64 `json:"userId"`
}

type UserInfoResponse {
  UserId   int64  `json:"userId"`
  Nickname string `json:"nickname"`
}

service user-api{
  @doc "获取用户信息"
  @handler userInfo
  post /user/info (UserInfoRequest) returns (UserInfoResponse)
}
RPC定义示例 (user.proto)
代码语言:javascript复制
protobufsyntax = "proto3";

option go_package = "./pb";

package pb;

message GetUserInfoReq {
  int64  id = 1;
}

message GetUserInfoResp {
  int64  id = 1;
  string nickname = 2;
}

service usercenter {
  rpc GetUserInfo(GetUserInfoReq) returns(GetUserInfoResp);
}
生成API文档命令
代码语言:javascript复制
bashgoctl api doc --dir ./
使用@server注解定义服务
代码语言:javascript复制
go@server(
  group: user,
  prefix: api/v1
)

0 人点赞