网上也看到一些防腐层的优秀文章,在实际的开发项目中,不可避免的,我们也使用到了防腐层,对防腐层,简单总结一下:
1. 防腐层的意义是什么?
防腐层隔离上游的功能,防腐层通过已有接口和外部系统交互,在内部做己方和他方模型的转换。
简单来说,防腐层一般为了隔离两个系统之间的变化,防止一个系统的微小变化会影响到另外一个系统;还有一个场景,两个系统的技术栈不一致,所以需要一层代理来兼容。
2. 防腐层的职责
(1)异常降级:对RPC可能出现的异常进行捕获
(2)超时/重试:RPC接口的超时、重试统一管理;
(3)数据校验:对返回值的正确性、边界值进行校验,进行数据的基本防御,业务代码边界值的解耦;
(4)接口防腐:转换VO对象的时候,避免下游接口的修改,导致自身系统的修改;
3. 防腐层的目的
(1)代码复用:RPC的调用场景差异化比较小,proxy层调用,提高开发效率;
(2)提供便利性:调用方可以直接调用,对RPC的结果可以直接使用,不用考虑NPE、RPC等异常;
4. 思考
防腐层要做多少事情才是合适的,而又不显得防腐层很臃肿、很笨重?
我们平时代码利用防腐层主要做的一些事情,如解封装、接口检验、处理异常、打印日志等;很多时候处理的是一些防止过度开发的模板性代码。
这里说到过度开发,那就会有一个问题:我们在对接第三方的时候,使用到了第三方的接口与其对应的元数据,那么第三方接口返回的元数据我们是否可以直接使用?
如果直接使用,接口发生改动,返回元数据变化,我们其实也没能真正意义上做到解耦,除了防腐层的其他地方也还是要做改动。如果做了返回值的convert,对接接口过多的时候,这样的防腐层会显得很笨重,过度开发,这样的矛盾怎么去解决?这里就涉及防腐层的一个边界问题。
那就要说到防腐层出现的目的,最初是为了屏蔽其他系统的域模型,入参和出参是需要我们自己定义。但是每个接口都这样处理我们这样开发量很大,且存在不合理的地方。主要因为我们系统维护了别人域元数据的对等。
这个边界,可以这么理解:
如果依赖的下游经常有数据变动,或者说域模型和我们自己域的域模型没有关联,那我们防腐层就需要进行这样的convert,自己定义一份;如果依赖的下游比较稳定,我们直接使用也是可以的。