Spring Cloud Gateway添加熔断
编辑2022-05-26
前言
本文主要介绍如何在Spring Cloud Gateway中添加熔断处理。
使用的软件版本如下:
Spring Boot 2.6.7
Spring Cloud 2021.0.2
添加依赖
Spring Cloud提供了一个开箱即用的熔断实现Resilience4j,在后续高版本的Spring Cloud中,剔除了Spring Cloud Netflix中很多组件,Resilience4j就是用来替代Neflix Hystrix。本文中采用Resilience4j来实现熔断。
添加如下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
</dependency>
添加熔断配置
熔断发生回调
在gateway中,添加熔断的处理逻辑,这边是熔断发生时,请求到具体的接口/error。
/**
* 熔断处理
*
* @author yuanzhihao
* @since 2022/5/18
*/
@RestController
public class ErrorController {
@GetMapping("/error")
public Mono<String> error() {
return Mono.just("Service Unreachable");
}
}
覆盖熔断默认配置
在实际开发中,默认的配置比如执行的超时时间可能不满足实际开发需求,可以进行重写定制,部分参数大家可以自行参考源码:
/**
* 自定义熔断配置 设置默认超时时间为30s
*
* @author yuanzhihao
* @since 2022/5/24
*/
@Configuration
public class Resilience4JConfig {
@Bean
public Customizer<ReactiveResilience4JCircuitBreakerFactory> defaultCustomizer() {
TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()
.timeoutDuration(Duration.ofSeconds(30))
.build();
return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
.circuitBreakerConfig(CircuitBreakerConfig.ofDefaults())
.timeLimiterConfig(timeLimiterConfig)
.build());
}
}
网关添加过滤器配置
Spring Cloud Gateway中提供了一个熔断过滤器,可以直接拿过来使用,只要在配置文件中添加上就ok。我这边将它放到默认的全局过滤器配置中,配置如下:
spring:
application:
name: gateway
cloud:
gateway:
default-filters:
- name: CircuitBreaker
args:
name: myCircuitBreaker
fallbackUri: forward:/error # 默认熔断
验证
启动程序,关闭下游某个微服务,当路由请求过来时,可以看到熔断已经生效。
结语
代码地址:https://github.com/yzh19961031/SpringCloudDemo/tree/main/gateway