Feign Ribbon Hystrix 三者关系 | 史上最全, 深度解析

史上最全: Feign Ribbon Hystrix 三者关系 | 深度解析

疯狂创客圈 Java 分布式聊天室【 亿级流量】实战系列之 -25【 博客园 总入口html


前言

疯狂创客圈(笔者尼恩建立的高并发研习社群)Springcloud 高并发系列文章,将为你们介绍三个版本的 高并发秒杀:java

1、版本1 :springcloud + zookeeper 秒杀git

2、版本2 :springcloud + redis 分布式锁秒杀github

3、版本3 :springcloud + Nginx + Lua 高性能版本秒杀web

以及有关Springcloud 几篇核心、重要的文章面试

1、Springcloud 配置, 史上最全 一文全懂redis

2、Springcloud 中 SpringBoot 配置全集 , 收藏版算法

3、Feign Ribbon Hystrix 三者关系 , 史上最全 深度解析spring

4、SpringCloud gateway 详解 , 史上最全缓存

本文,是《Feign Ribbon Hystrix 三者关系 , 史上最全 深度解析》篇,为你们解读若是Feign Ribbon Hystrix 三者关系,你们能够藏好,必定有用的到时候

Springcloud 高并发 配置 简介

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

疯狂创客圈(笔者尼恩建立的高并发研习社群)中,有很多小伙伴问到尼恩,关于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地址:

https://github.com/OpenFeign/feign

Ribbon介绍

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

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

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

ribbon源码的github地址:

https://github.com/Netflix/ribbon

Hystrix介绍

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

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

Hystrix源码的github地址:

https://github.com/Netflix/hystrix

重点: 三者之间的关系图

若是微服务项目加上了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:
          #是否给方法执行设置超时时间,默认为true。通常咱们不要改。
          enabled: true
        isolation:
          #配置请求隔离的方式,这里是默认的线程池方式。还有一种信号量的方式semaphore,使用比较少。
          strategy: threadPool
          thread:
            #方式执行的超时时间,默认为1000毫秒,在实际场景中须要根据状况设置
            timeoutInMilliseconds: 10000
            #发生超时时是否中断方法的执行,默认值为true。不要改。
            interruptOnTimeout: true
            #是否在方法执行被取消时中断方法,默认值为false。没有实际意义,默认就好!
            interruptOnCancel: 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
  #说明:同一台实例的最大自动重试次数,默认为1次,不包括首次
  MaxAutoRetries: 1
  #说明:要重试的下一个实例的最大数量,默认为1,不包括第一次被调用的实例
  MaxAutoRetriesNextServer: 1
  #说明:是否全部的操做都重试,默认为true
  OkToRetryOnAllOperations: true
  #说明:从注册中心刷新服务器列表信息的时间间隔,默认为2000毫秒,即2秒
  ServerListRefreshInterval: 2000
  #说明:使用Apache HttpClient链接超时时间,单位为毫秒
  ConnectTimeout: 3000
  #说明:使用Apache HttpClient读取的超时时间,单位为毫秒
  ReadTimeout: 3000

如上图所示,在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自身的配置也会被覆盖

最后,介绍一下疯狂创客圈:疯狂创客圈,一个Java 高并发研习社群博客园 总入口

疯狂创客圈,倾力推出:面试必备 + 面试必备 + 面试必备 的基础原理+实战 书籍 《Netty Zookeeper Redis 高并发实战

img


疯狂创客圈 Java 死磕系列

  • Java (Netty) 聊天程序【 亿级流量】实战 开源项目实战

  • Netty 源码、原理、JAVA NIO 原理
  • Java 面试题 一网打尽
  • 疯狂创客圈 【 博客园 总入口 】