Spring Cloud Gateway配置熔断CircuitBreaker
我们使用的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相关推荐
- Spring Cloud Gateway配置详解-过滤器
Spring Cloud Gateway-过滤器 本节将为大家详细介绍Spring Could Gateway 内置过滤器相关内容. Spring Cloud Gateway 过滤器为大家提供了修改特 ...
- Spring Cloud Gateway –配置简单路由
可以将Spring Cloud Gateway视为Spring Cloud Netflix Zuul项目的后续产品,并有助于在微服务环境中实现Gateway模式 . 它建立在 Spring Boot ...
- 微服务网关spring cloud gateway入门详解
1.API网关 API 网关是一个处于应用程序或服务( REST API 接口服务)之前的系统,用来管理授权.访问控制和流量限制等,这样 REST API 接口服务就被 API 网关保护起来,对所有的 ...
- Spring Cloud(10)——新一代网关Spring Cloud Gateway
文章目录 Spring Cloud(10)--新一代网关Spring Cloud Gateway 1.背景知识--API网关 2.Spring Cloud Gateway 详细概述 3.Spring ...
- spring react_使用Spring Cloud Gateway保护React式微服务
spring react 朋友不允许朋友写用户身份验证. 厌倦了管理自己的用户? 立即尝试Okta的API和Java SDK. 数分钟之内即可在任何应用程序中对用户进行身份验证,管理和保护. 所以你想 ...
- 使用Spring Cloud Gateway保护反应式微服务
朋友不允许朋友写用户身份验证. 厌倦了管理自己的用户? 立即尝试Okta的API和Java SDK. 在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护. 所以你想完全反应,是吗? 大! ...
- react hooks_使用Spring Cloud Gateway保护React式微服务
react hooks 朋友不允许朋友写用户身份验证. 厌倦了管理自己的用户? 立即尝试Okta的API和Java SDK. 数分钟之内即可在任何应用程序中对用户进行身份验证,管理和保护. 所以你想完 ...
- 深入学习spring cloud gateway 限流熔断
目前,Spring Cloud Gateway是仅次于Spring Cloud Netflix的第二个最受欢迎的Spring Cloud项目(就GitHub上的星级而言).它是作为Spring Clo ...
- 进一步学习spring cloud gateway的 限流熔断
目前,Spring Cloud Gateway是仅次于Spring Cloud Netflix的第二个最受欢迎的Spring Cloud项目(就GitHub上的星级而言).它是作为Spring Clo ...
最新文章
- Xamarin Android权限请求
- data:image data url 文件上传
- 区块链基础学习(二)
- 【DevCloud · 敏捷智库】Scrum和看板如何选择
- linux ssh v6,linux – TCP / IPv6通过ssh隧道
- 动态规划实战16 leetcode-198. House Robber
- Word中插入图片只显示一部分
- 客户端性能测试工具-Wetest、cude PC
- 跟着海盗头子创业是一种怎样的体验?
- Git的author与committer的区别
- 琪琪格不因为漂亮而自信
- 30天学习一部无字幕美剧-《老友记》
- 快速搭建接口自动化平台
- Little Keng
- 流浪是对另一种生活的执着
- 路由器重温——ISIS路由-2
- 都2022年了,我不允许还有人不知道poi-ti这么好用的库
- Problem M: 薪酬计算 之二
- wh 问句、祈使句、 感叹句
- 正大国际期货:你身边有朋友或者亲人做期货挣钱的没有?
热门文章
- [小说]魔王冢(59)万事俱备
- UEM“探针”技术及用户体验管理
- 一期项目实战:问卷调查—人事管理系统
- opencv python gpu加速_在Windows上使用OpenCV和Python进行硬件加速解码(MSMT/IntelMFX/FFMPEG/any-backend)...
- 【硬件】Z7_DDR_pcb layout(纯干货,建议收藏)
- 第四篇 再读Spring 之BeanDefinition注册
- Python-shogun安装问题
- 项目管理全过程最佳实践(下)
- 学生开发者对于微软技术的反馈
- 安卓测试和iOS测试的区别-总结篇