字节笔记本

2026年2月22日

go-zero 微服务实战:服务拆分与架构设计

本文是 go-zero 微服务实战系列的第二篇,详细讲解微服务架构中的服务拆分策略,包括微服务概述、服务划分方法、BFF层设计以及工程结构规划等内容。

微服务概述

微服务架构是一种架构风格,它将一个大的系统构建为多个微服务的集合,这些微服务是围绕业务功能构建的,服务关注单一的业务功能,这些服务具有以下特点:

  • 高度可维护和可测试
  • 松散的耦合
  • 可独立部署
  • 围绕业务功能进行构建
  • 由不同的小团队进行维护

微服务架构能够快速、频繁、可靠地交付大型、复杂的应用程序,通过业务拆分实现服务组件化,使用组件进行组合从而快速开发系统。

服务划分

在实际的项目开发中,我们通常采用两种微服务划分策略:

  1. 通过业务职能进行微服务边界的划分
  2. 通过 DDD 的界限上下文进行微服务边界的划分

本文采用业务职能的方式进行微服务划分,以电商项目为例,根据业务职能做如下微服务的划分:

  • 商品服务(product) - 商品的添加、信息查询、库存管理等功能
  • 购物车服务(cart) - 购物车的增删改查
  • 订单服务(order) - 生成订单,订单管理
  • 支付服务(pay) - 通过调用第三方支付实现支付功能
  • 账号服务(user) - 用户信息、等级、封禁、地址管理
  • 推荐服务(recommend) - 首页商品推荐
  • 评论服务(reply) - 商品的评论功能、评论的回复功能

BFF层

对于复杂的高并发系统,我们需要处理各种异常的场景。比如某个页面需要依赖多个微服务提供的数据,为了避免串行请求导致的耗时过长,我们一般会并行请求多个微服务。如果其中的某个服务请求异常,可能需要做一些特殊处理,比如提供降级数据等。

此外,页面展示的数据往往都是面向业务功能的,而不是单单某一个微服务的数据,这时候往往需要组装多个微服务的数据来满足需求。

BFF 层的作用

BFF(Backend for Frontend)层的引入解决了上述问题:

  • 为客户端提供一个集中的接口
  • 处理复杂的数据组装逻辑
  • 实现异常处理和降级策略
  • 将业务逻辑下沉到服务端,做到"前轻后重"

多个 BFF 的设计

可以提供多个 BFF 服务:

  • 移动端页面和浏览器页面的数据协议不同,可以使用两个 BFF
  • 提高服务的可用性,降低业务异常的影响面
  • 避免单点故障导致所有业务受影响

工程结构

采用集中管理的方式,把所有的服务放到一个大仓库中,仓库的目录结构如下:

text
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 服务

bash
$ cd lebron/apps/order
$ goctl rpc new rpc

初始化 API 服务

bash
$ goctl api new admin

生成的服务代码可以直接运行,默认侦听在 8888 端口:

bash
$ 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 可以一键生成项目框架代码,大大提升开发效率。

参考资源

分享: