【转载】小小的公共库,大大的耦合,你痛过吗?

【转载】小小的公共库,大大的耦合,你痛过吗?

什么是耦合?

耦合,是架构中,本来不相干的代码、模块、服务、系统因为某些原因联系在一起,各自独立性差,影响则相互影响,变动则相互变动的一种架构状态。

感官上,怎么发现系统中的耦合?

作为技术人,每每在心中骂上下游,骂兄弟部门,“这个东西跟我有什么关系?为什么需要我来配合做这个事情?”。明明不应该联动,却要被动受影响,就可能有潜在的耦合。

因为公共库,导致相互受影响,就是一个耦合的典型案例。

场景还原

一个看似“公共”的业务库(*.so *.jar *.dll *.php),很多业务系统都依赖于这个公共库,这个库使得这些系统都耦合在了一起。

注:这里的公共库不是指像“字符串操作”这样的不变化的工具库,更多是指通用业务的公共库。

耦合如何导致相互影响?

业务1,业务2,业务3都依赖于某一个biz.jar,业务1因为某个需求需要升级biz.jar。上线前,业务1的QA进行了大量的测试,确保无误后,代码发布,发布完线上验证无误后,上线完成,闪人。

突然,bug群里有人反馈,业务2的系统挂了,业务3的系统也挂了,一下炸开了锅:

  • 业务2的大boss首先发飙:“技术都干啥了,怎么系统挂了”

  • 业务2的rd一脸无辜:“业务1上线了,所以我们挂了”

额,然而,这个理由,好像在大boss那解释不通…

  • 业务2的大boss:“业务1上线?业务1上线前测试了么”

  • 业务1的qa自信满满:“测试了呀,上线前上线后都验证了,没问题呀”

  • 业务2的大boss对业务2的rd吼道“还想甩锅,拖出去祭天”

0490188453afd1773b1a0cbf5870f9f3

不知道大家工作中会不会遇到这样的场景,因为公共库的耦合,兄弟部门上线,影响的确是你,此时你心里可能就在骂娘了,这帮不靠谱的**队友。

特别的,如果公共库的使用方很广,这个耦合很严重,可能影响很大的范围。

如何解除公共库耦合?

方案一:代码拷贝一份

别嘲笑这个方案,谁敢说自己写代码的时候没这么干过?

我们都知道这不是一个好的方案,但不可否认,拷贝之后,代码各自演化,一个地方升级出错,只影响一方,拷贝方只要不动原有代码,至少是不会受影响的。

代码拷贝缺点很多,系统拆分时,万不得已不要使用这个方案。

方案二:垂直拆分,将公共库里业务个性化的代码拆到调用方去,不要放在公共库里

0ef4ebb1b8abb072fff73c5878a04c57

需要把业务个性的代码拆分到各个业务线自己的工程,自己的业务库里去,例如s1.jar / s2.jar / s3.jar,修改各自的代码,至少不会扩大影响范围。

大家为什么都把代码往一个公共库里塞?

很多时候,因为惰性,一点一点的惰性,日积月累,终成大坑。

这个垂直拆分是一个架构重构的过程,需要各业务方配合。

方案三:服务化,将公共库里通用业务代码拆到下层去

ac690839ee367bd7636e32a0c4adff7e

完成了第一步,业务个性化的代码提取到业务侧上游。

接下来是第二步,业务通用的代码,下沉抽取一层服务,服务对上游提供RPC接口:

  • 每次修改底层接口,需要测试接口的兼容性,保证不影响旧调用方

  • 如果是新的业务,则建议新增接口

最终,达到通过服务RPC调用的方式来解除耦合。

有朋友会问:

  • 底层服务接口的测试

  • 上游业务层对公共库的测试

都是测试,为何前者能控制影响范围呢?

  • 底层接口,所有人调用,接口没问题则调用方都没问题

  • 上游业务层对公共库测试,只能保证自己的业务没有问题,并不能保证其他业务方没有问题

个性业务代码上浮,共性业务代码服务化下沉,只是一个很小的优化点,但对于公共库解耦却是非常的有效。

希望大家每天收获一点点,这样架构就能美好一点点。

别人上线,你的系统挂了,痛过吗?那帮转下。

 

【转自】58沈剑 架构师之路

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119332.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • uat测试环境是预生产环境_php开发环境与测试环境

    uat测试环境是预生产环境_php开发环境与测试环境开发环境:开发环境是程序猿们专门用于开发的服务器,配置可以比较随意,为了开发调试方便,一般打开全部错误报告。测试环境:一般是克隆一份生产环境的配置,一个程序在测试环境工作不正常,那么肯定不能把它发布到生产机上。生产环境:是指正式提供对外服务的,一般会关掉错误报告,打开错误日志。可以理解为包含所有的功能的环境,任何项目所使用的环境都以这个为基础,然后根据客户的个性化需求来做调整或者

    2022年9月30日
  • Java刷新bean重新加载bean 上下文 刷新bean

    Java刷新bean重新加载bean 上下文 刷新bean@Autowiredprivate ApplicationContext applicationContext;// 可以为接口或者业务方法被调用public void reloadInstance(){ //获取上下文 DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory)applicationContext.getAutowireCapableBeanFactory();

    2022年8月19日
  • nginx实现负载均衡配置_nginx负载性能

    nginx实现负载均衡配置_nginx负载性能nginxnginx的安装下载nginx安装包并解压tarzxfnginx-1.14.0.tar.gz对nginx源码文件进行修改,隐藏版本号cd/root/nginx-1.14.0/src/core/vimnginx.h14#defineNGINX_VER"nginx/"#不显示版本号cd/root/nginx-1….

    2022年8月24日
  • 如何删除grub引导_grub进入bios

    如何删除grub引导_grub进入biosmanlspci

    2022年9月9日
  • css3中的width:100vh以及calc(100vh + 10px)

    css3中的width:100vh以及calc(100vh + 10px)vh/vwvh:相对于视窗的高度,视窗被均分为100单位的vh;vw:相对于视窗的宽度,视窗被均分为100单位的vw;vmax:相对于视窗的宽度或高度中较大的那个。其中最大的那个被均分为100单位的vmax;vmin:相对于视窗的宽度或高度中较小的那个。其中最小的那个被均分为100单位的vmin;视区所指为浏览器内部的可视区域大小,即window.innerWidth/window.innerHeight大小,不包含任务栏标题栏以及底部工具栏的浏览器区域大小。calccalc是英

    2022年4月29日
  • hanoi塔问题如下图所示_hanoi塔问题最经典的算法

    hanoi塔问题如下图所示_hanoi塔问题最经典的算法什么是hanoi塔?汉诺塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。如下图问题解答问题定义我们把左边的柱子叫做A,中间的柱子叫做B,右边的柱子叫做Chanoi塔的搬运过程;i

    2022年10月25日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号