防腐层是如何工作的?

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

3facfa0476ec7300653cd812544aa39b.png

这是Yasin的第 69 篇原创文章

2bfba56bc7530b4ee9064e0c60e81f67.png

网关

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

南向和北向

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

防腐层的作用

防腐层服务

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

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

5584db74b61d7c11209c281a65b4b33b.png
^微服务中的防腐层^

防腐层代码

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

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

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

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

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

20110a04f35de1a3b79f474109cf7417.png

防腐层如何写

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

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

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

防腐的利与弊

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

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

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

676cae9f4743bdbfee7a2bd093634eca.png

关于作者

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

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

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

欢迎关注这个公众号3afa002884b58e2d583852ad7d5cc643.png

eeb6e7bc94147283c3f7da7af19f8b66.png

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
高可用性 (HA)集 群实现不 间断应用 2006-02-24 09:32:01 高可用性(HA)集群通过一组计算机系统提供透明的冗余处 理能力,从而实现不间断应用的目标。 高可用性(High Availability,简称 HA)集群是共同为客户机 提供网络资源的一组计算机系统 。其中每一台提供服务的计算机称为节点(Node)。当一个 节点不可用或者不能处理客户的请求时,该请求会及时转到另外 的可用节点来处理,而这些对于客户端是透明的,客户不必关心 要使用资源的具体位置,集群系统会自动完成。 HA 集群系统硬件拓扑形式 基于共享磁盘的 HA 集群系统通过共享盘柜实现集群中各节 点的数据共享,包含主服务器、从服务器、存储阵列三种主要设 备,以及设备间的心跳连接线。 而基于磁盘镜像的 HA 集群系统不包含存储阵列。集群中两 种服务器的本地硬盘通过数据镜像技术,实现集群中各节点之间 的数据同步,从而实现集群的功能。 实际应用中,将节点 1 配置成"主服务器",节点 2 配置成"从 服务器",主从服务器有各自的 IP 地址,通过 HA 集群软件控制, 主从服务器有一个共同的虚拟 IP 地址,客户端仅需使用这个虚拟 IP,而不需要分别使用主从 IP 地址。这种措施是 HA 集群的首要 技术保证,该技术确保集群服务的切换不会影响客户 IP 的访问。 3、管路敷设技术 通1过管线0不仅2222可以解决吊顶配置不规范高中资料试卷问题22,而且可保障2323各类管路习题到位。在管路敷设过程1中,要加强看255222护1关于管路高中资料试卷连接管口处理高中资料试卷弯扁度固定盒位置.保护防腐跨接地线弯曲半径标高等,要求技术交底。管线敷设技术中包含线槽、管架等多项方式,为解决高中语文电气课件中管壁薄、接口不严等问题,合理利用管线敷设技术。线缆敷设原则:在分线盒处,当不同电压回路交叉时,应采用金属隔板进行隔开处理;同一线槽内,强电回路须同时切断习题电源,线缆敷设完毕,要进行检查和检测处理。 4、电气课件中调试技术 对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料试卷相互作用与相互关系,根据生产工艺高中资料试卷要求,对电气设备进行空载与带负荷下高中资料试卷调控试验;对设备进行调整使其在正常工况下与过度工作下都可以正常工作;对于继电保护进行整核对定值,审核与校对图纸,编写复杂设备与装置高中资料试卷调试方案,编写重要设备高中资料试卷试验方案以及系统启动方案;对整套启动过程中高中资料试卷电气设备进行调试工作并且进行过关运行高中资料试卷技术指导。对于调试过程中高中资料试卷技术问题,作为调试人员,需要在事前掌握图纸资料、设备制造厂家出具高中资料试卷试验报告与相关技术资料,并且了解现场设备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。 5、电气设备调试高中资料试卷技术 电力保护装置调试技术,电力保护高中资料试卷配置技术是指机组在进行继电保护高中资料试卷总体配置时,需要在最大限度内来确保机组高中资料试卷安全,并且尽可能地缩小故障高中资料试卷破坏范围,或者对某些异常高中资料试卷工况进行自动处理,尤其要避免错误高中资料试卷保护装置动作,并且拒绝动作,来避免不必要高中资料试卷突然停机。因此,电力高中资料试卷保护装置调试技术,要求电力保护装置做到准确灵活。对于差动保护装置高中资料试卷调试技术是指发电机一变压器组在发生内部故障时,需要进行外部电源高中资料试卷切除从而采用高中资料试卷主要保护装置。 公网(Public Network)是应用系统实际提供服务的网络,私 网(Private Network)是集群系统内部通过心跳线连接成的网络。 心跳线是 HA 集群系统中主从节点通信的物理通道,通过 HA 集群软件控制确保服务数据和状态同步。不同 HA 集群软件对于 心跳线的处理有各自的技巧,有的采用专用板卡和专用的连接线, 有的采用串并口或 USB 口处理,有的采用 TCP/IP 网络处理,其 可靠性和成本都有所不同。近几年,基于 TCP/IP 技术的心跳线 因其成本低、性能优异而被广泛采用。具体实现中主从服务器上 至少各需配置两块网卡。 HA 集群软件体系结构 HA 集群软件是架构在操作系统之上的程序,其主要由守护进 程、应用程序代理、管理工具、开发脚本等四部分构成,应用服 务系统是为客户服务的应用系统程序,比如 MS SQL Server,Oracle,Sybase,DB2 UDB,Exchange,Lotus Notes 等应用系统软件。 不是每一个应用程序都能够实现 HA 集群管理,也不是每一 个 HA 集群软件可以管理所有的应用程序,这是因为其
在使用Java实现防腐代码时,可以采取以下几种方法: 1. 接口隔离:将与外部依赖相关的接口定义在一个独立的模块或包中,然后在应用程序中使用该接口。这样可以将与外部依赖的代码隔离开来,并降低对外部依赖的直接耦合。 2. 适配器模式:使用适配器模式将外部依赖转换成应用程序需要的形式。通过创建适配器类,将外部依赖的接口适配成应用程序期望的接口形式,从而实现防腐代码。 3. 代理模式:使用代理类来包装外部依赖,以实现对外部依赖的访问控制。代理类可以对外部依赖的方法进行包装,并添加额外的逻辑,如错误处理、重试机制等。 4. 延迟加载:当应用程序需要使用外部依赖时,不立即加载所有的外部依赖,而是在需要使用的时候再进行加载。通过延迟加载,可以减少对外部依赖的直接调用,从而降低对外部依赖的耦合。 5. 接口适配:当应用程序需要与多个外部依赖进行交互时,可以引入一个通用的接口,并针对每个外部依赖实现适配类。这样可以在不改动应用程序逻辑的情况下,根据需求切换不同的外部依赖。 以上是几种实现防腐代码的常用方法,可以根据具体的项目需求和架构设计选择合适的方式进行实现。通过防腐代码的应用,可以有效隔离外部依赖,提高系统的稳定性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值