java_微服务07SpringCloud常见问题之Feign

Spring Cloud Feign 是一个声明web服务客户端,这使得编写Web服务客户端更容易,使用Feign 创建一个接口并对它进行注解,它具有可插拔的注解支持包括Feign注解与JAX-RS注解,Feign还支持可插拔的编码器与解码器,Spring Cloud 增加了对 Spring MVC的注解,Spring Web 默认使用了HttpMessageConverters, Spring Cloud 集成 Ribbon 和 Eureka 提供的负载均衡的HTTP客户端 Feign。
简单的可以理解为:Spring Cloud Feign 的出现使得Eureka和Ribbon的使用更为简单

Feign Ribbon Hystrix 三者关系

Feign Ribbon Hystrix 三者关系 | 史上最全, 深度解析(转):https://blog.csdn.net/a1036645146/article/details/106384888

在Spring Cloud中使用Feign进行微服务调用分为两层:Hystrix的调用和Ribbon的调用,Feign自身的配置会被覆盖。
如果开启了Hystrix,那么Ribbon的超时时间配置与Hystrix的超时时间配置则存在依赖关系,因为涉及到Ribbon的重试机制,所以一般情况下都是Ribbon的超时时间小于Hystrix的超时时间,否则会出现以下错误:

1
2019-10-12 21:56:20,208   111231 [http-nio-8084-exec-2] WARN    o.s.c.n.z.f.r.s.AbstractRibbonCommand - The Hystrix timeout of 10000ms   for the command operation is set lower than the combination of the Ribbon   read and connect timeout, 24000ms.

Ribbon和Hystrix的超时时间配置的关系

那么Ribbon和Hystrix的超时时间配置的关系具体是什么呢?如下:

1
2
3
4
5
6
Hystrix的超时时间
=Ribbon的重试次数(包含首次) * (ribbon.ReadTimeout + ribbon.ConnectTimeout)

Ribbon重试次数(包含首次)
= 1 + ribbon.MaxAutoRetries + ribbon.MaxAutoRetriesNextServer + (ribbon.MaxAutoRetries * ribbon.MaxAutoRetriesNextServer)
= (1 + maxAutoRetries ) * (1 + MaxAutoRetriesNextServer) 次

以上图中的Ribbon配置为例子,Ribbon的重试次数=1+(1+1+1)=4,所以Hystrix的超时配置最少应该4*(3000+3000)=24000毫秒。
在Ribbon超时但Hystrix没有超时的情况下,Ribbon便会采取重试机制;而重试期间如果时间超过了Hystrix的超时配置则会立即被熔断(fallback)。
如果不配置Ribbon的重试次数,则Ribbon默认会重试一次,加上第一次调用Ribbon,总的的重试次数为2次,以上述配置参数为例,Hystrix超时时间配置为2*6000=12000,由于很多情况下,大家一般不会主动配置Ribbon的重试次数,所以这里需要注意下!强调下,以上超时配置的值只是示范,超时配置有点大不太合适实际的线上场景,大家根据实际情况设置即可!
说明下,如果不启用Hystrix,Feign的超时时间则是Ribbon的超时时间,Feign自身的配置也会被覆盖。

注意:
01,MaxAutoRetriesNextServer 真正的意思应该是:如果请求失败,最大要切换多少次服务实例(不管具体有多少个实例,即使一个实例,也会切换回这个实例本身 MaxAutoRetriesNextServer 次 )
02,如果没有配置 fallback,那么 hystrix 的超时就不会生效,而是由 ribbon 来控制

feign 第一次调用超时_Ribbon、Feign、Hystrix 的超时、熔断配置总结:https://blog.csdn.net/weixin_39603604/article/details/111219964
Ribbon

总结一下:
01,如果请求时间超过 ribbon 的超时配置,会触发重试;
02,在配置 fallback 的情况下,如果请求的时间(包括 ribbon 的重试时间),超出了 ribbon 的超时限制,或者 hystrix 的超时限制,那么就会熔断;
一般来说,会设置 ribbon 的超时时间 < hystrix, 这是因为 ribbon 有重试机制。(这里说的 ribbon 超时时间是包括重试在内的,即,最好要让 ribbon 的重试全部执行,直到 ribbon 超时被触发)。
由于 connectionTime 一般比较短,可以忽略。那么,设置的超时时间应该满足:

1
(1 + MaxAutoRetries) * (1 + MaxAutoRetriesNextServer) ReadTimeOut < hystrix 的 timeoutInMilliseconds*

springcloud之Feign、ribbon设置超时时间和重试机制的总结:https://blog.csdn.net/east123321/article/details/82385816

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×