微服务框架FEIGN使用常见问题分析

 更新时间:2022年08月18日 11:09:43   作者:llsydn  
这篇文章主要为大家介绍了微服务框架FEIGN常见问题分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

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&lt;SysMenuDto&gt; 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")
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

以上就是微服务框架FEIGN常见问题分析的详细内容,更多关于微服务框架FEIGN问题的资料请关注脚本之家其它相关文章!

相关文章

  • Mockito mock Kotlin Object类方法报错解决方法

    Mockito mock Kotlin Object类方法报错解决方法

    这篇文章主要介绍了Mockito mock Kotlin Object类方法报错解决方法,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • 从Android源码剖析Intent查询匹配的实现

    从Android源码剖析Intent查询匹配的实现

    这篇文章主要介绍了从Android源码剖析Intent查询匹配的实现,Intent部分的源码为Java代码,需要的朋友可以参考下
    2015-07-07
  • java 中List按照date排序的实现

    java 中List按照date排序的实现

    这篇文章主要介绍了java 中List按照date排序的实现的相关资料,需要的朋友可以参考下
    2017-06-06
  • 从0到1学SpringCloud之SpringCloud gateway网关路由配置示例详解

    从0到1学SpringCloud之SpringCloud gateway网关路由配置示例详解

    Spring Cloud Gateway的目标提供统一的路由方式且基于Filter 链的方式提供了网关基本的功能, 例如:安全、监控、指标和限流 ,这篇文章主要介绍了从0到1学SpringCloud之SpringCloud gateway网关路由配置示例详解,需要的朋友可以参考下
    2023-04-04
  • Java使用JCommander实现解析命令行参数

    Java使用JCommander实现解析命令行参数

    jcommander 是一个只有几十 kb 的 Java 命令行参数解析工具,可以通过注解的方式快速实现命令行参数解析,本文就来和大家介绍一下JCommander是如何解析命令行参数吧
    2023-06-06
  • HashMap确定key的存储位置的源码分析

    HashMap确定key的存储位置的源码分析

    HashMap 作为 Java 中最常用的数据结构之一,用于存储和管理键值对,HashMap 基于哈希函数实现,能通过将 key 映射到特定的位置来实现快速存储、查找和删除数据,接下来将从源码角度分析以通俗易懂的方式向大家讲解一下 HashMap 如何确定 key 的存储位置的
    2023-07-07
  • MyBatis一级缓存避坑完全指南

    MyBatis一级缓存避坑完全指南

    这篇文章主要给大家介绍了关于MyBatis一级缓存避坑的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • Java实战之在线租房系统的实现

    Java实战之在线租房系统的实现

    这篇文章主要介绍了利用Java实现的在线租房系统,文中用到了SpringBoot、Redis、MySQL、Vue等技术,文中示例代码讲解详细,需要的可以参考一下
    2022-02-02
  • Java方法调用解析静态分派动态分派执行过程

    Java方法调用解析静态分派动态分派执行过程

    这篇文章主要为大家介绍了Java方法调用解析静态分派动态分派执行过程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Spring你不知道的一种解耦模式

    Spring你不知道的一种解耦模式

    本文介绍一种方法,服务定位模式Service Locator Pattern来解决,它帮助我们消除紧耦合实现及其依赖性,并提出将服务与其具体类解耦
    2023-01-01

最新评论