今天突然发生了一件怪事,在内测环境下所有的客户端通过hessian请求服务端时,部分的请求直接返回 'j' is unknow code ,服务端并不报错。发生这个问题,真把我给急坏了,内测环境是我们上线生产的最后一道关,如果这个故障不解决,所有的应用都要停止上线,以免给生产系统造成影响。一方面更新邮件不停的在累积,另一方面,出于对生产系统负责的态度,不敢对生产环境进行更新。
某大神一直认为是项目中的包的版本的问题,不断的让我换依赖包的版本,当时我也没有太好的排查方案,只好先尝试换换看,换来换去问题依旧。一上午很快就过去了,到下午,无线那边的产品挨个找我问我情况,迫于压力,我回复产品部门,四点之前一定给出出力结果。于是我开始自己来分析问题。
1、生产环境和测试环境都没问题,只有内测环境有问题。内测环境的包和生产环境的包都是一样的,应用的包文件没有更换过,这样其实先排除应用内部的原因了。(所以说上午听某大神的换依赖包版本的建议是有多么的离谱了)
2、把内测客户端的RPC的请求地址先换成生产的RPC,排除故障是否与服务端有关系。改完测试之后,发现客户端和服务端都没问题。请求都很正常。说明问题在中间转发层或者是服务端。再把RPC的请求地址更换成内测服务端的IP地址(除中间转发层),发现请求都正常。排除之后可以肯定,是由于中间层转发出现了故障造成的。
3、找到运维的负责请求转发的同事,让他检查了一下,最终确认的原因是由于 应用防火墙的配置有问题导致请求被拦截造成返回数据无法被hassian协议识别导致的。修复应用防火墙配置,故障恢复。