背景:
项目在本地环境一直在正常运行,突然测试环境大量报错,点哪错哪.
项目报错的接口是 A服务通过feign调用B服务,但是会通过两个接口调用两次B服务
查看测试环境日志发现错误如下:
这里只展示主要异常信息
feign.FeignException: status 400 reading
一开始我们被这个400的错误码误导了,一直查参数问题,但是换了所有参数后,还是报这个错,总之网上的解决办法能找的都找了.什么参数不对,序列化不对,参数过大,返回值过大,豪猪超时.甚至是服务器重启都试过,还是没能解决问题
最后的最后,直接上干货,如果上述方法你都试过,但是还是没能解决的话,那么你可能是跟我一样的问题.
直接贴干货代码:
@RequestMapping(value ="/api/getBeingProject",headers = {"Connection=close"})
List<SysProject> getBeingProject(@RequestParam String entId);
上述是自定义client中的一个远程方法,在方法上加入关键的
headers = {"Connection=close"}
这代表这次调用后,会立马关闭回收连接.
结论:
通过公司几位大佬各种跟源码分析,情况可能是这样的,
两次调用都会从连接池去拿连接
有可能是第一次调用的连接需要2秒钟
但是1秒就执行完毕了,然后第二次连接就过来了
直接拿了第一次剩下的连接去用
然后就直接把本次连接拒绝掉
feign就会报400错误,在方法上加这个headers后
本次调用后,会立马回收关闭连接,不给其他人拿到这次连接的机会,就解决了问题
彩蛋:
所有环境都没问题后,发布线上,发现线上还是会有一个接口还出现同样的问题.最后发现是这个接口请求的数据有点大,然后分批次去请求就解决了问题