Resilience4j的使用

本文详细介绍Resilience4j库中CircuitBreaker、Retry和TimeLimiter组件的配置与使用方法,通过实例演示如何在Java应用中实现熔断、重试和超时策略,提升系统的稳定性和响应能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

Resilience4j的CircuitBreaker使用

此方法有点复杂,看如下图:

 

  1. failureRateThreshold,默认为50,即失败率阈值为50%
  2. ringBufferSizeInHalfOpenState,设置当断路器处于HALF_OPEN状态下的ring buffer的大小,它存储了最近一段时间请求的成功失败状态,默认为10
  3. ringBufferSizeInClosedState,设置当断路器处于CLOSED状态下的ring buffer的大小,它存储了最近一段时间请求的成功失败状态,默认为100
  4. waitDurationInOpenState,用来指定断路器从OPEN到HALF_OPEN状态等待的时长,默认是60秒
  5. recordFailurePredicate,用于判断哪些异常应该算作失败纳入断路器统计,默认是Throwable类型
  6. automaticTransitionFromOpenToHalfOpenEnabled,当waitDurationInOpenState时间一过,是否自动从OPEN切换到HALF_OPEN,默认为true
CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
        .failureRateThreshold(30)
        .waitDurationInOpenState(Duration.ofMillis(1000))
        .ringBufferSizeInHalfOpenState(5)
        .ringBufferSizeInClosedState(10)
        .build();

final Random random = new Random(100);
CircuitBreakerRegistry circuitBreakerRegistry = CircuitBreakerRegistry.of(circuitBreakerConfig);
CircuitBreaker circuitBreaker = circuitBreakerRegistry.circuitBreaker("uniqueName", circuitBreakerConfig);
CheckedFunction0<String> decoratedSupplier = CircuitBreaker
        .decorateCheckedSupplier(circuitBreaker, () -> {
            long num = random.nextInt(100);
            if (num > 0 && num < 30) {
                throw new RuntimeException("EX:" + num);
            }
            return "" + num;
        });
int index = 0;
for (; index < 100; index++) {
    Try<String> result = Try.of(decoratedSupplier);
    result.onFailure(f -> {
        System.out.println(f.getMessage() +">"+ circuitBreaker.getState());

    });
    result.onSuccess(f -> {
        System.out.println(f +"="+ circuitBreaker.getState());
    });
    TimeUnit.MILLISECONDS.sleep(100);
}

Resilience4j的Retry使用

RetryConfig config = RetryConfig.custom()
        .maxAttempts(2) //最少重试次数
        .waitDuration(Duration.ofMillis(100)) //间隔多少时间发一次重试机制
        .retryOnException(throwable -> API.Match(throwable).of(
                API.Case($(Predicates.instanceOf(WebServiceException.class)), true),//表示调用方法如果Throw WebServiceException,则启动重试机制
                API.Case($(), false) //其它异常对象忽略))
                        .build();
Retry retry = Retry.of("dd", config);//装载可能会要重试方法
CheckedFunction0<String> retryableSupplier = Retry.decorateCheckedSupplier(retry, () -> {
    System.out.println("1");
    throw new WebServiceException();
});
//调用方法,如果失败,会执行recover方法,进入异常修复方法。
Try<String> result = Try.of(retryableSupplier).recover((throwable -> {
    System.out.println(throwable.getMessage());
    return "hello";
}));

Resilience4j的TimeLimiter使用

TimeLimiterConfig config = TimeLimiterConfig.custom()
        .timeoutDuration(Duration.ofMillis(5000)) //超时时间
        .cancelRunningFuture(true)  //是否Cancel Future
        .build();
TimeLimiter timeLimiter = TimeLimiter.of(config);
Supplier<Future<Integer>> futureSupplier = () -> CompletableFuture.supplyAsync(() -> {
    try {

        TimeUnit.MILLISECONDS.sleep(6000);

    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return 9;
});

Callable restrictedCall = TimeLimiter
        .decorateFutureSupplier(timeLimiter, futureSupplier);
Try.ofCallable(restrictedCall).onFailure(f -> System.out.println(f));

Resilience4j的使用说明文档:http://resilience4j.github.io/resilience4j/#_set_up_3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值