微服务核心要素
一、微服务架构体系
微服务架构,作为软件开发领域的一个热门话题,它的核心不仅仅局限于技术层面,而是涵盖了业务建模、技术体系和研发过程的全方位考量。
(一)微服务架构基本概念
微服务的三大要素包括业务建模、技术体系和研发过程:
- 业务建模:涉及将复杂业务系统拆分成独立运作的微服务,核心子域、通用子域和支撑子域的划分是关键。
- 技术体系:包括服务治理、服务路由、服务容错等八大关键组件,它们共同构成了微服务架构的技术基础。
- 研发过程:强调以功能为中心的团队建设,即Feature Team,以促进不同技能背景的人员协同工作。
微服务的扩展性通过AFK扩展立方体来描述,包括水平扩展(X轴)、垂直扩展(Y轴)和数据分区(Z轴)。
业务边界的划分采用领域驱动设计(DDD),通过界定上下文和聚合,形成稳定的业务内核。
数据管理方面,微服务架构倡导服务与数据的分离,并采用XQRS模式,将数据操作分为查询和命令两大类。
事务管理策略需要考虑跨服务的事务一致性,包括强一致性和弱一致性(最终一致性)的处理。
对于遗留系统的微服务化,可以采用绞杀者模式或修缮者模式进行架构演进。
(二)微服务架构核心技术组件
微服务架构的核心技术组件包括:
- 网络通信:在微服务中,HTTP协议因其开发、维护和性能的综合优势而成为主流选择。
- 服务治理:注册中心作为服务治理的核心,负责服务的注册与发现。
- 服务路由:通常与注册中心结合使用,通过负载均衡器实现服务调用。
- 服务容错:包括集群容错策略、服务隔离机制等。
- 服务配置:配置中心用于统一管理项目配置。
- 服务网关:负责请求监控、安全管理等。
- 服务安全:微服务间的访问需要安全认证,如基于Token机制。
- 服务监控:数据埋点、指标采集等,通过可视化工具展示。
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-go和protoc-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
如果需要安装protoc
、protoc-gen-go
、protoc-gen-go-grpc
,可以使用以下命令:
bashgoctl env check -i -f
这将自动安装所需的依赖。
API服务与文档生成
- API文档生成:通过
goctl api doc --dir ./
命令,可以根据.api
文件生成API文档。 - 服务关键配置:使用
@server
注解定义服务的路由组和路由前缀:
go@server(
group: user,
prefix: api/v1
)
三、深入Go-Zero开发
API代码编写
- 创建
.api
文件:例如user.api
,手动创建或使用命令goctl api new user
自动生成。 - 编写API定义:定义请求和响应类型,以及服务端点。
- 生成API代码:使用
goctl api go
命令或别名apigen
生成API的Go代码。 - 构建项目结构:包括内部逻辑、服务上下文、类型定义等。
- 下载依赖:运行
go mod tidy
命令整理模块依赖。 - 生成Dockerfile和k8s配置文件:为部署准备必要的文件。
RPC代码编写
- 创建
.proto
文件:例如user.proto
,定义RPC服务和消息类型。 - 生成RPC代码:使用
goctl rpc protoc
命令或别名rpcgen
生成RPC的Go代码。 - 查看生成目录:确认生成的代码结构是否符合预期。
- 下载依赖:运行
go mod tidy
命令整理模块依赖。
Model代码生成
- 编写
genModel.sh
脚本:自动化Model代码的生成。 - 执行脚本:根据数据库表名生成Model代码。
- 移动和调整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
)