hystrix,高可用性保障框架

Hystrix 是 Netflix 开源的一个用于构建分布式系统的库,主要用于处理分布式系统中的服务容错和降级。它提供了一种机制来防止分布式系统中的故障从一个服务传播到整个系统,以及在某个服务不可用时提供降级机制。Hystrix 被广泛应用在微服务架构中,可以用于保护应用程序免受故障或延迟的影响,提高系统的可用性和稳定性。

工作原理:

Hystrix 的核心思想是通过引入隔离、降级、限流、超时等机制来控制对外部依赖的调用,从而防止故障的传播。它在应用程序中定义了一个包装器(Wrapper),将对外部依赖的调用包装在 Hystrix 命令中,通过线程池来执行这些命令。每个命令都有一个熔断器(Circuit Breaker)来监测它的状态,如果命令执行失败次数达到一定阈值,熔断器将打开,停止执行命令,从而防止继续发生失败的调用。

主要作用:

隔离: Hystrix 使用线程池隔离每个依赖的调用,确保一个故障的依赖不会影响到其他依赖,从而提高系统的稳定性。

降级: 当某个依赖服务不可用或响应时间过长时,Hystrix 可以定义降级逻辑,返回一个备用的响应,避免用户感知到服务的不可用。

限流: Hystrix 可以限制并发请求的数量,防止系统被大量请求压垮。

超时控制: Hystrix 可以设置每个命令的超时时间,如果命令执行时间超过设定的阈值,将被中断。

Demo:

hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: true
        isolation:
          thread:
            timeoutInMilliseconds: 100000
          strategy: SEMAPHORE
          semaphore:
            maxConcurrentRequests: 

command: 这是配置文件的顶级部分,它包含了 Hystrix 命令的配置。

default: 在 Hystrix 中,你可以为不同的命令配置不同的参数,但这里的 default 表示这些参数适用于所有命令,除非针对特定命令有特殊配置。

execution: 这个部分包含了执行相关的配置。

timeout: 用于配置超时相关的参数。

enabled: true 表示启用超时功能。如果设置为 true,则 Hystrix 将会在每个命令的执行中启用超时机制,以防止命令执行时间过长。

isolation: 用于配置命令的隔离策略。

thread: 这个部分用于配置线程隔离相关的参数。

timeoutInMilliseconds: 100000 表示配置线程隔离模式下的超时时间,即线程执行的最大允许时间,单位是毫秒(ms)。

strategy: SEMAPHORE 表示使用信号量隔离策略。信号量隔离模式下,多个命令可以在同一个线程内执行,而不是为每个命令分配一个独立的线程。信号量隔离可以用于控制并发度,避免线程池资源耗尽。

semaphore: 这个部分包含了信号量隔离相关的参数。

maxConcurrentRequests: 5000 表示允许的最大并发请求数。在信号量隔离模式下,这个配置限制了同时执行的命令数量。
这个配置文件示例表明,对于所有的 Hystrix 命令,它们都启用了超时机制,并使用了信号量隔离策略,允许的最大并发请求数为 5000,超时时间为 100000 毫秒(即 100 秒)。

import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import com.netflix.hystrix.HystrixCommandKey;

public class MyCommand extends HystrixCommand {

    private final String value;

    public MyCommand(String value) {
        super(Setter
            .withGroupKey(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"))
            .andCommandKey(HystrixCommandKey.Factory.asKey("ExampleCommand")));
        this.value = value;
    }

    @Override
    protected String run() throws Exception {
        // 模拟一个可能会超时的操作
        Thread.sleep(200); // 这里故意让线程休眠 200 毫秒,超过了配置的 100 秒
        return "Result: " + value;
    }

    @Override
    protected String getFallback() {
        return "Fallback Result for: " + value;
    }
}

在这个示例中,我们定义了一个继承自 HystrixCommand 的命令 MyCommand,它使用了 Hystrix 的默认配置,包括启用了超时机制和使用了信号量隔离。在 run 方法中,我们模拟了一个可能会超时的操作(休眠 200 毫秒),但由于超时时间设置为 100 秒,所以不会触发超时,命令执行成功。如果命令执行失败(例如抛出异常),Hystrix 会触发降级逻辑,执行 getFallback 方法,返回降级响应。

你可能感兴趣的:(分布式,阿里云,hystrix)