推荐关注↓
转自:juejin.cn/post/7132495545884639240

1.写在前面

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

2. FEIGN 常见问题

2.1 400 Bad Request 问题

2.1.1 问题描述

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

2.1.2 代码如下

@PostMapping
(
"/llsydn/getMenusByIdsAndTypes"
)

List<SysMenuDto> 
getMenusByIdsAndTypes(@RequestParam("menuIds")
 String menuIds,

                                       @
RequestParam("menuType")
 String menuType)
;

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

2.1.3 解决办法

将方法修改为:
@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);

}

2.2. 非法字符错误

2.2.1 错误信息

在系统调用系统脚本的接口的时候抛出如下的错误。
Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t) is allowed between tokens

2.2.2 错误原因

是feign 调用的时候启用了压缩导致的。

3.2.3 解决办法

  • 1.关闭压缩即可。
将配置改成:
feign.compression.request.enabled=false

feign.compression.response.enabled=false

  • 2.或者使用okHttp
<dependency>
<groupId>
io.github.openfeign
</groupId>
<artifactId>
feign-okhttp
</artifactId>
</dependency>

2.3. 字符串中文乱码问题

2.3.1 错误信息

在Feign调用时,传到目标服务的方法中,字符串里的中文变成问号了

2.3.2 解决办法

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

2.4. too many Body parameters问题

2.4.1 问题描述

feign的post请求只能有一个body feign的post方法中,只能使用一个@RequestBody或者不带该注解,不能使用多个@RequestBody。
否则会报错nested exception is java.lang.IllegalStateException: Method has too many Body parameters。

2.4.2 解决办法

只保留一个@RequestBody注解

2.5. Read timed out问题

2.5.1 问题描述

feign调用超时,会出现这个问题。
一般来说当我们的业务需要处理的时间很大时,会出现这个问题。例如,上传excel文件。
那这里我们可以进行feign的超时时间设置。这里只针对指定的feign client

2.5.2 解决办法

@FeignClient
(name = 
"systemClient"
)

publicinterfaceSystemClient
{


@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

好了,以上就是个人真实项目-FEIGN常见问题的分享了。
- EOF -
关注「程序员的那些事」加星标,不错过圈内事
点赞和在看就是最大的支持❤️
继续阅读
阅读原文