4. 领域边界识别:限界上下文、上下文映射与核心域划分

在领域驱动设计中,限界上下文(Bounded Context)是划分领域边界的核心单元。它定义了模型、术语和业务规则的显式边界,确保每个上下文内部拥有一致且无歧义的通用语言。本章将系统讲解如何识别和定义限界上下文,绘制上下文映射图,并划分核心域、支撑域与通用域。

4.1 限界上下文(Bounded Context)的定义

限界上下文是一个语义边界,在该边界内,领域模型、术语、业务规则和实现技术保持高度一致。不同上下文之间通过明确的接口进行通信,避免模型污染。

特性 说明
语义一致性 同一术语在上下文内具有唯一且明确的含义
模型独立性 每个上下文拥有独立的领域模型,不与其他上下文共享
边界显式化 通过接口、事件或消息队列定义清晰的通信边界
团队对齐 通常一个限界上下文对应一个团队或微服务
识别线索:当团队对同一术语(如“订单”、“用户”、“产品”)产生歧义时,往往意味着需要划分新的限界上下文。

4.2 上下文映射(Context Map)

上下文映射是描述多个限界上下文之间协作关系的可视化工具。它帮助团队理解系统全局结构,识别集成点和潜在冲突。

4.2.1 常见映射关系类型

关系类型 方向 典型场景
合作关系(Partnership) 双向 两个团队共同维护一个集成接口
共享内核(Shared Kernel) 双向 共享少量核心模型,如用户身份
客户-供应商(Customer-Supplier) 单向 上游提供数据,下游消费
防腐层(Anti-Corruption Layer) 单向 隔离遗留系统或第三方服务
开放主机服务(Open Host Service) 单向 对外提供标准API
发布语言(Published Language) 单向 使用标准协议如REST/GraphQL
分离方式(Separate Ways) 无 完全独立的两个子系统
实践建议:在Go微服务架构中,优先使用开放主机服务 + 防腐层组合,既能暴露标准API,又能隔离外部变化。

4.2.2 上下文映射示例图

上下文映射示例:电商系统 电商系统上下文映射图 订单上下文 Order Service 支付上下文 Payment Service 库存上下文 Inventory Service 用户上下文 User Service 通知上下文 Notification Service 支付网关 第三方系统 客户-供应商 客户-供应商 防腐层 共享内核 发布事件 图例说明 ● 蓝色/红色/绿色/紫色/橙色/青色 = 不同限界上下文 ● 实线箭头 = 单向依赖(客户-供应商/防腐层) ● 虚线箭头 = 事件驱动(发布-订阅)

4.3 核心域 / 支撑域 / 通用域划分

领域划分帮助团队聚焦资源,将精力集中在最具业务价值的区域。根据业务战略价值和复杂度,领域可分为三类:

领域类型 定义 投资策略 Go实现示例
核心域 系统最核心、最具竞争力的业务逻辑 自研、高投入、持续优化 定价引擎、风控规则、推荐算法
支撑域 为核心域提供必要支持,但非核心竞争力 自研或外包,适度投入 订单管理、用户权限、报表系统
通用域 行业通用能力,无差异化价值 采购SaaS、开源方案、低投入 邮件发送、日志收集、认证鉴权
常见误区:团队容易将所有业务都视为核心域,导致资源分散。核心域通常只占系统功能的20%以下,但贡献80%的业务价值。

4.3.1 领域划分决策流程

  1. 识别业务能力:列出系统所有业务功能点
  2. 评估战略价值:判断每个功能是否构成竞争壁垒
  3. 评估复杂度:分析实现难度和领域知识深度
  4. 分类标记:将功能归入核心/支撑/通用域
  5. 制定策略:决定自研、采购或开源

4.3.2 领域划分示例图

领域划分:核心域/支撑域/通用域 领域划分三层模型 核心域 定价引擎 · 风控规则 · 推荐算法 高投入 · 自研 · 持续迭代 支撑域 订单管理 · 用户权限 · 报表系统 适度投入 · 自研或外包 通用域 邮件发送 · 日志收集 · 认证鉴权 · 消息队列 采购SaaS · 开源方案 · 低投入 红色 = 核心域(最高优先级) | 橙色 = 支撑域(中等优先级) | 绿色 = 通用域(最低优先级)

4.4 Go项目中的领域边界实践

在Go微服务架构中,每个限界上下文通常对应一个独立的Go module或service package。以下是一个典型的目录结构示例:

ecommerce/
├── order/                    # 订单上下文(支撑域)
│   ├── domain/               # 领域模型
│   │   ├── order.go
│   │   └── order_repository.go
│   ├── application/          # 应用服务
│   │   └── order_service.go
│   ├── infrastructure/       # 基础设施
│   │   └── order_repo_impl.go
│   └── api/                  # 开放主机服务
│       └── order_handler.go
├── payment/                  # 支付上下文(核心域)
│   ├── domain/
│   │   ├── payment.go
│   │   └── payment_gateway.go
│   ├── application/
│   │   └── payment_service.go
│   ├── infrastructure/
│   │   └── payment_repo_impl.go
│   └── api/
│       └── payment_handler.go
├── inventory/                # 库存上下文(支撑域)
│   └── ...
├── notification/             # 通知上下文(通用域)
│   └── ...
└── go.mod
关键原则:每个限界上下文内部使用独立的通用语言,上下文之间通过防腐层或开放主机服务通信,避免直接依赖对方领域模型。

4.5 本章小结

  • 限界上下文是领域划分的基本单元,确保语义一致性
  • 上下文映射可视化系统全局结构,识别集成关系
  • 核心域/支撑域/通用域划分指导资源投入策略
  • Go项目中,每个限界上下文对应独立的module或package
  • 上下文之间通过防腐层和开放主机服务保持边界清晰