我们使用的SpringCloud版本是Hoxton.SR9,小于G版本的是不支持CircuitBreaker的

CircuitBreaker原理

CircuitBreaker是由一个有限状态机实现的,其中包含三个一般性状态:

CLOSED(关闭), OPEN(打开), HALF_OPEN(半开)

和两个特定状态:DISABLED(禁用), FORCED_OPEN(强开)

工作步骤:

1.启动时断路器为CLOSE状态
2.达到一定请求数后计算请求失败率,达到或高于指定失败率后,断路进入open状态,阻拦所有请求
3.开启一段时间(自定义)时间后,断路器变为halfOpen状态,重新计算请求失败率。
4.halfOpen错误率低于指定失败率后,断路进入close状态,否则进入open状态
5.循环....1-4.

滑动窗口(sliding window)

CircuitBreaker使用滑动窗口(sliding window)存储和统计调用的结果。

基于计数的滑动窗口(count-based sliding window):基于计数的滑动窗口统计最近N次调用的结果

基于时间的滑动窗口(time-based sliding window):基于时间的滑动窗口统计最近N秒的调用结果

Spring Cloud Gateway配置CircuitBreaker 一般会用到如下2种GatewayFilter Factory:

  • Hystrix GatewayFilter Factory
  • Spring Cloud CircuitBreaker GatewayFilter Factory

使用Hystrix GatewayFilter Factory需要依赖spring-cloud-starter-netflix-hystrix。而netflix-hystrix可能以后不再有更新了,所以推荐使用Spring Cloud CircuitBreaker GatewayFilter Factory。

一、使用Hystrix GatewayFilter Factory

引入依赖

<!-- 通过Hystrix GatewayFilter Factory/Spring Cloud CircuitBreaker GatewayFilter Factory使用Hystrix都需要引用该依赖 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

application.properties中可以采用如下方式分别配置:

