GoBFF领域边界认证授权与权限测试 - 第2节
2.1 限界上下文:领域边界的核心单元
在领域驱动设计(DDD)中,限界上下文(Bounded Context) 是划分领域边界的原子单位。它定义了模型、术语和业务规则的显式边界,确保每个上下文内部拥有一致的通用语言(Ubiquitous Language)。
限界上下文的核心特征包括:
- 模型一致性:同一上下文内的实体、值对象、领域服务共享同一套语义。
- 边界隔离:不同上下文之间的模型可以同名但含义不同(例如“用户”在支付上下文与客服上下文中属性不同)。
- 通信协议:上下文之间通过事件、API 或消息队列进行集成,避免内部模型泄漏。
实践要点:在 Go 微服务中,每个限界上下文通常对应一个独立的 Go Module 或 Service 包。包内的类型、接口和错误定义构成该上下文的通用语言。
限界上下文与微服务的关系
| 维度 | 限界上下文 | 微服务 |
|---|---|---|
| 粒度 | 逻辑边界,可包含多个子域 | 部署单元,通常 1:1 映射到限界上下文 |
| 模型 | 内部模型高度内聚 | 通过 API 契约暴露模型 |
| 通信 | 上下文间通过事件或 RPC | 服务间通过 gRPC/HTTP/消息队列 |
| 权限 | 边界内自主控制 | 边界处实施认证与授权 |
2.2 领域边界划分方法
划分领域边界需要结合业务事件、实体关系与团队结构。以下是三种主流划分策略:
- 事件风暴(Event Storming):通过识别领域事件(Domain Event)和命令(Command),找到聚合根与限界上下文的分界线。
- 业务能力映射:按业务部门或核心能力(如订单、支付、库存)划分,每个能力对应一个上下文。
- 子域划分:将领域拆分为核心子域、支撑子域和通用子域,每个子域可独立为一个限界上下文。
边界划分检查清单:
- 该边界内的术语是否一致?
- 边界内的业务规则是否独立变化?
- 边界间的通信频率是否低于边界内?
- 团队结构是否支持该边界的自治?
2.3 BFF 与领域边界的关系
BFF(Backend For Frontend) 是位于前端与后端微服务之间的中间层。BFF 与领域边界的关系体现在三个层面:
- 边界聚合:BFF 将多个限界上下文的数据聚合为前端需要的视图,避免前端直接调用多个领域服务。
- 边界安全:BFF 是领域边界的统一入口,在此处实施认证、授权、限流等安全策略,保护内部领域服务。
- 边界适配:BFF 负责将领域模型的内部表示转换为前端友好的 DTO,隔离领域变化对前端的影响。
常见误区:BFF 不应包含业务逻辑或领域规则。BFF 只做编排、转换和权限校验,业务逻辑必须下沉到对应的限界上下文内部。
BFF 在领域边界中的位置
| 层级 | 职责 | 权限关注点 |
|---|---|---|
| 前端 | UI 渲染、用户交互 | Token 存储、请求签名 |
| BFF | 聚合、转换、权限校验 | 身份认证、角色授权、请求过滤 |
| 领域服务 | 业务逻辑、领域规则 | 内部服务间认证、数据权限 |
| 基础设施 | 数据库、消息队列、缓存 | 网络隔离、访问控制 |
2.4 领域边界权限验证的切入点
在 BFF 架构中,领域边界权限验证的核心在于:BFF 作为策略执行点(PEP),领域服务作为策略决策点(PDP)。具体切入点包括:
- 身份认证:BFF 验证用户 Token,提取用户身份信息。
- 角色授权:BFF 根据用户角色判断是否允许访问某个领域端点。
- 数据权限:领域服务内部根据用户 ID 或组织 ID 过滤数据。
- 服务间认证:BFF 与领域服务之间使用 mTLS 或 JWT 进行服务身份验证。
Go 实现提示:在 Go 中,BFF 层可以使用中间件模式实现权限校验,领域服务层则通过拦截器(gRPC Interceptor)或装饰器模式实现细粒度授权。