服务拆分-防腐层模式

1 定义

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

2 上下文和问题

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

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

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

3 解决方案

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

防腐层.png

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

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

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

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

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

4 优点

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

5 问题

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

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

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

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

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

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

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

6 相关模式

  • Facade API模式:

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

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

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

  • 适配器模式:

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

7 应用场景

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容

  • 在上一篇文章《我们如何衡量一个微服务实施的成功》里,我们介绍了衡量一个微服务改造成功的七个特征,分别是: 很多个代...
    顾宇阅读 2,879评论 0 21
  • 文摘一:有些地方外观模式也被叫做门面模式,英文即Facade Pattern,提前说明一下。 试想这种情况,用户添...
    _浅墨_阅读 477评论 0 1
  • 微软AzureCAT模式和实践团队发布了9个新的设计模式。这9个设计模式在设计和实现微服务时很有用。 下图展示了这...
    zlup阅读 2,079评论 0 2
  • 绞杀者模式 1 定义 老系统向新系统迁移时,可采用将老系统的部分功能使用新应用或服务替换的方式逐步进行。当老系统全...
    大哥你先走阅读 2,249评论 0 0
  • 设计模式概述 在学习面向对象七大设计原则时需要注意以下几点:a) 高内聚、低耦合和单一职能的“冲突”实际上,这两者...
    彦帧阅读 3,741评论 0 14