代码编织梦想

1. Feign+Hystrix实现RPC调用保护

  1. 在Spring Cloud微服务架构下,RPC保护可以通过Hystrix开源组件来实现,并且Spring Cloud对Hystrix组件进行了集成,使用起来非常方便。
  2. Hystrix翻译过来是豪猪,由于豪猪身上长满了刺,因此能保护自己不受天敌的伤害,代表了一种防御机制。Hystrix开源框架是Netflix开源的一个延迟和容错的组件,主要用于在远程Provider服务异常时对消费端的RPC进行保护。
  3. 有关Hystrix的详细资料,可参考其官方网站:https://github.com/Netflix/Hystrix
  4. 使用步骤
    1. 引入依赖
      <!--引入Spring Cloud Hystrix依赖--> 
      <dependency>
      		<groupId>org.springframework.cloud</groupId> 
      		<artifactId>spring-cloud-starter-netflix-hystrix</artifactId> 
      </dependency> 
    
    1. 在Spring Cloud架构中,Hystrix是和Feign组合起来使用的,所以需要在应用的属性配置文件中开启Feign对Hystrix的支持:
      feign: 
      	hystrix: 
      		enabled: true   #开启Hystrix对Feign的支持
    
    1. 在启动类上添加@EnableHystrix或者@EnableCircuitBreaker。注意,@EnableHystrix中包含了@EnableCircuitBreaker。
  5. Spring Cloud Hystrix的RPC保护功能包括失败回退、熔断、重试、舱壁隔离等。

2. Spring Cloud Hystrix失败回退

  1. 什么是失败回退呢?当目标Provider实例发生故障时,RPC的失败回退会产生作用,返回一个后备的结果。
  2. 一个失败回退的演示如图所示,有A、B、C、D四个Provider实例,A-Provider和B-Provider对D-Provider发起RPC远程调用,但是D-Provider发生了故障,在A、B收到失败回退保护的情况下,最终会拿到失败回退提供的后备结果(或者Fallback回退结果)。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fih500vY-1658333048282)(/Users/guotengjiang/Library/Application Support/typora-user-images/image-20220719175326718.png)]
  3. 如何设置RPC调用的回退逻辑呢?有两种方式:(1)定义和使用一个Fallback回退处理类。(2)定义和使用一个FallbackFactory回退处理工厂类。
  4. 在进行失败回退时,使用第一种方式的回退类和使用第二种方式的回退工厂类有什么区别呢?答案是:在使用第一种方式的回退类时,远程调用RPC过程中所引发的异常已经被回退逻辑彻底地屏蔽掉了。应用程序不太方便干预,也看不到RPC过程中的具体异常,尽管这些异常对于问题的排除非常有帮助。在使用第二种方式的回退工厂类时,应用程序可以通过Java代码对RPC异常进行拦截和处理,包括进行日志输出。

