feign 调用常见问题避坑指南!

简介: feign 调用常见问题避坑指南!

写在前面

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

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

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

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

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

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

好啦,下面开始喽!!!

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

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

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

非法字符错误

错误信息

在系统调用系统脚本的接口的时候抛出如下的错误。

Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t) is allowed between tokens

错误原因

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

解决办法

  1. 关闭压缩即可。

微信图片_20220908135852.jpg

将配置改成:

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

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

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

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

相关文章
|
Java 数据库连接 mybatis
Mybatis Plus保存数据返回主键id
Mybatis Plus保存数据返回主键id
790 1
|
消息中间件 IDE JavaScript
用代码画时序图!YYDS
最近通过代码来看看这个图,给大家看图、UML ,感觉很给大家分享。 大家平时用他们出的图呢,是用什么样的图,都用画图来画的,我们用画图来画图 呢draw.io?processOn 今天给大家介绍一款想要的作品,用的画图,配合IDE使用PlantUML!
用代码画时序图!YYDS
|
Web App开发 JavaScript 前端开发
Python 自动化 - 浏览器chrome打开F12开发者工具自动Paused in debugger调试导致无法查看网站资源问题原因及解决方法,javascript反调试问题处理实例演示
Python 自动化 - 浏览器chrome打开F12开发者工具自动Paused in debugger调试导致无法查看网站资源问题原因及解决方法,javascript反调试问题处理实例演示
1355 0
Python 自动化 - 浏览器chrome打开F12开发者工具自动Paused in debugger调试导致无法查看网站资源问题原因及解决方法,javascript反调试问题处理实例演示
|
10月前
|
缓存 JavaScript 前端开发
【HarmonyOS 5】鸿蒙的装饰器原理和自定义装饰器
一、鸿蒙中的装饰器是什么? 在ArkTS中装饰器(Decorator)是一种特殊的声明,能够对类、方法、属性等进行标注和修改。
220 0
|
存储 消息中间件 缓存
使用 Docker Compose 部署单机版 Redis:简单高效的数据缓存与存储
家人们啦!今天我们来介绍如何使用 docker-compose 部署单机版 Redis,这是一个简单高效的数据缓存与存储解决方案,广泛应用于Web应用、移动应用以及各类数据处理场景。我们过后几篇文章了将会介绍cluster和sentinel集群的部署。通过本文的指导,你将能够快速上手并体验 Redis 在你的应用中所带来的便捷性与高性能。废话不多说,让我们开始吧!
11262 1
使用 Docker Compose 部署单机版 Redis:简单高效的数据缓存与存储
|
存储 人工智能 大数据
拼多多详情API的价值与应用解析
拼多多作为中国电商市场的重要参与者,其开放平台提供的商品详情API接口为电商行业带来了新的机遇和挑战。该接口允许开发者通过编程方式获取商品的详细信息,包括标题、价格、描述、图片、规格参数和库存等,推动了电商运营的智能化和高效化。本文将深入解析拼多多详情API的价值与应用,帮助商家和开发者更好地理解和利用这一宝贵资源。
759 0
|
安全 Java API
为什么捕获异常后不要使用e.printStackTrace()打印日志
为什么捕获异常后不要使用e.printStackTrace()打印日志
|
Java 数据库连接 数据库
深入解析Java中的MyBatis Plus注解 @TableId:优雅处理主键映射
在数据库设计中,主键是每个表中至关重要的元素,它唯一标识了表中的每一行数据。然而,对于Java持久层开发来说,主键映射往往会涉及到复杂的操作。MyBatis Plus作为一款强大的ORM框架,提供了注解`@TableId`,能够轻松处理各种主键映射需求。本文将深入探讨`@TableId`注解的用法及其在持久层开发中的应用。
11123 0
|
存储 JavaScript Python
word文档转成Markdown文档并在Typora免费版添加图床-----想想都很香
word文档转成Markdown文档并在Typora免费版添加图床-----想想都很香
1069 0