Hystrix熔断降级处理

发布时间:2024年01月18日

在熔断降级处理时候,我需要记录每一次降级,并且统计次数,但是遇见了熔断和降级次数对不上的情况,最终发现是因为熔断器的配置参数,需要强制打开断路器?。简单记录一下

参考原文:SpringCloud中的@HystrixCommand配置_@hystrixcommand 动态参数配置-CSDN博客

@HystrixCommand(fallbackMethod = "lenovoBidInquiry",
            commandProperties = {
                    //  配置命令执行的超时时间
                    @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "200"),
                    //  断路器强制打开
                    @HystrixProperty(name = "circuitBreaker.forceOpen", value = "true"),
//                    @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "1")
                    //  设置隔离策略, THREAD  表示线程池  SEMAPHORE :信号池隔离
                    /*@HystrixProperty (name =  "execution.isolation.strategy" , value =  "THREAD" ),
                    //  当隔离策略选择信号池隔离的时候,用来设置信号池的大小(最大并发数)
                    @HystrixProperty (name =  "execution.isolation.semaphore.maxConcurrentRequests" , value =  "10000" ),
                    //  是否启用超时时间
                    @HystrixProperty (name =  "execution.timeout.enabled" , value =  "true" ),
                    //  执行超时的时候是否中断
                    @HystrixProperty (name =  "execution.isolation.thread.interruptOnTimeout" , value =  "true" ),
                    //  执行被取消的时候是否中断
                    @HystrixProperty (name =  "execution.isolation.thread.interruptOnCancel" , value =  "true" ),
                    //  允许回调方法执行的最大并发数
                    @HystrixProperty (name =  "fallback.isolation.semaphore.maxConcurrentRequests" , value =  "10000" ),
                    //  服务降级是否启用,是否执行回调函数
                    @HystrixProperty (name =  "fallback.enabled" , value =  "true" ),
                    //  是否启用断路器
//                    @HystrixProperty (name =  "circuitBreaker.enabled" , value =  "true" ),
                    //  该属性用来设置在滚动时间窗中,断路器熔断的最小请求数。例如,默认该值为  20  的时候,
                    //  如果滚动时间窗(默认 10 秒)内仅收到了 19 个请求, 即使这 19 个请求都失败了,断路器也不会打开。
                    @HystrixProperty (name =  "circuitBreaker.requestVolumeThreshold" , value =  "1" ),
                    //  该属性用来设置在滚动时间窗中,表示在滚动时间窗中,在请求数量超过
                    // circuitBreaker.requestVolumeThreshold  的情况下,如果错误请求数的百分比超过 50,
                    //  就把断路器设置为  " 打开 "  状态,否则就设置为  " 关闭 "  状态。
//                    @HystrixProperty (name =  "circuitBreaker.errorThresholdPercentage" , value =  "50" ),
                    //  该属性用来设置当断路器打开之后的休眠时间窗。 休眠时间窗结束之后,
                    //  会将断路器置为  " 半开 "  状态,尝试熔断的请求命令,如果依然失败就将断路器继续设置为  " 打开 "  状态,
                    //  如果成功就设置为  " 关闭 "  状态。
//                    @HystrixProperty (name =  "circuitBreaker.sleepWindowinMilliseconds" , value =  "5000" ),
                    //  断路器强制打开
//                    @HystrixProperty (name =  "circuitBreaker.forceOpen" , value =  "false" ),
                    //  断路器强制关闭
//                    @HystrixProperty (name =  "circuitBreaker.forceClosed" , value =  "false" ),
                    //  滚动时间窗设置,该时间用于断路器判断健康度时需要收集信息的持续时间
                    @HystrixProperty (name =  "metrics.rollingStats.timeinMilliseconds" , value =  "10000" ),
                    //  该属性用来设置滚动时间窗统计指标信息时划分 " 桶 " 的数量,断路器在收集指标信息的时候会根据
                    //  设置的时间窗长度拆分成多个  " 桶 "  来累计各度量值,每个 " 桶 " 记录了一段时间内的采集指标。
                    //  比如  10  秒内拆分成  10  个 " 桶 " 收集这样,所以  timeinMilliseconds  必须能被  numBuckets  整除。否则会抛异常
                    @HystrixProperty (name =  "metrics.rollingStats.numBuckets" , value =  "10" ),
                    //  该属性用来设置对命令执行的延迟是否使用百分位数来跟踪和计算。如果设置为  false,  那么所有的概要统计都将返回  -1 。
                    @HystrixProperty (name =  "metrics.rollingPercentile.enabled" , value =  "false" ),
                    //  该属性用来设置百分位统计的滚动窗口的持续时间,单位为毫秒。
                    @HystrixProperty (name =  "metrics.rollingPercentile.timeInMilliseconds" , value =  "60000" ),
                    //  该属性用来设置百分位统计滚动窗口中使用  “  桶  ” 的数量。
                    @HystrixProperty (name =  "metrics.rollingPercentile.numBuckets" , value =  "60000" ),
                    //  该属性用来设置在执行过程中每个  “ 桶 ”  中保留的最大执行次数。如果在滚动时间窗内发生超过该设定值的执行次数,
                    //  就从最初的位置开始重写。例如,将该值设置为 100,  滚动窗口为 10 秒,若在 10 秒内一个  “ 桶  ” 中发生了 500 次执行,
                    //  那么该  “ 桶 ”  中只保留 最后的 100 次执行的统计。另外,增加该值的大小将会增加内存量的消耗,并增加排序百分位数所需的计算时间。
                    @HystrixProperty (name =  "metrics.rollingPercentile.bucketSize" , value =  "100" ),
                    //  该属性用来设置采集影响断路器状态的健康快照(请求的成功、 错误百分比)的间隔等待时间。
                    @HystrixProperty (name =  "metrics.healthSnapshot.intervalinMilliseconds" , value =  "500" ),
                    //  是否开启请求缓存
                    @HystrixProperty (name =  "requestCache.enabled" , value =  "true" ),
                    // HystrixCommand 的执行和事件是否打印日志到  HystrixRequestLog  中
                    @HystrixProperty (name =  "requestLog.enabled" , value =  "true" )*/
            })
    @Override
    public LenovoResponse bidInquiry(LenovoRequestTo request, Long mediaId, Long planId, String key) {
        String url = "http://api.lenovomm.com/ad/get/request.do";
        return restTemplate.postForObject(url, request, LenovoResponse.class);
    }
/**
 * @description: 联想拉取广告熔断处理
 * @author: huachun
 * @email: huachun_w@163.com
 * @date: 2024/1/15 10:15
 * @param:
 * @param: request
 * @return: LenovoResponse
 **/
public LenovoResponse lenovoBidInquiry(LenovoRequestTo request, Long mediaId, Long planId, String queryKeyWord) {
    noBidCollectorService.incNoBidCount(mediaId, planId, queryKeyWord, NoBidType.BAG_WASH_FUSE_DEGRADATION);
    return null;
}

断路器会有阈值,在默认阈值范围内会直接返回缓存降级结果,并不是每一次都会走到降级处理,通过设置断路器强制打开,可以让每一次熔断都走到降级逻辑中

具体用法:

//  断路器强制打开
                    @HystrixProperty(name = "circuitBreaker.forceOpen", value = "true")

亲测有效

文章来源:https://blog.csdn.net/hauchun/article/details/135658127
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。