05.1 hystrix服务熔断和降级

vvEcho 2024-01-20 14:08:36
Categories: Tags:

我们使用Hystrix来实现服务的熔断和限流,在对应的接口上添加对应的 @HystrixCommand注解,注解内置了超时时间及断路器开关,以及降级后对应的回调处理方法,可以自定义返回信息;

Hystrix的主要原理是用了断路器模式和线程池隔离技术;

通过断路器的故障监控,向服务调用方返回一个符合预期的,可处理的备选响应;而不是长时间的等待或者抛出无法处理的异常,这样就避免了服务不可用造成服务调用方长时间不必要的等待,避免了故障在分布式系统的蔓延,以至于对整个系统造成影响;

通过线程池隔离技术,即所有使用了 @HystrixCommand的方法,都会开启一个线程来执行,避免了服务的执行不会影响到其他的服务;

Hystrix Ribbon OpenFeign三者的关系

Hystrix:保障系统稳定性的熔断降级工具。
Ribbon:提升服务调用可靠性的负载均衡组件。
OpenFeign:简化远程调用的声明式 HTTP 客户端,天然整合 Ribbon 和 Hystrix

Hystrix的限流有哪两种模式

  1. 线程池模式:线程池隔离,线程数达到最大值时,后续请求会被拒绝,并抛出异常;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @HystrixCommand(
    groupKey = "order-service",
    threadPoolKey = "order-thread-pool",
    threadPoolProperties = {
    @HystrixProperty(name = "coreSize", value = "20"),
    @HystrixProperty(name = "maxQueueSize", value = "50")
    },
    commandProperties = {
    @HystrixProperty(name = "execution.isolation.strategy", value = "THREAD")
    }
    )
    public String getOrder() {
    // 业务逻辑
    }
  2. 信号量模式:信号量隔离,当信号量达到最大值时,后续请求会被拒绝,并抛出异常;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @HystrixCommand(
    fallbackMethod = "fallback",
    commandProperties = {
    @HystrixProperty(name = "execution.isolation.strategy", value = "SEMAPHORE"),
    @HystrixProperty(name = "execution.isolation.semaphore.maxConcurrentRequests", value = "100")
    }
    )
    public String process() {
    // 业务逻辑
    }

线程池与信号量隔离的对比

维度 线程池隔离 信号量隔离
资源消耗 较高(需维护线程池) 较低(仅计数器)
响应速度 存在线程切换开销 无额外开销,响应更快
突发流量处理 支持队列缓冲 直接拒绝超限请求
适用场景 依赖服务响应较慢或需异步处理 依赖服务响应快且需严格控制并发