#路由配置,见RouteDefinition
#id:路由标识,具有唯一性
spring.cloud.gateway.routes[0].id=provider-http
#url:目标服务地址,请求转发后的地址,lb:协议表示开启负载均衡
#uri: lb://renren-api
spring.cloud.gateway.routes[0].uri=lb://providerService
#predicates:断言/路由条件,匹配 HTTP请求内容
#转发地址格式: uri/nacos/provider/**
spring.cloud.gateway.routes[0].predicates[0]=Path=/provider-http/**
#熔断限流过滤器Hystrix|CircuitBreaker
spring.cloud.gateway.routes[0].filters[0].name=Hystrix
#使用断路器名称
spring.cloud.gateway.routes[0].filters[0].args[name]=backendProviderA
#降级回调URI
spring.cloud.gateway.routes[0].filters[0].args[fallbackUri]=forward:/fallback/hystrix

二、使用Spring Cloud CircuitBreaker GatewayFilter Factory方式

#路由配置,见RouteDefinition
#id:路由标识,具有唯一性
spring.cloud.gateway.routes[0].id=provider-http
#url:目标服务地址,请求转发后的地址,lb:协议表示开启负载均衡
#uri: lb://renren-api
spring.cloud.gateway.routes[0].uri=lb://providerService
#predicates:断言/路由条件,匹配 HTTP请求内容
#转发地址格式: uri/nacos/provider/**
spring.cloud.gateway.routes[0].predicates[0]=Path=/provider-http/**
#熔断限流过滤器Hystrix|CircuitBreaker
spring.cloud.gateway.routes[0].filters[0].name=CircuitBreaker
#使用断路器名称
spring.cloud.gateway.routes[0].filters[0].args[name]=backendProviderA
#降级回调URI
spring.cloud.gateway.routes[0].filters[0].args[fallbackUri]=forward:/fallback/hystrix

Spring Cloud CircuitBreaker API是对多种断路器提供的一层抽象API,Spring Cloud CircuitBreaker本身提供了对4种断路器组件的支持:

Netfix Hystrix
Resilience4J
Sentinel
Spring Retry

但如果要在Spring Cloud Gateway中使用CircuitBreaker功能,则只能使用其中的2个组件:

Netfix Hystrix
Resilience4J

在gateway中两种CircuitBreaker的自动配置类

两种熔断器的过滤器工厂

使用hystrix配置熔断策略

配置同上面的Hystrix GatewayFilter Factory一样

 策略配置类

@Bean
public HystrixCircuitBreakerFactory defaultConfig() {HystrixCircuitBreakerFactory circuitBreakerFactory = new HystrixCircuitBreakerFactory();circuitBreakerFactory.configureDefault(id -> HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey(id)).andCommandPropertiesDefaults(HystrixCommandProperties.Setter().withExecutionTimeoutInMilliseconds(4000)));return circuitBreakerFactory;
}

使用resilience4j配置熔断策略

<!-- 通过Spring Cloud CircuitBreaker GatewayFilter Factory使用resilience4j需要引用该依赖 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
</dependency>

设置配置类,在配置类里配置策略

@Bean
public ReactiveResilience4JCircuitBreakerFactory defaultCustomizer() {//自定义断路器配置CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom() //// 滑动窗口的类型为时间窗口.slidingWindowType(CircuitBreakerConfig.SlidingWindowType.TIME_BASED)// 时间窗口的大小为60秒.slidingWindowSize(60)// 在单位时间窗口内最少需要5次调用才能开始进行统计计算.minimumNumberOfCalls(5)// 在单位时间窗口内调用失败率达到50%后会启动断路器.failureRateThreshold(50)// 允许断路器自动由打开状态转换为半开状态.enableAutomaticTransitionFromOpenToHalfOpen()// 在半开状态下允许进行正常调用的次数.permittedNumberOfCallsInHalfOpenState(5)// 断路器打开状态转换为半开状态需要等待60秒.waitDurationInOpenState(Duration.ofSeconds(60))// 所有异常都当作失败来处理.recordExceptions(Throwable.class).build();ReactiveResilience4JCircuitBreakerFactory factory = new ReactiveResilience4JCircuitBreakerFactory();factory.configureDefault(id -> new Resilience4JConfigBuilder(id)//超时规则,默认1s.timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofMillis(10000)).build())//设置断路器配置.circuitBreakerConfig(circuitBreakerConfig).build());return factory;
}

使Resilience4j支持配置文件配置策略

需要引入依赖

<!-- resilience4j配置文件支持,版本需要和Spring cloud中resilience4j的版本匹配 -->
<!-- resilience4j默认是不支持配置文件进行配置的,需要引入该依赖 -->
<dependency><groupId>io.github.resilience4j</groupId><artifactId>resilience4j-spring-boot2</artifactId><version>1.3.1</version>
</dependency>

在配置文件里配置策略

#=======================resilience4j断路器系统默认配置=======================
#失败率,错误率达到或高于该值则进入open状态
resilience4j.circuitbreaker.configs.default.failureRateThreshold=50
#慢调用阀值,请求执行的时间大于该值时会标记为慢调用
resilience4j.circuitbreaker.configs.default.slowCallDurationThreshold=60s
#慢调用熔断阀值,当慢调用率达到或高于该值时,进入open状态
resilience4j.circuitbreaker.configs.default.slowCallRateThreshold=100
#时间窗口,用于计算失败率
resilience4j.circuitbreaker.configs.default.slidingWindowSize=60
#状态收集器类型COUNT_BASED:根据数量计算(slidingWindowSize为次数) TIME_BASED:根据时间计算(slidingWindowSize为秒数)
resilience4j.circuitbreaker.configs.default.slidingWindowType=TIME_BASED
#计算错误率的最小请求数,不足最小调用次数不会触发任何变化
resilience4j.circuitbreaker.configs.default.minimumNumberOfCalls=10
#是否自动进入halfOpen状态,默认false-一定时间后进入halfopen,ture-需要通过接口执行。
resilience4j.circuitbreaker.configs.default.automaticTransitionFromOpenToHalfOpenEnabled=true
#进入halfOpen状态时,可以被调用次数,计算这些请求的失败率,低于设置的失败率,则断路器变为close状态,否则断路器变为open状态
resilience4j.circuitbreaker.configs.default.permittedNumberOfCallsInHalfOpenState=2
#断路器从OPEN状态变成HALF_OPEN状态需要的等待时间,即熔断多久后开始尝试访问被熔断的服务。
resilience4j.circuitbreaker.configs.default.waitDurationInOpenState=30s
#被计为失败的异常集合,默认情况下所有异常都为失败。
resilience4j.circuitbreaker.configs.default.recordExceptions[0]=java.lang.Exception
#不会被计为失败的异常集合,优先级高于recordExceptions。
resilience4j.circuitbreaker.configs.default.ignoreExceptions[0]=java.lang.IllegalStateException
#配置某个实例(例如backendProviderA)的resilience4j配置
resilience4j.circuitbreaker.instances[backendProviderA].baseConfig=default
#配置某个实例(例如backendProviderB)的resilience4j配置
resilience4j.circuitbreaker.instances[backendProviderB].failureRateThreshold=10

添加拦截器,注入从配置文件里读取的策略

@Bean
public ReactiveResilience4JCircuitBreakerFactory defaultCustomizer() {ReactiveResilience4JCircuitBreakerFactory factory = new ReactiveResilience4JCircuitBreakerFactory();factory.configureDefault(id -> new Resilience4JConfigBuilder(id)//超时规则,默认1s.timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofMillis(10000)).build()).build());
//添加自定义拦截器factory.configureCircuitBreakerRegistry(circuitBreakerRegistry);return factory;
}

超时问题

使用Resilience4j在默认的配置下很容易超时(超时时间默认是1秒),这里通过在配置类里设置timeoutDuration超时时间,将其设置的大一些,这里设置成10秒

@Bean
public ReactiveResilience4JCircuitBreakerFactory defaultCustomizer(CircuitBreakerRegistry circuitBreakerRegistry) {ReactiveResilience4JCircuitBreakerFactory factory = new ReactiveResilience4JCircuitBreakerFactory();factory.configureDefault(id -> new Resilience4JConfigBuilder(id)//超时规则,默认1s.timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofMillis(10000)).build()).build());//添加自定义拦截器factory.configureCircuitBreakerRegistry(circuitBreakerRegistry);return factory;}

参考:https://blog.csdn.net/netyeaxi/article/details/104469248/

https://blog.csdn.net/netyeaxi/article/details/104237289

https://blog.csdn.net/netyeaxi/article/details/104237289

Spring Cloud Gateway配置熔断CircuitBreaker相关推荐

  1. Spring Cloud Gateway配置详解-过滤器

    Spring Cloud Gateway-过滤器 本节将为大家详细介绍Spring Could Gateway 内置过滤器相关内容. Spring Cloud Gateway 过滤器为大家提供了修改特 ...

  2. Spring Cloud Gateway –配置简单路由

    可以将Spring Cloud Gateway视为Spring Cloud Netflix Zuul项目的后续产品,并有助于在微服务环境中实现Gateway模式 . 它建立在 Spring Boot ...

  3. 微服务网关spring cloud gateway入门详解

    1.API网关 API 网关是一个处于应用程序或服务( REST API 接口服务)之前的系统,用来管理授权.访问控制和流量限制等,这样 REST API 接口服务就被 API 网关保护起来,对所有的 ...

  4. Spring Cloud(10)——新一代网关Spring Cloud Gateway

    文章目录 Spring Cloud(10)--新一代网关Spring Cloud Gateway 1.背景知识--API网关 2.Spring Cloud Gateway 详细概述 3.Spring ...

  5. spring react_使用Spring Cloud Gateway保护React式微服务

    spring react 朋友不允许朋友写用户身份验证. 厌倦了管理自己的用户? 立即尝试Okta的API和Java SDK. 数分钟之内即可在任何应用程序中对用户进行身份验证,管理和保护. 所以你想 ...

  6. 使用Spring Cloud Gateway保护反应式微服务

    朋友不允许朋友写用户身份验证. 厌倦了管理自己的用户? 立即尝试Okta的API和Java SDK. 在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护. 所以你想完全反应,是吗? 大! ...

  7. react hooks_使用Spring Cloud Gateway保护React式微服务

    react hooks 朋友不允许朋友写用户身份验证. 厌倦了管理自己的用户? 立即尝试Okta的API和Java SDK. 数分钟之内即可在任何应用程序中对用户进行身份验证,管理和保护. 所以你想完 ...

  8. 深入学习spring cloud gateway 限流熔断

    目前,Spring Cloud Gateway是仅次于Spring Cloud Netflix的第二个最受欢迎的Spring Cloud项目(就GitHub上的星级而言).它是作为Spring Clo ...

  9. 进一步学习spring cloud gateway的 限流熔断

    目前,Spring Cloud Gateway是仅次于Spring Cloud Netflix的第二个最受欢迎的Spring Cloud项目(就GitHub上的星级而言).它是作为Spring Clo ...

最新文章

  1. Xamarin Android权限请求
  2. data:image data url 文件上传
  3. 区块链基础学习(二)
  4. 【DevCloud · 敏捷智库】Scrum和看板如何选择
  5. linux ssh v6,linux – TCP / IPv6通过ssh隧道
  6. 动态规划实战16 leetcode-198. House Robber
  7. Word中插入图片只显示一部分
  8. 客户端性能测试工具-Wetest、cude PC
  9. 跟着海盗头子创业是一种怎样的体验?
  10. Git的author与committer的区别
  11. 琪琪格不因为漂亮而自信
  12. 30天学习一部无字幕美剧-《老友记》
  13. 快速搭建接口自动化平台
  14. Little Keng
  15. 流浪是对另一种生活的执着
  16. 路由器重温——ISIS路由-2
  17. 都2022年了,我不允许还有人不知道poi-ti这么好用的库
  18. Problem M: 薪酬计算 之二
  19. wh 问句、祈使句、 感叹句
  20. 正大国际期货:你身边有朋友或者亲人做期货挣钱的没有?

热门文章

  1. [小说]魔王冢(59)万事俱备
  2. UEM“探针”技术及用户体验管理
  3. 一期项目实战:问卷调查—人事管理系统
  4. opencv python gpu加速_在Windows上使用OpenCV和Python进行硬件加速解码(MSMT/IntelMFX/FFMPEG/any-backend)...
  5. 【硬件】Z7_DDR_pcb layout(纯干货,建议收藏)
  6. 第四篇 再读Spring 之BeanDefinition注册
  7. Python-shogun安装问题
  8. 项目管理全过程最佳实践(下)
  9. 学生开发者对于微软技术的反馈
  10. 安卓测试和iOS测试的区别-总结篇