3. Spring Cloud Hystrix熔断器

  1. 在物理学上,熔断器本身是一个开关装置,用在电路上保护线路过载,当线路中有电器发生短路时,熔断器能够及时切断故障,防止发生过载、发热甚至起火等严重后果。
  2. 分布式架构中的熔断器主要用于RPC接口上,为接口安装上“保险丝”,以防止RPC接口出现拥塞时导致系统压力过大而引起的系统瘫痪,当RPC接口流量过大或者目标Provider出现异常时,熔断器及时切断故障可以起到自我保护的作用。
  3. 为什么说熔断器非常重要呢?如果没有过载保护,在分布式系统中,当被调用的远程服务无法使用时,就会导致请求的资源阻塞在远程服务器上而耗尽。很多时候刚开始可能只是出现了局部小规模的故障,然而由于种种原因,故障影响范围越来越大,最终导致全局性的后果。
  4. 熔断器具体的工作机制为:统计最近RPC调用发生错误的次数,然后根据统计值中的失败比例等信息来决定是否允许后面的RPC调用继续或者快速地失败回退。
  5. 熔断器的3种状态如下:
    1. 关闭(closed):熔断器关闭状态,这也是熔断器的初始状态,此状态下RPC调用正常放行。
    2. 开启(open):失败比例到一定的阈值之后,熔断器进入开启状态,此状态下RPC将会快速失败,然后执行失败回退逻辑。
    3. 半开启(half-open):在打开一定时间之后(睡眠窗口结束),熔断器进入半开启状态,小流量尝试进行RPC调用放行。如果尝试成功,熔断器就变为关闭状态,RPC调用正常;如果尝试失败,熔断器就变为开启状态,RPC调用快速失败。
  6. 熔断器状态之间的相互转换关系如图所示。
  7. 在半开启状态下,允许进行一次RPC调用的尝试,如果实际调用成功,熔断器就会复位到关闭状态,回归正常的模式;但是如果这次RPC调用的尝试失败,熔断器就会返回到开启状态,一直等待到下次半开启状态。
  8. Spring Cloud Hystrix中的熔断器默认是开启的,但是可以通过配置熔断器的参数进行定制。下面是demo-provider微服务中熔断器示例的相关配置:
    hystrix: 
    ... 
    command: 
    	default: 
    		... 
    		circuitBreaker: #熔断器相关配置 
    			enabled: true #是否使用熔断器,默认为true 
    			requestVolumeThreshold: 20 #窗口时间内的最小请求数 
    			sleepWindowInMilliseconds: 5000 #打开后允许一次尝试的睡眠时间,默认配置为5秒           
    			errorThresholdPercentage: 50 #窗口时间内熔断器开启的错误比例,默认配置为50 
    			
         metrics: 
         	rollingStats: 
         		timeInMilliseconds: 10000 #滑动窗口时间 
         		numBuckets: 10 #滑动窗口的时间桶数 
    
  9. 以上用到的Hystrix熔断器相关参数分为两类:熔断器相关参数和滑动窗口相关参数。
  10. 对示例中用到的熔断器的相关参数大致介绍如下:
    1. hystrix.command.default.circuitBreaker.enabled:该配置用来确定熔断器是否用于跟踪RPC请求的运行状态,或者说用于配置是否启用熔断器,默认值为true。
    2. hystrix.command.default.circuitBreaker.requestVolumeThreshold:该配置用于设置熔断器触发熔断的最少请求次数。如果设置为20,那么当一个滑动窗口时间内(比如10秒)收到19个请求时,即使19个请求都失败,熔断器也不会打开变成open状态,默认值为20。
    3. hystrix.command.default.circuitBreaker.errorThresholdPercentage:该配置用于设置错误率阈值,在滑动窗口时间内,当错误率超过此值时,熔断器进入open状态,所有请求都会触发失败回退(fallback),错误率阈值百分比的默认值为50。
    4. hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds:该配置用于设置熔断器的睡眠窗口,具体指的是确定熔断器打开之后多长时间才允许一次请求尝试执行,默认值为5 000毫秒,表示当熔断器打开后,5 000毫秒内会拒绝所有请求,5 000毫秒后熔断器才会进行入half-open状态。
    5. hystrix.command.default.circuitBreaker.forceOpen:如果配置为true,熔断器就会被强制打开,所有请求将触发失败回退(Fallback),默认值为false。
  11. 熔断器的状态转换与Hystrix的滑动窗口的健康统计值(比如失败比例)相关。接下来对示例中使用到的Hystrix健康统计相关配置大致介绍如下:
    1. hystrix.command.default.metrics.rollingStats.timeInMilliseconds:设置统计滑动窗口的持续时间(以毫秒为单位),默认值为10 000毫秒。熔断器的打开会根据一个滑动窗口的统计值来计算,若滑动窗口时间内的错误率超过阈值,则熔断器进入开启状态。滑动窗口将被进一步细分为时间桶(Bucket),滑动窗口的统计值等于窗口内所有时间桶的统计信息的累加,每个时间桶的统计信息包含请求成功(Success)、失败(Failure)、超时(Timeout)、被拒(Rejection)的次数。
    2. hystrix.command.default.metrics.rollingStats.numBuckets:设置一个滑动窗口被划分的时间桶数量,默认值为10。若滑动窗口的持续时间为10 000毫秒,并且一个滑动窗口被划为10个时间桶,则一个时间桶的时间为1秒。所设置的numBuckets(时间桶数量)和timeInMilliseconds(滑动窗口时长)的值有一定关系,必须符合timeInMilliseconds%numberBuckets==0的规则,否则会抛出异常,例如70 000(滑动窗口70 000毫秒)%700(桶数)==0是可以的,但是70000(滑动窗口70 000毫秒)%600(桶数)==400将抛出异常。
  12. 以上有关Hystrix熔断器的配置选项使用的是hystrix.command.default前缀,这些默认配置项将对项目中所有Feign RPC接口生效,除非某个Feign RPC接口进行单独配置。如果需要对某个Feign RPC调用进行特殊的配置,配置项前缀的格式如下:
    hystrix.command.类名#方法名(参数类型列表) 
    
  13. 下面来看一个对单个接口进行特殊配置的例子,以对UserClient类中的Feign RPC接口/detail/v1进行特殊配置为例。
    hystrix: 
    	... 
    	command: 
    		UserClient#detail(Long): #格式为:类名#方法名(参数类型列表) 
    			... 
    			circuitBreaker: #熔断器相关配置 
    				enabled: true #是否使用熔断器,默认为true 
    				requestVolumeThreshold: 20 #至少有20个请求,熔断器才会达到熔断触发的次数阈值 
    				sleepWindowInMilliseconds: 5000 #打开后允许一次尝试的睡眠时间,默认配置为5秒 
    				errorThresholdPercentage: 50 #窗口时间内熔断器开启的错误比例,默认配置为50 
    			metrics: 
    				rollingPercentile: 
    					timeInMilliseconds: 60000 #滑动窗口时间 
    					numBuckets: 600 #滑动窗口的时间桶数 
    					bucketSize: 200 #时间桶内的统计次数 
    
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/itigoitie/article/details/125903324

