下载工作台
企业级架构运维

微服务拆分与领域边界

试读上半部分 · 解锁后可读全文

第 4 章 · 微服务拆分与领域边界

本章讲解 何时拆、怎么拆 微服务:bounded context、数据归属、API 契约、服务治理与贤紫 K8s 落地。

前置:PaaS 全栈联调;架构第 1~3 章;L3 场景常考微服务设计。


4.1 单体 vs 微服务

维度模块化单体微服务
上手速度快(单仓单部署)慢(多仓多流水线)
部署一次全发,回滚简单独立发布,版本矩阵复杂
故障隔离一进程挂全挂可隔离(若异步边界清晰)
数据事务本地 ACID分布式事务 / Saga
团队扩展8 人内尚可按上下文分团队
运维成本高(注册发现、链路、配置)

决策公式(参考)

若 (团队数 × 发布频率冲突) + (模块资源需求差异) > 运维成熟度得分
    → 考虑拆分
否则 → 模块化单体 + 清晰包边界
运维成熟度得分项
有 CI/CD、监控、日志、链路+2
有 K8s + 配置中心+2
无自动测试、无回滚-3

4.2 领域驱动拆分(DDD 轻量)

电商领域(Domain)
├── 商品上下文(Catalog)     —  SKU、类目、价格展示
├── 订单上下文(Order)       —  下单、状态机、履约
├── 库存上下文(Inventory)   —  可售库存、预占、释放
├── 支付上下文(Payment)     —  支付单、渠道、对账
├── 用户上下文(User)        —  账号、地址、会员等级
└── 营销上下文(Promotion)   —  券、满减、活动规则
原则说明验收
高内聚同一上下文内因同一业务规则变化改促销不动订单表结构
低耦合上下文间仅 API / 领域事件无跨库 JOIN
数据归属每个服务拥有自己的库表一服务一 Schema 起
通用语言文档与代码同名同义「订单」不混叫「单据」

4.2.1 贤紫商城上下文映射(示例)

上下文部署名Namespace数据库
商品catalog-apiappcatalog_db
订单order-apiapporder_db
库存inventory-apiappinventory_db
BFFcustomer-webapp无(聚合调用)

禁止order-apiinventory-api 直连同一张 stock


4.3 拆分时机信号

信号量化参考建议动作
发布拖累单次发布 > 2h;失败率 > 10%独立 Deployment
团队冲突> 8 人同仓;PR 等待 > 1 天按上下文分仓
资源差异某 API CPU 8 核,其余 0.5 核拆出高耗服务
扩缩不一搜索 QPS 10× 于后台独立 HPA
技术异构网关 Go + 核心 Java允许,但控制数量
合规隔离支付需 PCI 隔离独立网络域

行业案例 · 某 B2B 平台:5 团队共用一个 Django 单体,每周五「发布夜」平均 rollback 2 次。按 订单 / 合同 / 结算 三上下文拆服务后,单服务发布 < 15min,全站 rollback 频率降 70%


4.4 API 契约与版本

4.4.1 REST 约定

GET    /api/v1/orders/{id}
POST   /api/v1/orders
PATCH  /api/v1/orders/{id}/status
实践说明反模式
URL 版本/v1/ 明确无版本直接改字段
向后兼容加字段 OK;删改走 v2强制全客户端同发
错误码统一{code, message, traceId}各服务 HTTP 体格式不一
分页标准page/size 或 cursor每服务不同参数名
文档OpenAPI 3 入库 CI口头约定
# openapi-order-v1.yaml 片段
paths:
  /api/v1/orders:
    post:
      operationId: createOrder
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateOrderRequest'
      responses:
        '201':
          description: Created
          headers:
            X-Request-Id:
              schema: { type: string }

4.4.2 同步 vs 异步集成

方式适用延迟耦合
REST 同步查询、强依赖下一步结果
gRPC内部高性能调用
消息事件副作用、通知、统计
批量对账日终结算

4.5 K8s 服务发现与调用

Pod (order-api) ──► http://inventory-api.app.svc.cluster.local:8080/api/v1/stock/reserve
要素说明
DNS<service>.<namespace>.svc.cluster.local
端口Service port 非容器 targetPort 混用
超时客户端 connect + read 超时必设
重试仅幂等 GET;写操作慎重重试
apiVersion: v1
kind: Service
metadata:
  name: order-api
  namespace: app
spec:
  selector:
    app: order-api
  ports:
    - name: http
      port: 80
      targetPort: 8080
# 客户端配置示例
INVENTORY_BASE = os.getenv(
    "INVENTORY_URL",
    "http://inventory-api.app.svc.cluster.local:80",
)
TIMEOUT = (2.0, 5.0)  # connect, read

以下内容需解锁后阅读

试读已结束。解锁本章 ¥5.00,或开通年度会员畅读全部教程。
年度会员 ¥199.00/年; 小紫 AI 工作台有效会员 ¥99.00/年

正文仅在服务端鉴权后下发,未付费无法获取下半部分内容。