小小的公共库,大大的耦合,你痛过吗?

什么是耦合?

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

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

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

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

场景还原

一个看似“公共”的业务库(*.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吼道“还想甩锅,拖出去祭天”

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

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

如何解除公共库耦合?

方案一:代码拷贝一份

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

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

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

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

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

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

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

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

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

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

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

  • 每次修改底层接口,需要测试接口的兼容性,保证不影响旧调用方
  • 如果是新的业务,则建议新增接口

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

有朋友会问:

  • 底层服务接口的测试
  • 上游业务层对公共库的测试

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

  • 底层接口,所有人调用,接口没问题则调用方都没问题
  • 上游业务层对公共库测试,只能保证自己的业务没有问题,并不能保证其他业务方没有问题

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

原文发布于微信公众号 - 架构师之路(road5858)

原文发表时间:2017-11-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏祝威廉

ChatBot framework 开发实践

通常而言,通用聊天机器人(比如小冰等)底层技术是采用类似Seq2Seq等“生成”技术的。但是这种机器人属于探索性质,无法 提供特定的服务。而Siri则是兼具闲...

15830
来自专栏数据猿

对象存储来势汹汹,究竟谁是“幕后推手”?

存储圈真会玩,继网络接入存储、块存储、文件存储之后,对象存储也掀起了新一轮发展浪潮。银行、保险、交通集团等传统企业纷纷换上了对象存储,真怀疑IT部门的单身狗只是...

45550
来自专栏python学习指南

计算机系统结构——01结论

1.1 计算机系统的层次结构 从使用语言的角度,一台由软、硬件组成的通用计算机系统可以被看成是按功能划分的多层机器级组成的层次结构。具体的计算机系统,其层次数的...

26480
来自专栏全华班

二代蜘蛛侠

爬虫程序, 二代蜘蛛侠,此版本完全重新开发,比上一代更加强大(性能,易用,架构,分布式,简洁,成熟)

19930
来自专栏java一日一条

为什么开源可以提高程序员的编程技能?

我已经写了很多年的软件。最近我意识到,我越涉及(致力于,结合于等)开源技术,我写出来的代码就更好。这不由地让我疑惑起来:难道里面有什么相关性或因果关系吗?

10730
来自专栏牛客网

百度测试开发实习生一面面经

32150
来自专栏Cloud Native - 产品级敏捷

敏捷开发下, 如何将需求分析,架构(软件)设计,开发与测试,一气呵成式的结合且高效的完成 ?

产品开发中,时常会发生类似如图中 “削马铃薯”的悲剧。 悲剧的发生,往往是由于我们只传递了 “要作什么功能”给开发人员。却缺乏了一个有效的且轻量级的实践,能在正...

33790
来自专栏编程

浅谈CPU 并行编程和 GPU 并行编程的区别

CPU 的并行编程技术,也是高性能计算中的热点,那么它和 GPU 并行编程有何区别呢? 本文将做出详细的对比,分析各自的特点,为深入学习 CPU 并行编程技术打...

20580
来自专栏马洪彪

C#.Net与MATLAB集成

在数学分析工具方面,MATLAB无疑是佼佼者,除了作为软件工具外,MATLAB的自定义编程语言以及混合编程的支持,使其可以与Python、R之类数学分析语言媲美...

33370
来自专栏领域驱动设计DDD实战进阶

DDD实战进阶第一波(十五):开发一般业务的大健康行业直销系统(总结篇)

22730

扫码关注云+社区

领取腾讯云代金券