Yuandupier

Yuandupier

Spring Cloud Gateway添加熔断

42
0
0
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://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#spring-cloud-circuitbreaker-filter-factory

代码地址:https://github.com/yzh19961031/SpringCloudDemo/tree/main/gateway