resilience4j之CircuitBreaker熔断器——CircuitBreakerMetrics指标度量

本文详细介绍了CircuitBreakerMetrics接口及其实现类在熔断器中的作用,包括失败率、慢调用率等关键指标的计算方法,以及如何通过这些指标进行状态判断。

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

在上篇文章中提到,onError()或onSuccess()时都会去计算错误率等指标,具体是由CircuitBreakerMetrics实现
在这里插入图片描述

一:CircuitBreaker.Metrics 指标度量接口

该接口定义了一系列获取度量指标的方法,其中包括如下:

//度量指标接口,用于观察熔断器的各项指标
    interface Metrics {

        // 返回失败率百分比,如果调用数小于MINIMUM_NUMBER_OF_CALLS,返回-1
        float getFailureRate();

        //返回慢调用率百分比,如果调用数小于MINIMUM_NUMBER_OF_CALLS,返回-1
        float getSlowCallRate();

       //慢调用请求总数
        int getNumberOfSlowCalls();

        //慢调用成功总数
        int getNumberOfSlowSuccessfulCalls();

       //慢调用失败总数
       int getNumberOfSlowFailedCalls();
		
		//环形缓冲区的最大调用数
        int getNumberOfBufferedCalls();

        // 失败调用总数
        int getNumberOfFailedCalls();

        // 在打开状态下,返回当前不被允许请求调用的数量,在关闭和半开状态下,总返回0
         long getNumberOfNotPermittedCalls();

        //成功调用总数
        int getNumberOfSuccessfulCalls();
    }

二:CircuitBreakerMetrics类

是CircuitBreaker.Metrics接口的实现类,具体内容就是实现了CircuitBreaker.Metrics 定义的方法

    //慢调用率
    private float getSlowCallRate(Snapshot snapshot) {
        int bufferedCalls = snapshot.getTotalNumberOfCalls();
        if (bufferedCalls == 0 || bufferedCalls < minimumNumberOfCalls) {
            return -1.0f;
        }
        return snapshot.getSlowCallRate();
    }

    //失败率
    private float getFailureRate(Snapshot snapshot) {
        //总共调用的次数
        int bufferedCalls = snapshot.getTotalNumberOfCalls();
        if (bufferedCalls == 0 || bufferedCalls < minimumNumberOfCalls) {
            //ringBitSet中个数没有达到ringBufferSize大小,返回-1.0f,不计算失败率
            return -1.0f;
        }
        //返回失败率:totalNumberOfFailedCalls * 100.0f / totalNumberOfCalls
        return snapshot.getFailureRate();
    }

onError()和onSuccess()方法是由上篇文章提到的状态机CircuitBreakerStateMachine的状态类中的onError()和onSuccess()方法调用的,检查是否达到了错误率阈值checkIfThresholdsExceeded() 进而调用状态机的状态转换方法 stateTransition()

 /**
     * Records a successful call and checks if the thresholds are exceeded.
     * 成功调用时检查是否是慢调用,如果是慢调用,先发布慢调用事件,再统计慢调用率
     * @return the result of the check
     */
    public Result onSuccess(long duration, TimeUnit durationUnit) {
        Snapshot snapshot;
        if (durationUnit.toNanos(duration) > slowCallDurationThresholdInNanos) {
            snapshot = metrics.record(duration, durationUnit, Outcome.SLOW_SUCCESS);
        } else {
            snapshot = metrics.record(duration, durationUnit, Outcome.SUCCESS);
        }
        return checkIfThresholdsExceeded(snapshot);
    }

    /**
     * 失败时就会调用此方法,发布慢/错误事件,并检查是否达到阈值
     * 1.先记录请求,即总请求次数,错误请求次数等+1
     * 2. 计算失败率/慢调用率,是否达到阈值
     */
    public Result onError(long duration, TimeUnit durationUnit) {
        Snapshot snapshot;
        if (durationUnit.toNanos(duration) > slowCallDurationThresholdInNanos) {
            //慢调用,调用Core.Metrics 记录请求数
            snapshot = metrics.record(duration, durationUnit, Outcome.SLOW_ERROR);
        } else {
            //错误调用,调用Core.Metrics 记录请求数
            snapshot = metrics.record(duration, durationUnit, Outcome.ERROR);
        }
        return checkIfThresholdsExceeded(snapshot);
    }
    
    // 检查错误率/慢调用率是否达到阈值
    private Result checkIfThresholdsExceeded(Snapshot snapshot) {
        //获取失败率
        float failureRateInPercentage = getFailureRate(snapshot);
        if (failureRateInPercentage == -1) {
            //小于缓冲大小,还未达到检查阈值
            return Result.BELOW_MINIMUM_CALLS_THRESHOLD;
        }
        if (failureRateInPercentage >= failureRateThreshold) {
            //超过阈值
            return Result.ABOVE_THRESHOLDS;
        }

        //慢调用率
        float slowCallsInPercentage = getSlowCallRate(snapshot);
        if (slowCallsInPercentage >= slowCallRateThreshold) {
            return Result.ABOVE_THRESHOLDS;
        }
        return Result.BELOW_THRESHOLDS;
    }

还定义了检查是否达到阈值的枚举值:

    enum Result {
        BELOW_THRESHOLDS,
        ABOVE_THRESHOLDS,
        BELOW_MINIMUM_CALLS_THRESHOLD
    }

总结

CircuitBreakerMetrics主要用来计算度量的各种指标

Resilience4j 是一个用于构建弹性和容错性应用程序的轻量级库,其中包括熔断器(Circuit Breaker)功能。下面是 Resilience4j 熔断器的简单使用方法: 1. 添加 Maven 依赖:在项目的 pom.xml 文件中添加以下 Maven 依赖: ```xml <dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j-circuitbreaker</artifactId> <version>1.7.0</version> </dependency> ``` 2. 创建熔断器实例:使用 CircuitBreakerRegistry 创建一个熔断器实例。 ```java CircuitBreakerConfig config = CircuitBreakerConfig.custom() .failureRateThreshold(50) // 失败率阈值 .waitDurationInOpenState(Duration.ofMillis(1000)) // 熔断器打开后等待时间 .ringBufferSizeInHalfOpenState(2) // 半开状态下环形缓冲区大小 .ringBufferSizeInClosedState(2) // 关闭状态下环形缓冲区大小 .build(); CircuitBreakerRegistry registry = CircuitBreakerRegistry.of(config); CircuitBreaker circuitBreaker = registry.circuitBreaker("myCircuitBreaker"); ``` 3. 包装方法调用:使用熔断器包装需要进行容错处理的方法调用。 ```java CircuitBreaker.decorateCheckedSupplier(circuitBreaker, () -> { // 调用需要容错处理的方法 return myService.doSomething(); }); ``` 4. 处理熔断器状态:根据熔断器的状态进行相应处理。 ```java if (circuitBreaker.getState() == CircuitBreaker.State.OPEN) { // 熔断器打开时的处理逻辑 // 例如,返回一个默认值或者抛出一个自定义异常 } else { // 熔断器关闭或半开时的处理逻辑 // 例如,正常执行业务逻辑 } ``` 上述步骤中,你可以根据实际需求配置熔断器的参数,如失败率阈值、等待时间、环形缓冲区大小等。通过包装方法调用,当方法调用失败或达到一定条件时,熔断器将会打开,并执行相应的容错逻辑。你可以根据熔断器的状态来处理不同的情况。 注意:上述代码片段仅为示例,你需要根据自己的业务需求进行适当的调整和配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值