在微服务(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)防腐层往往属于下游限界上下文,用以隔绝上游限界上下文可能发生的变化;

DDD领域驱动设计架构模式:防腐层(Anti-corruption layer)的更多相关文章

  1. 关于DDD领域驱动设计的理论知识收集汇总

    原文:关于DDD领域驱动设计的理论知识收集汇总 最近一直在学习领域驱动设计(DDD)的理论知识,从网上搜集了一些个人认为比较有价值的东西,贴出来和大家分享一下: 我一直觉得不要盲目相信权威,比如不能一 ...

  2. DDD领域驱动设计-概述-Ⅰ

     如果我看得更远,那是因为我站在巨人的肩膀上.(If I have seen further it is by standing on ye shoulder of Giants.)         ...

  3. DDD领域驱动设计-项目包结构说明-Ⅳ

     基于DDD领域驱动设计的思想,在开发具体系统时,需要先建立不同的层级包.主要是梳理不同层面(应用层,领域层,基础设施层,展示层)包括的功能目录,每一个层面应该包括哪些模块.本例所讲述的分层是DDD落 ...

  4. DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(2)

    上一篇:<DDD 领域驱动设计-谈谈 Repository.IUnitOfWork 和 IDbContext 的实践(1)> 阅读目录: 抽离 IRepository 并改造 Reposi ...

  5. C#进阶系列——DDD领域驱动设计初探(一):聚合

    前言:又有差不多半个月没写点什么了,感觉这样很对不起自己似的.今天看到一篇博文里面写道:越是忙人越有时间写博客.呵呵,似乎有点道理,博主为了证明自己也是忙人,这不就来学习下DDD这么一个听上去高大上的 ...

  6. C#进阶系列——DDD领域驱动设计初探(二):仓储Repository(上)

    前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repository,为什么Repository会有这么大的争议,博主认为主要原 ...

  7. C#进阶系列——DDD领域驱动设计初探(三):仓储Repository(下)

    前言:上篇介绍了下仓储的代码架构示例以及简单分析了仓储了使用优势.本章还是继续来完善下仓储的设计.上章说了,仓储的最主要作用的分离领域层和具体的技术架构,使得领域层更加专注领域逻辑.那么涉及到具体的实 ...

  8. DDD领域驱动设计和实践(转载)

    -->目录导航 一. DDD领域驱动设计介绍 1. 什么是领域驱动设计(DDD) 2. 领域驱动设计的特点 3. 如果不使用DDD? 4. 领域驱动设计的分层架构和构成要素 5. 事务脚本和领域 ...

  9. DDD领域驱动设计仓储Repository

    DDD领域驱动设计初探(二):仓储Repository(上) 前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repositor ...

随机推荐

  1. Math.round真的是四舍五入吗?我不这么认为

    public static long round(double a) 返回最接近参数的 long.结果将舍入为整数:加上 1/2,对结果调用 floor 并将所得结果强制转换为 long 类型.换句话 ...

  2. AS插件快速生成javabean

    https://blog.csdn.net/u010227042/article/details/103803198

  3. 5UCMS判断当前栏目高亮(用于当前所在栏目加背景图片或颜色)

    5UCMS判断当前栏目高亮标签 比较简单的是频道页(channel.html): 大类代码: <!--menu:{ $row=10 $table=channel }--> <li { ...

  4. Java基础系列(15)- 用户交互Scanner

    Scanner对象 之前我们学的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入.java.util.Scanner是Java5的新特征.我们可以 ...

  5. Linux系列(23) - echo

    作用:打印 格式:echo [选项] [输出内容] 选项:-e :支持反斜线控制的字符转换 前置条件:必须加选项-e才能使用 控制字符 作用 \a 输出警告音 \b 退格符,也就是向左删除键 \n 换 ...

  6. 华为云计算IE面试笔记-桌面云中的用户组、虚拟机模板、模板虚拟机、虚拟机组和桌面组的关系及区别。发放完整复制和链接克隆虚拟机时,步骤有什么区别,要怎么选择桌面组?

    概念解释: 模板虚拟机:FC上创建的裸虚拟机,用于制作不同类型的虚拟机模板. 虚拟机模板:用于创建虚拟机的模板,对裸虚拟机(模板虚拟机)进行配置或自定义安装软件后,转为模板.虚拟机模板类型有完整复制, ...

  7. 『GoLang』数组与切片

    数组 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列(这是一种同构的数据结构):这种类型可以是任意的原始类型例如整型.字符串或者自定义类型. 数组长度必须是一个常量表达式,并且必须是一个非负 ...

  8. [转载]linux环境变量设置方法总结(PATH/LD_LIBRARY_PATH)

    http://blog.chinaunix.net/uid-354915-id-3568853.html PATH:  可执行程序的查找路径查看当前环境变量:echo $PATH设置: 方法一:exp ...

  9. Dockerfile 的常用参数注解和范例

    一. docker hello world 1.1 Dockerfile FROM centos:7.5.1804 MAINTAINER 11@qq.com CMD echo "hello ...

  10. P5934-[清华集训2012]最小生成树【最小割】

    正题 题目链接:https://www.luogu.com.cn/problem/P5934 题目大意 给出\(n\)个点\(m\)条边的一张图,再加入一条边\((u,v,L)\)求至少删掉多少条边可 ...