错误信息展示:
这是kibana上的日志输出,报错400 bad request!
背景
feign版本3.0.0
分布式项目
测试环境运行
服务内部通过POST请求进行交互报错400
断言
初步断言可能存在的情况:
1、调用者与被调用者的feign请求方式不统一
2、调用者与被调用者的参数不匹配
解决过程
根据断言排查
根据断言排查发现,全部无误:
调用者使用POST方式请求,被调用者使用POST方式提供接口
入参类型及名称均一致
被调用者使用@RequestParam(“xxx”)的方式接收多个参数
配置信息排查
根据断言未发现问题,猜测是否配置信息异常?
检查yml文件如下:
# feign 配置
feign:
sentinel:
enabled: true
okhttp:
enabled: true
httpclient:
enabled: false
client:
config:
default:
connectTimeout: 10000
readTimeout: 10000
compression:
request:
enabled: true
response:
enabled: true
未发现异常,所有配置不影响实际调用的情况
git分支或者maven私服版本排查
多分支排查后发现分支发版没有问题
调用者以来的被调用者发布的maven私服版本一致
切换环境尝试
调用者与被调用者均切换到本地环境进行联调测试
排除因环境不同造成的问题
面向百度编程,百度搜索经验
百度此类问题发现有以下几种情况:
1、请求参数过长,超出URL长度最大长度(4k)
2、请求头大小进行限制,请求头过大导致
3、使用tomcat/jetty服务器,配置server的max-http-form-post-size,超出size导致
本人的情况均不符合以上三种情况
对比网上规范实例代码
经过百度,发现网上写的feign规范的方式与项目中的不一致。
参考地址:点击这里 网上在使用POST请求多参数的情况下,被调用者使用的@RequestBody注解进行接收参数,而项目中使用的是@RequestParam(“xxx”)的方式接收多个参数。
@RequestParam(“xxx”)的方式接收参数的多为GET方式请求。
所以大胆的猜测是否因为不规范导致的。
修改接口为GET方式进行尝试,结果成功,不再报错400.
总结
Feign报错400存在以下几种情况:
1、编写请求方式不规范
2、请求方式不匹配
3、请求参数不匹配
4、请求参数长度过大
5、服务器要求的请求参数受限
6、请求头长度受限
7、部分配置信息影响
8、运行环境异常
根据以上8中情况进行逐个排查问题,基本能够解决90%的情况。
Feign正确的编写方式
interface 规范
添加 @FeignClient(“xxx-xx-xx”)
@FeignClient("myservice-provider-test")
public interface TestFeignClient {
}
GET请求
@FeignClient("myservice-provider-test")
public interface TestFeignClient {
@RequestMapping(value = "/get", method = RequestMethod.GET)
Test getTest(@RequestParam("id") Long id, @RequestParam("name") String name);
}
POST请求
@FeignClient("myservice-provider-test")
public interface TestFeignClient {
@RequestMapping(value = "/post", method = RequestMethod.POST)
Test post(@RequestBody Test test);
}