java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > feign首次调用时初始化操作导致的超时

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

作者:一定不晚睡啊

这篇文章主要介绍了feign首次调用时初始化操作导致的超时问题及处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

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

问题1

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

解决方案1

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

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

解决方案2

延长feign的超时时间

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

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

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方法。如果该方法产生了异常,那么重试结束;如果

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

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

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

总结

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

您可能感兴趣的文章:
阅读全文