在熔断降级处理时候,我需要记录每一次降级,并且统计次数,但是遇见了熔断和降级次数对不上的情况,最终发现是因为熔断器的配置参数,需要强制打开断路器?。简单记录一下
参考原文: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")
亲测有效