Hystrix熔断降级处理

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

参考原文: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")

亲测有效

常用参数

@HystrixCommand(fallbackMethod = "circuitBreakerFallback",commandProperties = {
            //开启熔断
            @HystrixProperty(name="circuitBreaker.enabled",value = "true"),
            //设置Hystrix的超时时间,默认1s
            @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "3000"),
            //监控时间 默认5000 毫秒
            @HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value = "5000"),
            //失败次数。默认20次
            @HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value = "10"),
            //失败率 默认50%
            @HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value = "50") })

                        
原文链接:https://blog.csdn.net/weixin_43296313/article/details/120889127

Dashboard 监控仪表盘

Hystrix Dashboard 仪表盘用于以 GUI 的形式展示消费者的执行情况,包括其处理器方法与 Service 方法的调用执行情况,及熔断器 CircuitBreaker 的状态等。当然,这些显示出的数据都是在指定时间窗内的执行情况及状态信息

总步骤

  • 添加 hystrix-dashboard 与 actuator 依赖
  • 配置文件中开启 actuator 的 hystrix.stream 监控终端
  • 在启动类上添加@EnableHystrixDashboard 注解
  • 配置文件中添加参数
    hystrix:
      dashboard:
        proxy-stream-allow-list:"you domain"

1.添加依赖:

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            <version>2.2.7.RELEASE</version>
        </dependency>

        <!--原文链接:https://blog.csdn.net/weixin_43296313/article/details/120889127-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-hystrix-dashboard</artifactId>
            <version>2.2.7.RELEASE</version>
        </dependency>

2.配置参数开启监控终端

management:
  endpoints:
    web:
      exposure:
        include: '*'

hystrix:
  dashboard:
    proxy-stream-allow-list: "youdomain.com"

3.在启动类上添加@EnableHystrixDashboard 注解

原文参考: Spring Cloud 快速入门(四)Hystrix Dashboard 监控仪表盘、Turbine 聚合监控、服务降级报警机制_hystrix与turbine-CSDN博客

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud Hystrix是一个开源的熔断器框架,它能够帮助开发者有效地处理服务依赖中的延迟和故障。熔断器的主要目的是在出现故障时提供一种优雅的降级机制,以避免整个系统的崩溃。 熔断降级Hystrix中两个重要的概念。 熔断(Circuit Breaker)指的是在服务出现故障或错误率过高时,自动地切换到指定的备用服务或返回事先定义好的错误结果,起到保护系统免受故障传播的影响的作用。当服务不可用或响应时间过长时,熔断器会打开,拒绝后续请求的访问,并尝试通过执行降级逻辑来快速响应客户端。一旦后续请求不再出现故障,熔断器将会进入半开状态,允许少量的请求通过以检测服务是否恢复正常。 降级(Degradation)指的是在系统资源不足或者高访问量时,服务降级会关闭一些不重要的功能,以保证系统核心功能的可用性和稳定性。降级可以通过阻止非必要的调用、减少资源的消耗以及返回默认值或缓存结果来实现。降级需要提前定义好一些备用的逻辑,一旦系统资源紧张,就可以立即启用降级逻辑来保障系统的可用性。 总而言之,熔断降级都是为了保护系统免受故障的影响。熔断主要是针对服务故障和错误率过高的情况,通过切换到备用服务或返回错误结果来保护系统。降级主要是在系统资源紧张或高访问量的情况下,关闭一些不重要的功能来保证核心功能的可用性和稳定性。两者都是通过提前定义备用逻辑来保障系统的正常运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值