大部分主流编程语言都诞生于上个世纪,代码包的分发范围在当时仅限于小规模的团体,例如公司内部或者单个软件项目内部,这种分发规模 只要内部有良好的代码约定就不会致使模块依赖冲突,但今天咱们已经普遍运用github社区来分发软件代码包,分发的规模已经跨越国界跟种族以及不一样的语言,这在当时是没法想象的。python
例如现现在依然很是流行的C语言,就存在经典的函数命名冲突的问题,在小规模团体内部能够经过约定函数命名前缀来避免编译时的冲突。C++在后续引入了命名空间解决了这一问题git
C++编译器版本众多,又有不少公司或者团体采用二进制闭源发布代码,又致使了二进制ABI依赖问题, 在今天你依旧能够看到golang swift这些新兴的编译型的语言都是依赖源码编译的,由于它们大多各自语言的各个版本之间的并非二进制兼容的,例如X86 就有fastcall stdcall 等等函数调用约定,以前我翻了一下golang的内部实现,发现go语言在内部又搞了本身一套汇编调用约定,在go使用标准的C函数库的时候还须要作一些转换。github
动态语言天生就有的毛病,全部的调用都是在运行时才能确认被调用的模块的位置以及代码,由于在动态语言中,并不像C/C++那样在编译期有大量的静态检查,固然你要是喜欢用C/C++的void * ,上帝也无法拯救你。golang
例如 aa.bb.cc 这种版本号,cc表明bugfix的版本,
大多时候出现这种依赖冲突,人工仲裁选择使用高版本便可,而bb表明大的改动,可能存在接口不兼容的状况,
这个时候就要对依赖进行代码检查,确保Java动态连接调用没有问题才能上线使用。
固然不少公司内部的包并不存在版本语义化管理的规范,这个时候你只能祈求上帝,编写你依赖模块的那个老哥,没有修改外部接口编程
在微服务下,以我我的的观察,大部分公司的微服务接口,可能只采用了简单的人肉管理,并且微服务大多都是跨部门维护接口的状况,这个时候若是沟通不顺畅,更容易出现问题。固然跨服务的RPC调用大多都是热点代码,若是出现问题,大多很容易被暴露出来。swift