字节笔记本
2026年2月22日
go-zero 微服务实战:服务拆分与架构设计
本文是 go-zero 微服务实战系列的第二篇,详细讲解微服务架构中的服务拆分策略,包括微服务概述、服务划分方法、BFF层设计以及工程结构规划等内容。
微服务概述
微服务架构是一种架构风格,它将一个大的系统构建为多个微服务的集合,这些微服务是围绕业务功能构建的,服务关注单一的业务功能,这些服务具有以下特点:
- 高度可维护和可测试
- 松散的耦合
- 可独立部署
- 围绕业务功能进行构建
- 由不同的小团队进行维护
微服务架构能够快速、频繁、可靠地交付大型、复杂的应用程序,通过业务拆分实现服务组件化,使用组件进行组合从而快速开发系统。
服务划分
在实际的项目开发中,我们通常采用两种微服务划分策略:
- 通过业务职能进行微服务边界的划分
- 通过 DDD 的界限上下文进行微服务边界的划分
本文采用业务职能的方式进行微服务划分,以电商项目为例,根据业务职能做如下微服务的划分:
- 商品服务(product) - 商品的添加、信息查询、库存管理等功能
- 购物车服务(cart) - 购物车的增删改查
- 订单服务(order) - 生成订单,订单管理
- 支付服务(pay) - 通过调用第三方支付实现支付功能
- 账号服务(user) - 用户信息、等级、封禁、地址管理
- 推荐服务(recommend) - 首页商品推荐
- 评论服务(reply) - 商品的评论功能、评论的回复功能
BFF层
对于复杂的高并发系统,我们需要处理各种异常的场景。比如某个页面需要依赖多个微服务提供的数据,为了避免串行请求导致的耗时过长,我们一般会并行请求多个微服务。如果其中的某个服务请求异常,可能需要做一些特殊处理,比如提供降级数据等。
此外,页面展示的数据往往都是面向业务功能的,而不是单单某一个微服务的数据,这时候往往需要组装多个微服务的数据来满足需求。
BFF 层的作用
BFF(Backend for Frontend)层的引入解决了上述问题:
- 为客户端提供一个集中的接口
- 处理复杂的数据组装逻辑
- 实现异常处理和降级策略
- 将业务逻辑下沉到服务端,做到"前轻后重"
多个 BFF 的设计
可以提供多个 BFF 服务:
- 移动端页面和浏览器页面的数据协议不同,可以使用两个 BFF
- 提高服务的可用性,降低业务异常的影响面
- 避免单点故障导致所有业务受影响
工程结构
采用集中管理的方式,把所有的服务放到一个大仓库中,仓库的目录结构如下:
lebron/
├── apps/ # 存放所有微服务
│ ├── app/ # BFF服务
│ ├── cart/ # 购物车服务
│ ├── order/ # 订单服务
│ ├── pay/ # 支付服务
│ ├── product/ # 商品服务
│ ├── recommend/ # 推荐服务
│ ├── reply/ # 评论服务
│ └── user/ # 账号服务
└── pkg/ # 所有服务共同依赖的包服务类型划分
在每个服务目录下分为多个服务类型:
- api - 对外的 BFF 服务,接受来自客户端的请求,暴露 HTTP 接口
- rpc - 对内的微服务,仅接受来自内部其他微服务或者 BFF 的请求,暴露 gRPC 接口
- rmq - 负责进行流式任务处理,上游一般依赖消息队列,比如 Kafka 等
- admin - 面向运营侧的服务,数据权限较高,通过隔离带来更好的代码级别安全,直接提供 HTTP 接口
服务类型说明
- app 服务:只有 api 服务,作为 BFF 对外提供接口
- order/pay/product 等服务:拆分成 rpc、rmq 和 admin,满足对内提供 rpc 接口和运营数据的需求
- recommend 服务:只有 rpc 服务,因为推荐服务需要依赖 AI 团队或大数据团队提供的数据
代码初始化
使用 goctl 工具进行项目初始化:
初始化 RPC 服务
$ cd lebron/apps/order
$ goctl rpc new rpc初始化 API 服务
$ goctl api new admin生成的服务代码可以直接运行,默认侦听在 8888 端口:
$ go run admin.go
Starting server at 0.0.0.0:8888...RMQ 服务
对于 rmq 服务,使用 go-zero 提供的 kq 功能进行初始化。
总结
本文讲解了微服务的定义和特点,微服务是围绕业务功能构建的,服务间采用轻量级的通讯机制,每个微服务都可以独立部署和测试。
根据商城功能进行了微服务的拆分,主要拆分了购物车、订单、支付、商品、评论、推荐、账号等服务。同时说明了为什么需要引入 BFF 服务,BFF 本质上是一个用于做数据组装的服务,对外提供面向业务功能的 HTTP 接口。
工程的目录结构主要分为 api、rpc、rmq 和 admin 等服务,不同服务的职责不同:
- api 对外提供 HTTP 接口
- rpc 对内提供 RPC 接口
- rmq 做流式数据的处理
- admin 面向运营后台提供 HTTP 接口
通过 goctl 可以一键生成项目框架代码,大大提升开发效率。