很多时候,我们在使用微服务框架的时候,就基本上少不了与feign打交道。
毕竟服务之间的调用,基本上都不会用http调了,这样显得有点麻烦了,feign更方便了。
而且feign,还自带了负载均衡的策略(ribbon提供),如果我们的服务是集群的,feign还能负载调用。
这些估计大家都懂吧?不会还有人不懂吧?那这个要深入学习了。哈哈
在用feign的日常中,难免会遇到些问题,那下面,我来总结下,我在项目开发中遇到的问题喽。
哈哈,虽说不是大问题,但至少是点经验分享喽,希望可以帮助到大家。
好啦,下面开始喽!!!

在使用feign调用的使用出现400 Bad request的问题。
- @PostMapping("/llsydn/getMenusByIdsAndTypes")
- List
getMenusByIdsAndTypes(@RequestParam("menuIds") String menuIds, - @RequestParam("menuType") String menuType);
- 复制代码
这个 menuIds 数量比较多,导致400 错误。发现问题出在menuIds 跟在URL后面。
将方法修改为:
- @PostMapping("/llsydn/getMenusByIdsAndTypes")
- List
getMenusByIdsAndTypes(@RequestBody MultiValueMap queryParam); - 复制代码
调用方法修改成:
- public List<SysMenuDto> getMenusByIdsAndNotType(String menuIds, String menuType){
- MultiValueMap valueMap=new LinkedMultiValueMap();
- valueMap.add("menuIds",menuIds);
- valueMap.add("menuType",menuType);
- return systemClient.getMenusByIdsAndTypes(valueMap);
- }
- 复制代码
在系统调用系统脚本的接口的时候抛出如下的错误。
Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t) is allowed between tokens
是feign 调用的时候启用了压缩导致的。

将配置改成:
- feign.compression.request.enabled=false
- feign.compression.response.enabled=false
- 复制代码
- <dependency>
- <groupId>io.github.openfeigngroupId>
- <artifactId>feign-okhttpartifactId>
- dependency>
- 复制代码
在Feign调用时,传到目标服务的方法中,字符串里的中文变成问号了
在Feign的接口的注解中指定consumes字符集:
- @PostMapping(value = "/portal/core/appdata/install",consumes = "application/json;charset=UTF-8")
- void install(@RequestBody String data);
- 复制代码
如果此时data为[{},{}]格式的JSON字符串,即JSON数组字符串,又会报参数类型不匹配的错误,要把参数改为对象数组或者List对象:
- @PostMapping(value = "/portal/core/appdata/install",consumes = "application/json;charset=UTF-8")
- void install(@RequestBody Object[] data);
- 复制代码
feign的post请求只能有一个body feign的post方法中,只能使用一个@RequestBody或者不带该注解,不能使用多个@RequestBody。
否则会报错nested exception is java.lang.IllegalStateException: Method has too many Body parameters。
只保留一个@RequestBody注解
feign调用超时,会出现这个问题。
一般来说当我们的业务需要处理的时间很大时,会出现这个问题。例如,上传excel文件。
那这里我们可以进行feign的超时时间设置。这里只针对指定的feign client
-
- @FeignClient(name = "systemClient")
- public interface SystemClient {
-
- @RequestMapping(path = "/llsydn/importExcel", consumes = {"multipart/form-data"})
- JsonResult importExcel(@RequestPart(name="file") MultipartFile file);
- }
-
- 复制代码
- feign:
- httpclient:
- enabled: true
- client:
- config:
- default:
- #默认时间设置为10s
- ConnectTimeOut: 10000
- ReadTimeOut: 10000
- #调用system微服务,默认时间设置为30s
- systemClient:
- ConnectTimeOut: 30000
- ReadTimeOut: 30000
- 复制代码
好了,以上就是个人真实项目-FEIGN常见问题分享的分享了。
可能内容有点短,但都是干货喔!!!
个人理解,可能也不够全面,班门弄斧了。
如果觉得有收获的,帮忙点赞、评论、收藏一下呗!!!
