限界上下文的集成包含:远程过程调用 消息机制 rest机制 等主流集成方式
限界上下文的集成主要包含主机开放服务 防腐层
开放主机服务:当一个限界上下文以URI形式提供了大量的rest资源 比如说在springcloud中为当前限界上下文提供的领域接口
防腐层: 不同于分层架构中的应用层 领域层 基础设施层 interface层
防腐层针对的是不同上下文之间的交互:
获取上游上下文的对象服务接口CollaboratorService设置于领域层
其实现往往设计技术实现:比如feign等,所以我们将其实现设计于分层架构中的基础设施层[体现依赖倒置,面向抽象编程]
防腐层入参为上游的对象,出参为当前限界上下文的对象
防腐层接口
由文中的上下文映射图可知 防腐层广义上实际上是两个上下文交互的一系列代码实现的总称 包含领域服务接口,适配器,技术实现如feign ,翻译层等等 ,侠义上可以更加关注于翻译层
按微服务举列如下:
支付上下文需要获取订单上下文的订单信息进行支付
涉及两个微服务/限界上下文
订单上下文
支付上下文
com.order.domain.OrderInfo 订单领域核心对象
com.pay.domain.PayInfo 支付领域对象
OrderInfo 包含如下
@Data
public class OrderInfo{
private Long id;
private Double money;
...
}
com.order.interface.OrderInfoController.getOrderInfoById(Long id);
public class OrderInfoController{
@GetMapping("/id")
public OrderInfo getOrderInfoById(Long id){
...
return new OrderInfo(id);
}
下游上下文需要访问订单信息进行支付[只关注怎么获取上游支付金额]
领域服务
com.pay.domain.model.PayInfo
com.pay.domain.service.OrderService【这是个领域服务而非应用服务】
基础设施服务
com.pay.infrastructure.service.OrderServiceImpl
com.pay.infrastructure.service.OrderToPayTranslator[翻译层]、
com.pay.infrastructure.feigns.OrderInfoFeign
应用层 PayInfoApplication
com.pay.application.PayInfoApplication
接下来我们假设用户发起支付业务
由接口层进入应用层 用户入参为订单id
public class PayInfoApplication {
@Autowird
pricate OrderService orderService;
payOrder(Long id){
// 支付上下文与订单上下文集成
PayInfo payinfo = orderService.getOrder(id);
payinfo.dobiz(); // 领域层执行相关业务
// 最后交给持久化接口持久化
com.pay.domain.repository.PayRes.save(payInfo);// 交给基础设施层实现存储,例如mybatis-plus,jedis等
}
}
/**
PayInfo payinfo = orderService.getOrder(id);
OrderService在基础设施层的实现如下OrderServiceImpl
主要负责上下文交互的技术实现 以及上下文对象的转化也就是翻译层
*/
public classOrderServiceImpl{
@Autowired private OrderInfoFeign feign
PayInfo getOrder(Long id){
OrderInfo orderInfo = feign.getOrderInfoById(id);
PayInfo pay = OrderToPayTranslator.transfer(orderInfo); // 由于只是做对象的转化 所以个人倾向使用静态方法
return pay;
}
}