点击↑上方↑蓝色“编了个程”关注我~

这是Yasin的第 69 篇原创文章

网关

在领域驱动设计中,有好几种推荐的架构(感兴趣的可以去我的个人网站看这篇文章《DDD之代码架构》)。但他们都有一个共同的特点:最外层都是网关(也有的叫适配器)。

南向和北向

对于网关来说,其实是分为南向和北向的。按照上北下南的概念,北向网关对应输入,南向网关应对输出。举例来说,一个服务提供的controller接口、消息队列监听接口、RPC接口等,都是北向网关,用来接受、监听其它请求进来的;而一个服务调用下游的DB、MQ producer、其它服务的http、RPC接口等,都是南向网关。

防腐层的作用

防腐层服务

防腐层这个概念最开始来源于DDD,后来也被用于微服务的架构中。顾名思义,防腐层的主要作用是“防止架构腐烂”。熵增原理在软件领域也是同样适用的,随着不断地迭代,代码和架构总会趋向于混乱。所以需要专门为这种可能变化的未来提前做出考虑,增加一层防腐。

在微服务中,防腐层指的是单独抽一个服务来做防腐,主要用于系统迁移等场景。而在DDD中,防腐层其实也可以叫“适配层”,是用来隔离上下游依赖的。

^微服务中的防腐层^

防腐层代码

除了作为单独的一个服务外,每个微服务也应该有属于自己的防腐层代码。

在大型团队,会拆分非常多的微服务。出于业务发展或者架构升级等种种原因,很有可能某些服务、某些接口会在某个时间进行升级。这个时候一般的做法就是找到上下游依赖,然后通知他们使用新的接口。

但这带来了一个问题:如果某个上游服务在代码中大量的地方调用了这个接口,改造成本就会变得非常大,而且这种系统间的改造比较难测试,风险很高。这个时候如果上游服务在调用之前有一层自己的适配层,那他只需要改一下适配层的代码就可以了。

而如果推不动上游服务改造,那在自己的服务内部去适配也是可以的,这也算是北向网关自己的一层适配,只不过这种做法不是很推荐,不利于自己后期迭代。

比较推荐的实践是:所有南向网关都要尽量做适配,尤其是调用外部接口;所有北向网关都尽量简单,不做适配,由上游自己去适配。

防腐层如何写

防腐层的代码一般会应用「适配器模式」。一般其它微服务暴露出来的接口,都会以SDK的形式提供给其它微服务使用,这些服务一般会叫xxService、xxClient。而防腐层代码是在此基础上包装一层,一般会叫xxWapper、xxAdapter。其中Request和Response也会包一下。但自己重新定义一个类的工作量比较大,所以一般会用继承或者组合的方式直接复用原本的结构体,等有必要覆盖字段的时候,才在此基础上定义一个新的字段,然后转移到新的字段上面去。

举个例子,原有的response里面有一个字段叫id。突然某一天,上游弃用了这个字段,改成了projectId,其业务含义与原有的id一致。如果没有防腐层,那所有使用了这个response的地方,都要修改代码。而如果有了防腐层,可以在防腐的response里面重写getId方法,返回父类的projectId就可以了,业务代码中无需任何改动。

除此之外,也可以自己定义自己需要的结构体,使用「mapStruct」等工具来自动转换数据。

防腐的利与弊

写防腐层也是有代价的。最大的代价就是有「额外的开发成本」。所以如果你的上下游比较少,且比较稳定,其实是可以不用防腐层的。

而在大型团队,付出这些额外的开发成本是有价值的,因为大型团队的上下游关系非常复杂,他们可能不是在一个团队,也有可能经常进行迭代升级,通过我自己的经验来看,接口变化是经常会发生的。

虽然我们倡导不要修改原有的接口,不要修改字段名、方法名等。但也偶尔会发现,之前设计的有些东西并不合理,不利于长期维护。如果我们基于新的模型设计出v2的接口,而又要维护原本的v1接口,维护成本会增加。所以一般会推之前使用了v1接口的上游切换到v2,然后下线v1接口。这个时候调用方有防腐层就非常重要了,可以减少改动成本。

关于作者

我是Yasin,一个爱写博客的技术人

微信公众号:编了个程(blgcheng)

个人网站:https://yasinshaw.com

欢迎关注这个公众号

