⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 juejin.cn/post/7132495545884639240 「llsydn」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

写在前面

很多时候,我们在使用微服务框架的时候,就基本上少不了与feign打交道。

毕竟服务之间的调用,基本上都不会用手写http工具类去调了,这样显得有点麻烦了,feign更方便了。

而且feign,还自带了负载均衡的策略(ribbon提供),如果我们的服务是集群的,feign还能负载调用。

这些估计大家都懂吧?不会还有人不懂吧?那这个要深入学习了。

在用feign的日常中,难免会遇到些问题,那下面,我来总结下,我司在项目开发中遇到的问题。

虽说不是大问题,但至少是点经验分享,希望可以帮助到大家。当然有些问题可以通过升级到 openfeign 进行轻松解决。

好啦,下面开始喽!!!

FEIGN 常见问题

400 Bad Request 问题

「问题描述」

在使用feign调用的使用出现400 Bad request的问题。

「代码如下」

@PostMapping("/llsydn/getMenusByIdsAndTypes")
List<SysMenuDto> getMenusByIdsAndTypes(@RequestParam("menuIds") String menuIds,
@RequestParam("menuType") String menuType);

这个 menuIds 数量比较多,导致400 错误。发现问题出在menuIds 跟在URL后面。

解决办法

将方法修改为:

@PostMapping("/llsydn/getMenusByIdsAndTypes")
List<SysMenuDto> getMenusByIdsAndTypes(@RequestBody MultiValueMap<String,String> 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 调用的时候启用了**「压缩」**导致的。

解决办法

  1. 关闭压缩即可。

将配置改成:

feign.compression.request.enabled=false
feign.compression.response.enabled=false

  1. 或者使用okHttp

<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</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);

too many Body parameters问题

问题描述

feign的post请求只能有一个body feign的post方法中,只能使用一个@RequestBody或者不带该注解,不能使用多个@RequestBody。

否则会报错nested exception is java.lang.IllegalStateException: Method has too many Body parameters。

解决办法

只保留一个@RequestBody注解

Read timed out问题

问题描述

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);
}

  • yml配置

feign:
httpclient:
enabled: true
client:
config:
default:
#默认时间设置为10s
ConnectTimeOut: 10000
ReadTimeOut: 10000
#调用system微服务,默认时间设置为30s
systemClient:
ConnectTimeOut: 30000
ReadTimeOut: 30000

好了,以上就是我给公司研发人员解决问题遇到的坑,与解决方案的分享。

可能内容有点短,但都是干货喔!!!

个人理解,可能也不够全面,班门弄斧了。

文章目录
  1. 1. 写在前面
  2. 2. FEIGN 常见问题
    1. 2.1. 400 Bad Request 问题
    2. 2.2. 解决办法
  3. 3. 非法字符错误
    1. 3.1. 错误信息
    2. 3.2. 错误原因
    3. 3.3. 解决办法
  4. 4. 字符串中文乱码问题
    1. 4.1. 错误信息
    2. 4.2. 解决办法
  5. 5. too many Body parameters问题
    1. 5.1. 问题描述
    2. 5.2. 解决办法
  6. 6. Read timed out问题
    1. 6.1. 问题描述
    2. 6.2. 解决办法