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

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值