feign首次调用时初始化操作导致的超时问题及处理

 更新时间:2026年03月19日 08:52:36   作者:一定不晚睡啊  
这篇文章主要介绍了feign首次调用时初始化操作导致的超时问题及处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

feign等待的时间默认情况下为1秒.如果1秒之内没有返回,那么此时会进行重试(默认情况下会重试一次)重试失败后 会进行降级逻辑处理,如果没有提供降级逻辑就会报错

问题1

feign在进行第一次远程调用时需要做很多的初始化操作(ribbon进行初始化),就会导致第一次远程调用的时消耗的时间较长,有的时候可能会出现超时,在我们业务系统中应该尽量避免触发超时!

解决方案1

对ribbon的初始化操作提前完成,不要在第一次调用的时候才进行初始化

#开启ribbon的饥饿加载
ribbon:
  eager-load:
    enabled: true
    clients: service-xxx服务模块,可写多个模块

解决方案2

延长feign的超时时间

弊端:产生雪崩效应的概率增大了

注意:显示指定后如果还触发超时,那么feign是不会进行重试

  • feign的超时配置方式 1(显式的指定超时时间):
feign:
#feign集成sentinel服务保护(断路器,防止雪崩)
  sentinel:
    enabled: true
  client:
    config:
   #feign延长超时时间
      default: #表示应用到所有服务提供方(也可以指定服务名称)
        connectTimeout: 4000
        readTimeout: 4000

feign的超时配置方式 2(精准设置接口超时配置):弊端:有时候需要每个接口都配置

2.1为feign接口添加Request.Options options参数

@GetMapping(value="/api/xx")
public abstract Resulttest(Request.Optionsoptions) ;

2.2远程调用时候传递Request.Options参数,直接new出来就行

Request.Optionsoptions=newRequest.Options(3, TimeUnit.MILLISECONDS, 3, TimeUnit.MILLISECONDS, true);
//参数说明:
connectTimeout:连接超时时间\时间单位
readTimeout :读取数据超时时间\时间单位
followRedirects :是否允许重定向

伴随问题:如果显示指定后如果还触发超时,那么feign是不会进行重试但是对于特殊业务场景需要进行重试时

解决方案:自定义重试器

重试原理:执行业务方法的时候报错了,那么此时就需要调用重试器中的continueOrPropagate方法。如果该方法产生了异常,那么重试结束;如果

该方法没有产生异常那么则进行重试。

如果我们想在自定义超时时间的同时使用重试机制,那么此时就需要自定义重试器。

  • 步鄹1:自定义一个类实现Retryer重写方法
public class MyRetryer implements Retryer {
    
    private intstart=1 ;
    private intend=3 ;  //规定重试次数
​
​
    /**
     * 远程调用失败以后,会调用重试器的这个方法
     */
    @Override//判断是否需要重试
    public void continueOrPropagate(RetryableExceptione) {
        
        if(start>end) {
            throwe ;
        }
        start++ ;
        System.out.println("MyRetryer...continueOrPropagate....");
    }
​
    @Override//返回对象
    public Retryer clone() {
        return new MyRetryer();
    }
    
}

步鄹2:将自定义的重试器配置给feign

feign:
#feign集成sentinel服务保护(断路器,防止雪崩)
  sentinel:
    enabled: true
  client:
    config:
   #feign延长超时时间
      default: #表示应用到所有服务提供方(也可以指定服务名称)
       # connectTimeout: 4000
       # readTimeout: 4000       
        retryer: com.aa.bb.MyRetryer #配置重试器,全类名

可以将配置抽取到nacos中心,哪里需要哪里添加

  #feign集成sentinel服务保护(断路器,防止雪崩)
feign:
  sentinel:
    enabled: true
  client:
    config:
   #feign延长超时时间
      default:
        connectTimeout: 1500
        readTimeout: 1500
        retryer: com.xx.feign.retry.FeignClientRetryer

#配置ribbon的饥饿加载
ribbon:
  eager-load:
    enabled: true
    clients: 微服务,微服务2,微服务3

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java虚拟机内存结构及编码实战分享

    Java虚拟机内存结构及编码实战分享

    这篇文章主要介绍了Java虚拟机内存结构及编码实战分享,文章围绕详细主题展开相关资料具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04
  • Java中instanceof 关键字的使用

    Java中instanceof 关键字的使用

    instanceof通过返回一个布尔值来指出,某个对象是否是某个特定类或者是该特定类的子类的一个实例,本文就来详细的介绍一下instanceof 关键字的使用,感兴趣的可以了解一下
    2023-10-10
  • Java中高效的判断数组中某个元素是否存在详解

    Java中高效的判断数组中某个元素是否存在详解

    相信大家在操作Java的时候,经常会要检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作。同时,这个问题在Stack Overflow中也是一个非常热门的问题。本文将分析几种常见用法及其时间成本,有需要的朋友们可以参考借鉴。
    2016-11-11
  • Java常用时间工具类总结(珍藏版)

    Java常用时间工具类总结(珍藏版)

    这篇文章主要为大家详细介绍了Java中一些常用时间工具类的使用示例代码,文中的代码简洁易懂,对我们学习Java有一定帮助,需要的可以参考一下
    2022-07-07
  • Java源码解析之ClassLoader

    Java源码解析之ClassLoader

    在看系统启动的流程中看到了ClassLoader使用,重新温故下ClassLoader流程和原理,文中有非常详细的代码示例,对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • 浅谈DetachedCriteria和Criteria的使用方法(必看)

    浅谈DetachedCriteria和Criteria的使用方法(必看)

    下面小编就为大家带来一篇浅谈DetachedCriteria和Criteria的使用方法(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • IDEA如何快速构建UML类图

    IDEA如何快速构建UML类图

    UML类图是一种用于描述软件系统静态结构的可视化建模语言,它通过类、属性、方法以及它们之间的关系来表示系统,类图主要用于面向对象设计,帮助理解系统的结构和类之间的关系,IDEA提供了自动生成UML类图的功能,但其局限性在于只能基于现有代码生成
    2025-02-02
  • Java设计模式UML之类图精解

    Java设计模式UML之类图精解

    在UML类图中,类使用包含类名、属性(field) 和方法(method) 且带有分割线的矩形来表示,比如下图表示一个Employee类,它包含name,age和email这3个属性,以及modifyInfo()方法
    2022-02-02
  • SpringBoot统一返回格式的方法详解

    SpringBoot统一返回格式的方法详解

    今天小编主要是和大家分享一个让代码变得更简洁的小技巧:统一返回格式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-08-08
  • Java进阶之Object类及常用方法详解

    Java进阶之Object类及常用方法详解

    Object 类是 Java 默认提供的一个类,是所有 Java 类的祖先类,每个类都使用 Object 作为父类。本文就来和大家聊聊Object类的常用方法,希望对大家有所帮助
    2023-01-01

最新评论