微服务拆分-防腐层模式 1 定义 2 上下文和问题 3 解决方案 4 优点 5 问题 6 相关模式 7 应用场景

1 定义

防腐层(Anti-Corruption Layer)模式,是一种在不同语义的子系统间构建一层功能,对子系统间的请求进行翻译适配,从而确保应用设计不受外部依赖的系统的限制。此模式最初由Eric Evans在《领域驱动设计》中提出。

2 上下文和问题

许多应用依赖于其它系统提供的数据或者功能。当直接使用外部系统的API、数据结构或者其他语义时,本应用系统就存在因使用外部系统,而被外部系统的质量问题影响,从而“腐化”本身设计的问题。比如,当一个遗留应用需要移植到新系统时,可能仍需使用现存的遗留资源,新的特性需要调用遗留系统。这种场景在大型应用随时间推移缓慢向新系统迁移过程中尤其普遍。

遗留系统通常存在API过时、数据结构复杂等质量问题;或者遗留系统使用的特性和技术与新系统存在很大的不同。为了与遗留系统交互,新应用可能需要支持过时的基础架构、数据结构、API,或者使用根本不期望在新应用中使用的特性。如果新系统强行遵守遗留系统的API或其他语义,则新系统原本简洁清晰的设计很可能被遗留系统的质量问题 “腐化”。

此外,当开发团队对接无法控制的外部系统时,也会存在类似的问题。一种可行的方法,就是在应用系统自身与外部系统之间,构筑专门一层组件或者服务,对两个系统进行通讯转换和语义隔离。这一层组件或者服务,称为“防腐层”。

3 解决方案

为解决某系统依赖其他系统功能、数据结构或者其他语义而引入“腐败”的问题,可在两个系统之间放置一个独立的层来进行隔离,防止对方系统带来的“腐败”,这一层就是“防腐层”。防腐层实现两个系统之间通讯的转换,允许一个系统保持不变,又能避免另一个系统对其设计和技术实现进行折中。

如上图所示的引入了防腐层的架构中:

  • 子系统A与防腐层之间的通讯,使用子系统A的数据模型和架构;

  • 子系统B与防腐层之间的通讯,则使用子系统B的数据模型和方法;

  • 防腐层实现了在两个系统之间进行通讯转换的全部逻辑(双向转换)。

防腐层可实现为应用中的组件,或者独立的服务。

4 优点

防腐层两方的系统解耦,隔离双方变更的影响,允许双方独立演进;防腐层允许其它的外部系统能够在不改变现有系统的领域层的前提下,与该系统实现无缝集成,从而降低系统集成的开发工作量。

5 问题

  • 防腐层可能增加两个系统间的通讯延迟;

  • 防腐层增加了额外的服务,需要管理和维护;

  • 防腐层需要考虑如何扩展;

  • 考虑是否构建多个防腐层:可能的原因比如:将防腐层的功能解耦为多个服务,各个服务使用不同技术、语言进行开发。

  • 确保维护事务和数据一致性,并且可被监控;

  • 考虑防腐层是否需要处理所有的系统间通讯,还是只需处理一个子集;

  • 如果防腐层是系统迁移战略的一部分,则需要考虑防腐层是否是永久的,是否在遗留系统功能完全迁移完成后将其移除。

6 相关模式

  • Facade API模式:

    Facade API模式关注于系统功能如何对使用者友好的呈现;而防腐层则关注于隔离不同架构系统间的影响,使各个系统可独立演进。

    在系统架构迁移场景下使用的防腐层,通常是临时存在的。当系统迁移完成后,防腐层就没有了存在的必要。而Facade API的生命周期依赖系统的外部使用者,只要外部用户存在,Facade层就应存在;如果外部用户变更,则Facade层则需要一起变更,以适配用户新的要求。

    防腐层需要提供两个系统间的数据结构转换和接口适配,因此比API Facade“胖”。而API Facade只建议简单的提供接口给用户,不建议增加较多的逻辑,它应该是“瘦”的。

  • 适配器模式:

    适配器目的是解决差异接口的对接,接口转换是单向的(即从调用方向被调用方进行接口转换);防腐层强调两个子系统语义解耦,接口转换是双向的。

7 应用场景

渐进式架构迁移,需要维护遗留系统和新系统之间的集成;具有不同语意环境和架构的两个或者多个系统,且彼此需要通讯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章