spring cloud之hystrix_熊二baby的博客-爱代码爱编程

Spring Cloud之Hystrix 前言: Hystrix是Netflix开源的组件翻译为豪猪是一种带刺的动物,顾明思议起到保护作用。容错机制 假如有个服务宕机了 我们就可以fallback 看下官网的图说的很详细

springcloud之hystrix_编码蔡徐坤的博客-爱代码爱编程

简介 Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时,异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分

spring cloud之hystrix服务降级-爱代码爱编程

Hystrix引入 在微服务场景中,由于大部分微服务采用同步接口调用,而且多个领域相关的微服务会部署在同一个进程中,很容易发生“雪崩效应”,即某个微服务提供者故障,导致调用该微服务的消费者、或者与故障微服务合设在同一个进程

springcloud 之 hystrix-爱代码爱编程

Hystrix是什么 Hystrix是一个容错组件,是Netflix开源的一个类库,实现了超时和断路器模式。   Hystrix为了什么 Hystrix被设计的目标是: 对通过第三方客户端库访问的依赖项(通常是通过网络)的延迟和故障进行保护和控制。在复杂的分布式系统中阻止级联故障。快速失败,快速恢复。回退,尽可能优雅地降级。启用近实时监控、警报和

Hystrix的使用,及@Hystrix参数说明-爱代码爱编程

Hystrix用法及注解用法 pom.xml 导入hystrix和eureka客户端坐标 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud

Spring cloud之Hystrix 配置-爱代码爱编程

目录 1、hystrix可配置属性类型 2、Hystrix参数的覆盖优先级 3、属性配置参数 3.1、Execution    3.1.1、execution.isolation.strategy    3.1.2、execution.isolation.thread.timeoutInMilliseconds    3.1.3、execut

springcloud之Hystrix-爱代码爱编程

文章目录 1、Hystrix概述1.1、服务降级1.2、服务熔断1.3、服务限流2、模拟高并发场景下异常2.1、服务端-项目构建2.2、Jmeter高并发访问2.3、消费端-项目构建3、服务降级的处理方式3.1、消费端设置服务降级3.2、消费端解耦式设置服务降级(不在Controller业务层)3.3、两种方式的区别4、服务熔断的处理方式4.1、服

Spring Cloud 之Hystrix Dashboard-爱代码爱编程

文章目录 前言一、理论部分1、HystrixDashboard2、监控方式3、监控面板信息介绍4、Turbine二、实践部分1、hystrix-dashboard使用1、创建一个hystrix-dashboard模块2、添加相关依赖包3、在application.properties文件中配置4、在启动类上添加注解5、启动服务6、项目搭建异常及解决

springcloud——hystrix详解_springcloud hystrix-爱代码爱编程

目录 一、Hystrix介绍 1、分布式系统面临问题 2、Hystrix概念 3、Hystrix作用 (1)服务降级 (2)服务熔断 二、服务降级案例 1、搭建Eureka服务端 (1)创建maven工程 (2)导入依赖 (3)配置application.yml (4)创建主启动类 (5)启动Eureka注册中心 2、搭建服务提

springcloud-爱代码爱编程

SpringCloud-Hystrix简单配置和使用 Hystrix官方文档: Introduction · Hystrix Document (gitbooks.io) 一.简介说明 Hystrix 供分布