当前位置: 代码迷 >> 综合 >> SpringCloud-服务降级断路器-Hystrix
  详细解决方案

SpringCloud-服务降级断路器-Hystrix

热度:1   发布时间:2023-12-12 11:47:28.0

一、简介

在分布式环境中,许多服务依赖项中的一些必然会失败。Hystrix是一个库,通过添加延迟容忍和容错逻辑,帮助你控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点、停止级联失败和提供回退选项来实现这一点,所有这些都可以提高系统的整体弹性。

二、Hystrix中的概念

一.服务雪崩

多个微服务之间,微服务A调用B,B调用C,C再调用其他的微服务,这就是所谓的扇出,如果调用链路上有一个微服务响应时间过长或者不可用,对于该服务的调用就会越来越占用系统资源,进而引发系统崩溃,称之为服务雪崩。

二.服务降级(fallback)

服务器繁忙,请稍后再试,不让客户端等待太久,返回一个友好的提示,返回托底方法。

三.服务限流(flowlimit)

严禁一窝蜂的进行拥挤,排队,每次处理N个,有序进行,如果超出限流,则进行降级,返回一个友好的提示,返回托底方法。

四.服务熔断(break)

熔断机制是对服务链路的保护机制,如果链路上的某个服务不可访问,调用超时,发生异常等,服务会触发降级返回托底数据,然后熔断服务的调用(失败率达到某个阀值服务标记为短路状态),当检查到该节点能正常使用时服务会快速恢复。

简单理解就是当服务不可访问了或者服务器报错了或者服务调用超过一定时间没返回结果,就立马触发熔断机制配合降级返回预先准备的兜底数据返回,不至于长时间的等待服务的相应造成大量的请求阻塞,也不至于返回一些错误信息给客户端,而是返回一些兜底数据。

服务器发生熔断之后,在一定时间后会对其进行重试,如果仍然是异常状态,则继续熔断,并且反复的重试,如果返回正常,则服务器取消熔断状态。

发生熔断的三个重要参数,这三个参数在都满足的情况下,才会发生熔断。

1、快照时间窗

单位时间内,就是指的一定时间内,默认为10S.

2、请求总数阈值

但快照时间窗内,请求总数必须超过一定数量,才有资格进行熔断,默认为20,即10秒内,如果服务调用次数不超过20次,就没有资格进行熔断。

3、错误比例阈值

在单位时间内,请求总数超过了阈值的情况下,如果调用异常比例超过一定的限额,默认为50%。以默认值举例,如果在10秒之内,超过20次调用,并且异常比例在百分之50以上,才会进行熔断。

二、Hystrix资源隔离策略

信号隔离虽然开销比较小,但是还是建议的是线程隔离,默认使用的也是线程隔离。

一.信号量策略配置

用于隔离本地代码或可快速返回的远程调用可以直接使用信号量隔离,降低线程隔离的上下文切换开销。如 memcached,redis。
线程隔离会带来线程开销,有些场景(比如无网络请求场景)可能会因为用开销换隔离得不偿失,为此 hystrix 提供了信号量隔离。
主要适用于并发需求不大的依赖调用,因为如果并发需求较大,相应的信号量的数量就要设置得够大,因为 Tomcat 线程与处理线程为同一个线程,那么这个依赖调用就会占用过多的 Tomcat 线程资源,有可能会影响到其他服务的接收。

二.线程隔离策略配置

执行依赖代码的线程与请求线程(比如 Tomcat 线程)分离,请求线程可以自由控制离开的时间,这也是我们通常说的异步编程,Hystrix 是结合 RxJava 来实现的异步编程。

通过为每个包裹了 HystrixCommand 的 API 接口设置独立的、固定大小的线程池(hystrix.threadpool.default.coreSize)来控制并发访问量,当线程饱和的时候可以拒绝服务,防止依赖问题扩散。

三、Srping Cloud整合Hystrix案例

一.依赖

        <!--新增hystrix--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency>

二.配置文件

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

三.代码

1、主启动类开启

@SpringBootApplication
@EnableEurekaClient
//注解开启断路器功能
@EnableCircuitBreaker
public class CloudProviderHystrixPayment8001Application {
    public static void main(String[] args) {
    SpringApplication.run(CloudProviderHystrixPayment8001Application.class, args);System.out.println("启动成功");}}

2、配置熔断返回

配置一个方法

    public String paymentCircuitBreakerFallback(Integer id) {
    return Thread.currentThread().getName() + "\t" + "id 不能负数或超时或自身错误,请稍后再试,/(ㄒoㄒ)/~~ id: " + id;}

3、使用熔断

    /*** 服务熔断 超时、异常、都会触发熔断* 1、默认是最近10秒内收到不小于10个请求,<br/>* 2、并且有60%是失败的<br/>* 3、就开启断路器<br/>* 4、开启后所有请求不再转发,降级逻辑自动切换为主逻辑,减小调用方的响应时间<br/>* 5、经过一段时间(时间窗口期,默认是5秒),断路器变为半开状态,会让其中一个请求进行转发。<br/>* &nbsp;&nbsp;5.1、如果成功,断路器会关闭,<br/>* &nbsp;&nbsp;5.2、若失败,继续开启。重复4和5<br/>** @param id* @return*/@HystrixCommand(fallbackMethod = "paymentCircuitBreakerFallback", commandProperties = {
    @HystrixProperty(name = "circuitBreaker.enabled", value = "true"),/* 是否开启断路器*/@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),// 请求次数@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), // 时间窗口期@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"),// 失败率达到多少后跳闸
// @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "5000")// 超时处理})public String paymentCircuitBreaker(Integer id) {
    if (id < 0) {
    throw new RuntimeException("******id 不能负数");}String serialNumber = IdUtil.simpleUUID();return Thread.currentThread().getName() + "\t" + "调用成功,流水号: " + serialNumber;}

可以在方法上单独熔断,也可以在类上进行统一配置。

  相关解决方案