技术实质
Eric Evans:When systems based on different models are combined, the need for the new system to adapt to the semantics of the other system can lead to a corruption of the new system’s own. The underlying concept is pretty clear. When we need to “talk” with other system, data repository or legacy code (even “ours” legacy code) we should prevent our model from other “foreign models”.(网页翻译:当基于不同模型的零碎组合在一起时,新零碎须要适应其余零碎的语义,这可能导致新零碎自身的糜烂。基本概念十分分明。当咱们须要与其余零碎、数据存储库或旧代码(甚至 ” 咱们的 ” 旧代码)进行 ” 对话 ” 时,咱们应该阻止咱们的模型与其余 ” 内部模型 ” 进行对话。)
DDD 定义的反腐败层,蕴含 3 个组件:适配、转换、外观,将零碎中的一部分(DDD 称为边界上下文)与另一个边界上下文隔离开来。它的工作是确保一个边界概念中的语义不会 ” 侵蚀 ” 另一个边界概念的语义。
需要背景
假如当初要做一个领取 API 与其余零碎、信用卡、借记卡等进行通信,这些子系统中的每一个都有不同的模型,我不心愿主零碎适度依赖这些子系统。
解决方案
创立防腐层,别离解决以下问题:
- 引入转换器模式,将多个领取模型都转换为规范 API 模型
- 引入外观模式,将多个接口进行封装,对调用层提供更精简的接口,让调用者更加容易地间接应用内部零碎性能
- 引入适配者模式,将内部零碎提供的不兼容的接口,转换为适宜调用者的接口
职责
- 异样降级:对 RPC 调用可能抛出的异样捕捉,降级解决(输入异样日志、返回 empty 后果 / 抛出业务异样 errorcode);
- 超时 / 重试:对 RPC 接口的超时、重试进行对立治理
- 数据校验:对返回值的正确性、边界值进行校验,进行数据的根本进攻、业务代码边界值的解耦;
- 接口防腐:转换成 Vo 值对象(展现用的数据),防止上游接口的批改导致本身零碎的批改
引入的问题
- 防腐层能够作为外部组件实用,也能够作为一个服务独立部署;独立部署可能减少了零碎通信提早,减少性能损耗,而且须要思考高可用
- 哪些内容能够放到防腐层中,开发的的边界如何界定
- 写更多的代码,减少相应的保护老本