在微服务(Microservices)架构实践中,架构设计借用了DDD中的一些概念和技术,比如一个微服务对应DDD中的一个限界上下文(Bounded Context);在微服务设计中应该首先识别出DDD中的聚合根(Aggregate Root);还有在微服务之间集成时采用DDD中的防腐层(Anti-Corruption Layer, ACL)。
本文介绍了防腐层相关的概念和应用场景。
 
一、防腐层(Anticorruption Layer)简介
防腐层(Anticorruption Layer):一个上下文通过一些适配和转换与另一个上下文交互。
防腐层是一种在不同应用间转换的机制。创建一个防腐层,以根据客户端自己的领域模型为客户提供功能。该层通过其现有接口与另一个系统进行通信,几乎不需要对其进行任何修改。
 
在不共享相同领域模型的不同子系统之间实施防腐层(或外观或适配器层),此层转换一个子系统向另一个子系统发出的请求。 使用反腐层(Anti-corruption layer)模式可确保应用程序的设计不受限于对外部子系统的依赖。 反腐层(Anti-corruption layer)模式最先由 Eric Evans 在 Domain-Driven Design(域驱动的设计)中描述。
 
因此,防腐层隔离不仅是为了保护自身领域模型免受其他领域模型的代码的侵害,还在于分离不同的域并确保它们在将来保持分离。
 
二、防腐层应用场景
在以下情况下,可以考虑使用防腐层。
(1)旧版单体应用迁移到新版微服务系统,但是迁移计划发生在多个阶段,新旧系统之间的集成需要维护。
大多数应用程序依赖于其他系统的某些数据或功能。 例如,旧版应用程序迁移到新版应用系统时,可能仍需要现有的旧的资源,新功能必须能够调用旧系统。逐步迁移功能尤其如此,随着时间推移,较大型应用程序的不同功能迁移到新式系统中。
这些旧系统通常会出现质量问题,如复杂的数据架构或过时的 API。旧系统使用的功能和技术可能与新版微服务系统中的功能和技术有很大差异。 若要与旧系统进行互操作,新应用程序可能需要支持过时的基础结构、协议、数据模型、API、或其他不会引入新版应用程序的功能。
 
此时的解决方案是:在不同的子系统之间放置防腐层以将其隔离。此层转换两个系统之间的通信,在一个系统保持不变的情况下,使另一个系统可以避免破坏其设计和技术方法。
下图显示了新版微服务应用系统和老版单体应用直接的调用过程,在不同的系统之间放置了防腐层以将其隔离。
新旧系统都拥有自身的领域模型,防腐层包含了两个系统之间转换所必需的所有逻辑。
 
(2)两个或更多不同的子系统(或限界上下文)具有不同的领域模型,需要对外部上下文的方法进行一次转义。
两个限界上下文之间的关系方向由术语上游(UpStream)和下游(DownStream)描述。
下图是采用无防腐层的设计,图中限界上下文Statistics和OrderProcess都使用相同的领域模型。
 
下图采用有防腐层的设计,限界上下文Shipping在访问限界上下文Legacy时,使用了ACL(防腐层),这两个限界上下文都有自己独立的领域模型。
这样确保Legacy系统中的领域模型不会影响到Shipping限界上下文,Shipping系统可以在其限界上下文中实现干净的领域模型。
从上图中,我们可以看出防腐层的作用:
1)在架构层面,通过引入防腐层有效隔离限界上下文之间的耦合;
2)防腐层同时还可以扮演适配器、调停者、外观等角色;
3)防腐层往往属于下游限界上下文,用以隔绝上游限界上下文可能发生的变化;

最新文章

  1. ECMASCript2015 提案 stage-3的对象展开运算符
  2. TCP同步与异步,长连接与短连接【转载】
  3. 云南南天电子信息产业股份有限公司某站SQL注入漏洞
  4. aiku给你们最真心地学习建议--转
  5. Android源码剖析之Framwork层后记篇(硬件消息传递、apk管理、输入法框架、编译过程)
  6. 258. Add Digits
  7. SQL你必须知道的-增删改查与约束
  8. C# WCF学习笔记(二)终结点地址与WCF寻址(Endpoint Address and WCF Addressing) WCF中的传输协议
  9. hdu 1093 A+B for Input-Output Practice (V)
  10. UI/UE对个性化推荐的影响
  11. C#计算时间差。
  12. SQL Server 2008 还原数据库
  13. Sliverlight之 特效
  14. Spring Boot使用Maven打包替换资源文件占位符
  15. UVA1620-Lazy Susan(思维+逆序对)
  16. ls(ll)排序问题
  17. 第 6 章 存储 - 040 - docker managed volume
  18. PTA——念数字
  19. 实验吧—隐写术——WP之 男神一般都很低调很低调的!!
  20. C# 中奇妙的函数–String Split 和 Join

热门文章

  1. 利用nginx 来实现内网yum源(反向代理)
  2. gitlab安装CI问题汇总
  3. Django学习day11随堂笔记
  4. ECShop 文章添加缩略图功能
  5. 检验appium环境是否正常:使用appium自动给手机安装app(注意:如果已存在该app,再执行会将原来的卸载再重装,需谨慎)
  6. CF1446F-Line Distance【计算几何,树状数组,二分】
  7. CF1375F-Integer Game【交互】
  8. AT4519-[AGC032D]Rotation Sort【dp】
  9. 联表多字段update更新语句
  10. NOIP 模拟九 考试总结