目录
2:CircuitBreaker的实现Resilience4J
4:服务熔断(CircuitBreaker) 请求判断成功率
1:什么是CircuitBreaker
CircuitBreaker是断路器的意思,由于原来的SpringCoud的hystrix停更,所以springcloud社区推出了的新断路器,用来进行springcloud的服务降级、限流、熔断
Spring Cloud Circuit BreakerCircuitBreaker官网:Spring Cloud Circuit Breaker
由于Spring Cloud断路器(CircuitBreaker)提供了不同断路器实现的抽象,
支持的实现有两种Resilience4J和Spring Retry的实现。
在Spring Cloud CircuitBreaker中实现的API位于Spring Cloud Commons中。这些API的使用文档位于Spring Cloud Commons文档中。
2:CircuitBreaker的实现Resilience4J
我们主要学习Resilience4J,Resilience4J的官网
Resilience4j是受到Netflix Hystrix的启发,为Java8和函数式编程所设计的轻量级容错框架。整个框架只是使用了Varr的库,不需要引入其他的外部依赖。与此相比,Netflix Hystrix对Archaius具有编译依赖,而Archaius需要更多的外部依赖,例如Guava和Apache Commons Configuration。
Resilience4j提供了提供了一组高阶函数(装饰器),包括断路器,限流器,重试机制,隔离机制。你可以使用其中的一个或多个装饰器对函数式接口,lambda表达式或方法引用进行装饰。这么做的优点是你可以选择所需要的装饰器进行装饰。
在使用Resilience4j的过程中,不需要引入所有的依赖,只引入需要的依赖即可。
以上来自官网,这里不粘贴太多了,详情GitHub官网。
3:Resilience4J的主要模块和架构
3.1:主要模块
主要模块的作用是方便我们根据模块,了解不同的功能实现
resilience4j-circuitbreaker: 熔断
resilience4j-ratelimiter: 限流
resilience4j-bulkhead: 隔离
resilience4j-retry: 自动重试(同步,异步)
resilience4j-cache: 结果缓存
resilience4j-timelimiter: 超时处理
3.2:Resilience4J的状态
Resilience4J的状态装换,便于我们理解限流、降级、熔断的功能实现
断路器有三个普通状态
1:关闭(CLOSED):
服务可以正常访问,所有请求都能接受
2:开启(OPEN):
服务不能访问,当我们设置一些请求按照我们的规则,比如10个请求在滑动窗口下成功率小于50%,也就是大于5个失败,服务进入关闭状态,不能访问。新的请求走fallbackMethod,提示服务繁忙
3:半开(HALFOPEN)
按照我们设置的规则,比如由于10个请求成功率低的原因服务进入open状态,不能访问。
但是过了N秒(我们自己设置)进入半开状态,可以允许指定的请求再次打进来比如只进来2个,不是所有请求,重新计算成功率,这个状态就是半开。
在半开状态下重新计算成功率,成功率达标,则说明服务健康了,服务进入关闭状态,可以大量访问。否则进入open状态,不能访问。再次开启这个循环往复
还有两个特殊状态:禁用(DISABLED)、强制开启(FORCED OPEN)。
4:服务熔断(CircuitBreaker) 请求判断成功率
为什么需要对服务进行熔断降级:
当下游的服务因为某种原因突然变得不可⽤或响应过慢,上游服务会一直占用线程资源,服务变得不可用。上游服务为了保证⾃⼰整体服务的可⽤性,不再继续调⽤⽬标服务,直接返回,快速释放资源。如果⽬标服务情况好转则恢复调⽤。熔断器模型,如图所示
4.1:基于计数器的滑动窗口
4.1.1:导包resilience4j的依赖包
<properties>
<java.version>17</java.version>
<spring-cloud.version>2023.0.3</spring-cloud.version>
</properties>
<!--circuitbreaker 断路器的resilience4j 实现 依赖aop -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>