防腐层是如何工作的?相关推荐

  1. controller层没反应_埋地管道防腐层探测检漏仪FJ-10地下管线探测仪的说明及应用...

    近年来随着西气东输.俄气南供.陕京复线等重大工程的实施,我国油气管道干线联网的雏形已经形成.早期兴建的输油管线.天然气管线以及各油田内部的集输管线,已经到了运行寿命的中后期,不少管线已因腐蚀发生穿孔, ...

  2. 软件智能:aaas系统中AI的任务能力和工作

    概要(内容概述) <同一> 将设计目标确定为"软件智能"的aaas中,AI的任务和AI能力的工作原理大致如下: 不断思索抽象理论和现实世界之间的不可避免的不匹配的问题( ...

  3. 市政管道修复的检查工作有哪些

    市政管道修复的检查工作,如下: 1.管道防腐检查 日常的防腐检查有定期测试管道沿线的保护电位,可以用防腐层检测仪在地面上检查管道防腐层的完好性,发现管道维修出现破损,及时挖开修补,做好市政管道修复工作 ...

  4. linux操作系统适合作网络服务器的基本平台工作,WindowsNT和UNIX或Linux操作系统均适合作网络服务器的基本平台工作。()...

    WindowsNT和UNIX或Linux操作系统均适合作网络服务器的基本平台工作.() 更多相关问题 [单选] 血液透析患者在透析间期体重增长建议不超过干体重的() [单选] 放沥青热油时,操作人员应 ...

  5. 工作如果没有方法,光靠苦力是不行的

    在职场中,如果你已经升职为一个管理者了,有时候光靠苦力是不行的,还要认真读点在工作上能有用到的书,才能增加知识,开通思路,增长才能. 在平时也要发奋读现在或将来能用到的书,抓紧点滴时间.一个管理者的才 ...

  6. 外包工作经历暨2021年终总结

    公司:太极-慧点科技 时间:2021/3/24~2021/6/7 项目:工商联/经济日报社OA项目 技术点: 前端:VUE封装组件 后端:Springboot.Spring Data Jpa Jenk ...

  7. Java学到什么水平能够出去找工作!

    Java学到什么水平能够出去找工作!搞定这些技术吧! 1.JavaSE内容 环境搭建,基础语法,面向对象,数组,集合,常用API,IO流,反射机制,多线程,网络编程 要求: 利用这些基础知识,写出一个 ...

  8. 广泛的信号处理链如何让语音助理“正常工作”

    广泛的信号处理链如何让语音助理"正常工作" How extensive signal processing chains make voice assistants 'just w ...

  9. GPU—加速数据科学工作流程

    GPU-加速数据科学工作流程 GPU-ACCELERATE YOUR DATA SCIENCE WORKFLOWS 传统上,数据科学工作流程是缓慢而繁琐的,依赖于cpu来加载.过滤和操作数据,训练和部 ...

最新文章

  1. 检查Bash数组是否包含值
  2. Vue.js 生产环境部署
  3. Python的集合set
  4. php随机获取文件夹,php从文件夹随机读取文件的方法
  5. Java基础之this关键字和super关键字区别
  6. ASP.NET MVC 在WebService中Token的使用方法
  7. 什么是Vue?为什么要学习Vue?如何使用Vue?
  8. linux文件被覆盖如何恢复_在Linux下误删文件后恢复
  9. 清华大学出版社-图书详情-《深度学习:语音识别技术实践》
  10. 系列文章--SharePoint 2013 开发教程
  11. 3dmax模型在web端
  12. session json()中文乱码_[Win] FTP传输工具 FlashFxp v5.4.0 build3970 中文便携版
  13. ESXI安装部署方法
  14. 谷歌浏览器崩溃,无法搜索
  15. Vue插件element-ui安装时报错error An unexpected error occurred: “https://registry.npmjs.org/element-ui: conn
  16. 东北大学第二场算法题解报告
  17. 实现财务自由 之 美股上市公司的年报(年度财报)(国内外公司年报20-F,10-k)查阅、下载、以及 翻译中文查阅、下载的方法
  18. springboot在Gradle7以上版本不识别compile解决方案
  19. BIM+GIS技术融合发展 成为工程规划建设新热点
  20. 基于java的五子棋游戏的设计_基于Java的五子棋游戏的设计

热门文章

  1. Python-读取PDF文件显示在窗口上-Pdf阅读器
  2. html5课程总结500字,学习心得体会模板范文500字
  3. 高绩效成功人士的特质
  4. 10分钟了解代码命名规范(Java、Python)
  5. 我们如何才能打造个人品牌?
  6. 东莞1号线大朗站—湿地公园站右线盾构始发
  7. Android2018年必须知道的史上最全框架、最全开源App(高级开发人员必看,面试必看)
  8. 赚了!用Python兼职,月赚49K!
  9. 学习python爬虫一个月的小兄弟,是如何日赚800实现经济独立的
  10. 用python怎么赚钱-Python躺赚大法!月入1W外快不在话下!!