Feign Ribbon Hystrix 三者关系

在微服务架构的应用中, Feign、Hystrix,Ribbon 三者都是必不可少的,可以说已经成为铁三角。

Feign 介绍

Feign 是一款Java语言编写的 HttpClient 绑定器,在 Spring Cloud 微服务中用于实现微服务之间的声明式调用。Feign 可以定义请求到其他服务的接口,用于微服务间的调用,不用自己再写 http 请求,在客户端实现,调用此接口就像远程调用其他服务一样,当请求出错时可以调用接口的实现类来返回

Feign 是一个声明式的 web service 客户端,它使得编写 web service 客户端更为容易。创建接口,为接口添加注解,即可使用 Feign。Feign 可以使用 Feign 注解或者JAX-RS注解,还支持热插拔的编码器和解码器。Spring Cloud为Feign 添加了 Spring MVC 的注解支持,并整合了 Ribbon 和 Eureka 来为使用 Feign 时提供负载均衡。

feign源码的github地址

Ribbon 介绍

Ribbon 作为负载均衡,在客户端实现,服务段可以启动两个端口不同但servername一样的服务

Ribbon 是 Netflix 发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出 Load Balancer 后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。简单地说,Ribbon 是一个客户端负载均衡器。

Ribbon工作时分为两步:第一步先选择 Eureka Server, 它优先选择在同一个Zone且负载较少的Server;第二步再根据用户指定的策略,在从Server取到的服务注册列表中选择一个地址。其中Ribbon提供了多种策略,例如轮询、随机、根据响应时间加权等。

ribbon 源码的 github 地址

Hystrix 介绍

Hystrix 作为熔断流量控制,在客户端实现,在方法上注解,当请求出错时可以调用注解中的方法返回

Hystrix 熔断器,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。在Spring Cloud Hystrix中实现了线程隔离、断路器等一系列的服务保护功能。它也是基于Netflix的开源框架 Hystrix实现的,该框架目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix具备了服务降级、服务熔断、线程隔离、请求缓存、请求合并以及服务监控等强大功能。

Hystrix 源码的 github 地址

三者之间的关系图

如果微服务项目加上了 spring-cloud-starter-netflix-hystrix 依赖,那么,feign 会通过代理模式, 自动将所有的方法用 hystrix 进行包装。

在 Spring Cloud 微服务体系下,微服务之间的互相调用可以通过 Feign 进行声明式调用,在这个服务调用过程中 Feign 会通过 Ribbon 从服务注册中心获取目标微服务的服务器地址列表,之后在网络请求的过程中Ribbon就会将请求以负载均衡的方式打到微服务的不同实例上,从而实现 Spring Cloud 微服务架构中最为关键的功能即服务发现及客户端负载均衡调用。

另一方面微服务在互相调用的过程中,为了防止某个微服务的故障消耗掉整个系统所有微服务的连接资源,所以在实施微服务调用的过程中我们会要求在调用方实施针对被调用微服务的熔断逻辑。而要实现这个逻辑场景在 Spring Cloud 微服务框架下我们是通过 Hystrix 这个框架来实现的。

调用方会针对被调用微服务设置调用超时时间,一旦超时就会进入熔断逻辑,而这个故障指标信息也会返回给Hystrix组件,Hystrix组件会根据熔断情况判断被调微服务的故障情况从而打开熔断器,之后所有针对该微服务的请求就会直接进入熔断逻辑,直到被调微服务故障恢复,Hystrix断路器关闭为止。

三者之间的关系图,大致如下:

Feign 典型配置说明

Feign 自身可以支持多种 HttpClient 工具包,例如 OkHttp 及 Apache HttpClient,针对 Apache HttpClient 的典型配置如下:

feign:  #替换掉JDK默认HttpURLConnection实现的 Http Client
    httpclient:    
      enabled: true  
    hystrix:    
      enabled: true  
    client:    
    config:      
    default:              
    connectTimeout: 5000 #连接超时时间             
    readTimeout: 5000  #读取超时时间  

Hystrix 配置说明

在 Spring Cloud 微服务体系中 Hystrix 主要被用于实现实现微服务之间网络调用故障的熔断、过载保护及资源隔离等功能。

hystrix:
propagate:
request-attribute:
enabled: true
command:    #全局默认配置
default:      #线程隔离相关
execution:
timeout:
enabled: true      #是否给方法执行设置超时时间,默认为true。一般我们不要改。
isolation:
strategy: threadPool    #配置请求隔离的方式,这里是默认的线程池方式。还有一种信号量的方式semaphore,使用比较少。
thread:
timeoutInMilliseconds: 10000   #方式执行的超时时间,默认为1000毫秒,在实际场景中需要根据情况设置
interruptOnTimeout: true    #发生超时时是否中断方法的执行,默认值为true。不要改。
interruptOnCancel: false  #是否在方法执行被取消时中断方法,默认值为false。没有实际意义,默认就好!
circuitBreaker:   #熔断器相关配置
enabled: true   #是否启动熔断器,默认为true,false表示不要引入Hystrix。
requestVolumeThreshold: 20     #启用熔断器功能窗口时间内的最小请求数,假设我们设置的窗口时间为10秒,
sleepWindowInMilliseconds: 5000    #所以此配置的作用是指定熔断器打开后多长时间内允许一次请求尝试执行,官方默认配置为5秒。
errorThresholdPercentage: 50   #窗口时间内超过50%的请求失败后就会打开熔断器将后续请求快速失败掉,默认配置为50

Ribbon 配置说明

Ribbon 在 Spring Cloud 中对于支持微服之间的通信发挥着非常关键的作用,其主要功能包括客户端负载均衡器及用于中间层通信的客户端。在基于 Feign 的微服务通信中无论是否开启 Hystrix,Ribbon 都是必不可少的,Ribbon 的配置参数主要如下:

ribbon:  
eager-load:    
enabled: true  
MaxAutoRetries: 1  #说明:同一台实例的最大自动重试次数,默认为1次,不包括首次  
MaxAutoRetriesNextServer: 1  #说明:要重试的下一个实例的最大数量,默认为1,不包括第一次被调用的实例  
OkToRetryOnAllOperations: true  #说明:是否所有的操作都重试,默认为true  
ServerListRefreshInterval: 2000  #说明:从注册中心刷新服务器列表信息的时间间隔,默认为2000毫秒,即2秒  
ConnectTimeout: 3000  #说明:使用Apache HttpClient连接超时时间,单位为毫秒  
ReadTimeout: 3000   #说明:使用Apache HttpClient读取的超时时间,单位为毫秒 

配置超时重试关系

如上图所示,在 Spring Cloud 中使用 Feign 进行微服务调用分为两层:Hystrix 的调用和 Ribbon 的调用,Feign 自身的配置会被覆盖。

而如果开启了 Hystrix,那么 Ribbon 的超时时间配置与Hystrix的超时时间配置则存在依赖关系,因为涉及到 Ribbon 的重试机制,所以一般情况下都是Ribbon的超时时间小于 Hystrix 的超时时间,否则会出现以下错误:

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的超时时间配置的关系具体是什么呢?如下:

Hystrix 的超时时间=Ribbon的重试次数(包含首次) * (ribbon.ReadTimeout + ribbon.ConnectTimeout)

而 Ribbon 的重试次数的计算方式为:

Ribbon 重试次数(包含首次)= 1 + ribbon.MaxAutoRetries + ribbon.MaxAutoRetriesNextServer + (ribbon.MaxAutoRetries * ribbon.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 自身的配置也会被覆盖。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花言巧语大佩奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值