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 上下文映射示例图
4.3 核心域 / 支撑域 / 通用域划分
领域划分帮助团队聚焦资源,将精力集中在最具业务价值的区域。根据业务战略价值和复杂度,领域可分为三类:
| 领域类型 | 定义 | 投资策略 | Go实现示例 |
|---|---|---|---|
| 核心域 | 系统最核心、最具竞争力的业务逻辑 | 自研、高投入、持续优化 | 定价引擎、风控规则、推荐算法 |
| 支撑域 | 为核心域提供必要支持,但非核心竞争力 | 自研或外包,适度投入 | 订单管理、用户权限、报表系统 |
| 通用域 | 行业通用能力,无差异化价值 | 采购SaaS、开源方案、低投入 | 邮件发送、日志收集、认证鉴权 |
常见误区:团队容易将所有业务都视为核心域,导致资源分散。核心域通常只占系统功能的20%以下,但贡献80%的业务价值。
4.3.1 领域划分决策流程
- 识别业务能力:列出系统所有业务功能点
- 评估战略价值:判断每个功能是否构成竞争壁垒
- 评估复杂度:分析实现难度和领域知识深度
- 分类标记:将功能归入核心/支撑/通用域
- 制定策略:决定自研、采购或开源
4.3.2 领域划分示例图
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
- 上下文之间通过防腐层和开放主机服务保持边界清晰