前几天升级了一个模块的小补丁后,现网出了个问题,调用一个底层接口,获取到的返回对象一直是空的。诡异的是该模块本次升级的补丁内容并不涉及这个接口相关的东西,或者也可以说,补丁就是改了极其简单的一行代码而已。但为啥会引发另一个接口的问题呢?
先看日志,日志里一直打印该接口返回对象为空,第一判断是底层接口出了问题,去看底层,发现人家服务好好的。绕过该模块,直接用工具调用底层接口,没问题。非常诡异,按照经验,推测是jar包出问题了。第二步,看jar包的历史变动。拿本模块的API的jar包跟底层的jar包一比较,果然接口对象字段不一致,本模块的返回对象里多了一个字段。那为啥会多这个字段呢?原来是底层的开发版本新增的,但它们的发布版本没有增加。而本模块打包时pom文件引用的是底层的开发版本,底层的现网用的是发布版本。
至此问题已定位清楚,解决方案也自然出来:修改本模块pom文件引用底层API的发布版本jar包,重新打包部署即可。另一点需要指出的是,本模块对底层的调用使用的是rpc,获取到底层的响应后需要通过底层的api进行反序列化,如果对方接口有变动将导致调用方反序列化失败。