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