• 个人真实项目-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 代码如下

    1. @PostMapping("/llsydn/getMenusByIdsAndTypes")
    2. List getMenusByIdsAndTypes(@RequestParam("menuIds") String menuIds,
    3. @RequestParam("menuType") String menuType);
    4. 复制代码

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

    2.1.3 解决办法

    将方法修改为:

    1. @PostMapping("/llsydn/getMenusByIdsAndTypes")
    2. List getMenusByIdsAndTypes(@RequestBody MultiValueMap queryParam);
    3. 复制代码

    调用方法修改成:

    1. public List<SysMenuDto> getMenusByIdsAndNotType(String menuIds, String menuType){
    2. MultiValueMap valueMap=new LinkedMultiValueMap();
    3. valueMap.add("menuIds",menuIds);
    4. valueMap.add("menuType",menuType);
    5. return systemClient.getMenusByIdsAndTypes(valueMap);
    6. }
    7. 复制代码

    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.关闭压缩即可。

    将配置改成:

    1. feign.compression.request.enabled=false
    2. feign.compression.response.enabled=false
    3. 复制代码
    • 2.或者使用okHttp
    1. <dependency>
    2. <groupId>io.github.openfeigngroupId>
    3. <artifactId>feign-okhttpartifactId>
    4. dependency>
    5. 复制代码

    2.3. 字符串中文乱码问题

    2.3.1 错误信息

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

    2.3.2 解决办法

    在Feign的接口的注解中指定consumes字符集:

    1. @PostMapping(value = "/portal/core/appdata/install",consumes = "application/json;charset=UTF-8")
    2. void install(@RequestBody String data);
    3. 复制代码

    如果此时data为[{},{}]格式的JSON字符串,即JSON数组字符串,又会报参数类型不匹配的错误,要把参数改为对象数组或者List对象:

    1. @PostMapping(value = "/portal/core/appdata/install",consumes = "application/json;charset=UTF-8")
    2. void install(@RequestBody Object[] data);
    3. 复制代码

    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 解决办法

    1. @FeignClient(name = "systemClient")
    2. public interface SystemClient {
    3. @RequestMapping(path = "/llsydn/importExcel", consumes = {"multipart/form-data"})
    4. JsonResult importExcel(@RequestPart(name="file") MultipartFile file);
    5. }
    6. 复制代码
    • yml配置
    1. feign:
    2. httpclient:
    3. enabled: true
    4. client:
    5. config:
    6. default:
    7. #默认时间设置为10s
    8. ConnectTimeOut: 10000
    9. ReadTimeOut: 10000
    10. #调用system微服务,默认时间设置为30s
    11. systemClient:
    12. ConnectTimeOut: 30000
    13. ReadTimeOut: 30000
    14. 复制代码

    好了,以上就是个人真实项目-FEIGN常见问题分享的分享了。

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

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

    如果觉得有收获的,帮忙点赞、评论、收藏一下呗!!!

  • 相关阅读:
    PID的调节
    R语言使用plot函数可视化数据散点图,通过xlim参数指定X轴的坐标范围(x axis limits)
    数据仓库中常用的元数据管理系统
    MFC 模态对话框退出机制的探究
    Transformer是如何进军点云学习领域的?
    virtualBox虚拟机之间网络互通设置
    Java面试突击
    【COMSE 2022已检索】2023年材料科学与工程国际会议(COMSE 2023)火热征稿中!
    SpringClouldAlibaba 之 Sentinel流控规则同步到nacos(并重新生成镜像)
    Redis系列18:过期数据的删除策略
  • 原文地址:https://blog.csdn.net/Trouvailless/article/details/126386577