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

2023-11-30 15:32

本文主要是介绍小小的公共库,大大的耦合,你痛过吗?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是耦合?

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

 

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

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

 

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

 

场景还原

一个看似“公共”的业务库(*.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调用的方式来解除耦合。

 

有朋友会问:

  • 底层服务接口的测试

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

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

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

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

 

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


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

 

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

这篇关于小小的公共库,大大的耦合,你痛过吗?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/437573

相关文章

poj1330(LCA最近公共祖先)

题意:求最近公共祖先 思路:之前学习了树链剖分,然后我就用树链剖分的一小部分知识就可以解这个题目了,记录每个结点的fa和depth。然后查找时,每次将depth大的结点往上走直到x = y。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring>

在二叉树中找到两个节点的最近公共祖先(基于Java)

如题  题解 public int lowestCommonAncestor(TreeNode root, int o1, int o2) {//记录遍历到的每个节点的父节点。Map<Integer, Integer> parent = new HashMap<>();Queue<TreeNode> queue = new LinkedList<>();parent.put(roo

【UVA】10066-The Twin Towers(最长公共子串问题)

赤裸裸的最长公共子串问题,没什么好说的,注意的是,每组数据后面都有一个空行。 13996019 10066 The Twin Towers Accepted C++ 0.015 2014-08-06 00:34:53 #include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using

计算两个字符串的最大公共字符串的长度,字符不区分大小写

/*** */package testString;import java.util.Scanner;/***@author: Administrator*@date: 2016-12-28 下午01:08:30*/public class Main {public static void main(String[] args){Scanner sc=new Scanner(Syste

Python高效计算两个字符串的最长公共子序列

Python高效计算两个字符串的最长公共子序列 在Python面试中,考官通常会关注候选人的编程能力、问题解决能力以及对Python语言特性的理解。计算两个字符串的最长公共子序列(Longest Common Subsequence, LCS)是一个经典的动态规划问题,广泛应用于文本比较、DNA序列分析等领域。本文将详细介绍如何编写一个函数,计算两个字符串的最长公共子序列,确保代码实用性强,条理

NAT技术-将多个内部网络设备映射到一个公共IP地址

问题: 今天上课的时候老师让我们在VMware填同一个子网ip 192.168.196.0,然后给我们的linux镜像都是同一个压缩包,结果我们的静态ip地址都是同一个。 192.168.196.0下面有256个ip地址,范围是192.168.196.0到192.168.196.255。我们几十个人的ip地址怎么会是同一个 linux镜像的ip地址被老师写死了, 1.难道内网的ip可以随便定

第八届蓝桥杯 最大公共子串(动态规划)

标题:最大公共子串 最大公共子串长度问题就是: 求两个串的所有子串中能够匹配上的最大长度是多少。 比如:"abcdkkk" 和 "baabcdadabc", 可以找到的最长的公共子串是"abcd",所以最大公共子串长度为4。 下面的程序是采用矩阵法进行求解的,这对串的规模不大的情况还是比较有效的解法。 请分析该解法的思路,并补全划线部分缺失的代码。 #include <stdio.h

CI 添加公共函数 全局函数 自定义函数

CodeIgniter 中公共函数可以通过 helper 辅助函数实现。 创建 common_helper.php 文件,定义所需公共函数,存放至 application/helpers 目录中。 在 application/config/autoload.php 中配置 $autoload[‘helper’] = array(‘common’); 即可。

file | 某文件夹【解耦合】下的文件查找功能实现及功能单元测试

文件查找工具 概要思路OS模块 --- 学习版os.getcwd()os.path.dirname(os.getcwd())os.path.dirname() 和 os.path.basename() OS模块 — 实战版单元测试解耦合 概要 梳理业务主逻辑: 查看存放被采集JSON数据的文件夹内的文件列表【所有 包含文件夹下的文件夹下的文件】 这是本节内容聚焦的点和My

探索C++编程技巧:计算两个字符串的最长公共子串

探索C++编程技巧:计算两个字符串的最长公共子串 在C++面试中,考官通常会关注候选人的编程能力、问题解决能力以及对C++语言特性的理解。一个常见且经典的问题是计算两个字符串的最长公共子串(Longest Common Substring, LCS)。本文将详细介绍如何编写一个函数来解决这个问题,并深入探讨相关的编程技巧和优化方法。 目录 引言问题描述解决思路实现步骤 基础实现动态规划优化代