Spring Cloud Gateway的断路器(CircuitBreaker)功能(1)

server:

#服务端口

port: 8081

spring:

application:

name: circuitbreaker-gateway

cloud:

gateway:

routes:

  • id: path_route

uri: http://127.0.0.1:8082

predicates:

  • Path=/hello/**

filters:

  • name: CircuitBreaker

args:

name: myCircuitBreaker

  • 启动类:

package com.bolingcavalry.circuitbreakergateway;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class CircuitbreakerApplication {

public static void main(String[] args) {

SpringApplication.run(CircuitbreakerApplication.class,args);

}

}

  • 配置类如下,这是断路器相关的参数配置:

package com.bolingcavalry.circuitbreakergateway.config;

import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;

import io.github.resilience4j.timelimiter.TimeLimiterConfig;

import org.springframework.cloud.circuitbreaker.resilience4j.ReactiveResilience4JCircuitBreakerFactory;

import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JConfigBuilder;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import java.time.Duration;

@Configuration

public class CustomizeCircuitBreakerConfig {

@Bean

public ReactiveResilience4JCircuitBreakerFactory defaultCustomizer() {

CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom() //

.slidingWindowType(CircuitBreakerConfig.SlidingWindowType.TIME_BASED) // 滑动窗口的类型为时间窗口

.slidingWindowSize(10) // 时间窗口的大小为60秒

.minimumNumberOfCalls(5) // 在单位时间窗口内最少需要5次调用才能开始进行统计计算

.failureRateThreshold(50) // 在单位时间窗口内调用失败率达到50%后会启动断路器

.enableAutomaticTransitionFromOpenToHalfOpen() // 允许断路器自动由打开状态转换为半开状态

.permittedNumberOfCallsInHalfOpenState(5) // 在半开状态下允许进行正常调用的次数

.waitDurationInOpenState(Duration.ofSeconds(5)) // 断路器打开状态转换为半开状态需要等待60秒

.recordExceptions(Throwable.class) // 所有异常都当作失败来处理

.build();

ReactiveResilience4JCircuitBreakerFactory factory = new ReactiveResilience4JCircuitBreakerFactory();

factory.configureDefault(id -> new Resilience4JConfigBuilder(id)

.timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofMillis(200)).build())

.circuitBreakerConfig(circuitBreakerConfig).build());

return factory;

}

}

  • 上述代码有一次需要注意:timeLimiterConfig方法设置了超时时间,服务提供者如果超过200毫秒没有响应,Spring Cloud Gateway就会向调用者返回失败

  • 开发完成了,接下来要考虑的是如何验证

单元测试类

  • 为了验证Spring Cloud Gateway的断路器功能,咱们可以用Junit单元测试来精确控制请求参数和请求次数,测试类如下,可见测试类会连续发一百次请求,在前五十次中,请求参数始终在0和1之间切换,参数等于1的时候,接口会有500毫秒延时,超过了Spring Cloud Gateway的200毫秒超时限制,这时候就会返回失败,等失败多了,就会触发断路器的断开:

package com.bolingcavalry.circuitbreakergateway;

import io.github.resilience4j.circuitbreaker.CircuitBreaker;

<
  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值