您的位置:

Hystrix使用指南

一、熔断器Hystrix使用

Hystrix是一个用于处理分布式系统的熔断器,主要用于处理由远程服务调用引起的延迟和故障。下面我们来看看如何使用Hystrix。

在使用Hystrix之前,我们需要添加Hystrix依赖:

    <dependency>
        <groupId>com.netflix.hystrix</groupId>
        <artifactId>hystrix-core</artifactId>
        <version>1.5.18</version>
    </dependency>

然后,我们需要在实际的服务调用方法中添加注释,说明这个方法需要使用熔断器:

    // 使用Hystrix熔断器
    @HystrixCommand(fallbackMethod = "fallbackMethod")
    public Object serviceMethod() {
        // ...
    }
    
    // 熔断器降级方法
    public Object fallbackMethod() {
        // ...
    }

在上述示例中,我们在serviceMethod方法中添加了@HystrixCommand注释,并指定了降级方法fallbackMethod。当服务调用出现问题时,Hystrix会使用fallbackMethod方法来处理这个问题。

二、Hystrix拒绝策略

当Hystrix的熔断器处于关闭状态时,如果服务调用超时或者返回错误,Hystrix会根据拒绝策略来进行处理。Hystrix提供了以下几种拒绝策略:

  • THREAD:通过新的线程来执行服务调用
  • SEMAPHORE:通过信号量来控制服务调用并发数量

在使用Hystrix时,可以通过@HystrixCommand注释来指定拒绝策略:

    @HystrixCommand(fallbackMethod = "fallbackMethod", commandProperties = {
            // 指定拒绝策略为SEMAPHORE
            @HystrixProperty(name = "execution.isolation.strategy", value = "SEMAPHORE")
    })
    public Object serviceMethod() {
        // ...
    }

三、Hystrix全局配置

Hystrix提供了许多全局配置,用于控制Hystrix的行为。以下是一些常用的全局配置:

  • hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds:Hystrix的超时时间,默认为1000ms
  • hystrix.threadpool.default.coreSize:线程池的核心线程数,默认为10
  • hystrix.threadpool.default.maxQueueSize:线程池的最大队列大小,默认为-1

在使用这些全局配置时,可以在application.yml文件中配置相应的属性:

    hystrix:
        command:
            default:
                execution:
                    isolation:
                        thread:
                            timeoutInMilliseconds: 2000
        threadpool:
            default:
                coreSize: 20
                maxQueueSize: 50

四、Hystrix服务恢复

当服务出现故障时,Hystrix会使用熔断器开启,避免服务请求继续发送到该服务上,造成更多的故障,但是如果故障是暂时的,服务恢复之后,需要Hystrix及时将服务调用请求重新发送到该服务上。

在Hystrix中,默认情况下,服务恢复是禁用的,需要手动开启。可以通过以下方式,将Hystrix的服务恢复开启:

    // 开启Hystrix的服务恢复
    @EnableHystrix
    public class Application {
    }

五、普罗米修斯Hystrix

Hystrix提供了普罗米修斯监控插件,可以帮助我们实时监控Hystrix的运行情况,以及定位Hystrix出现问题的原因。

使用该插件需要添加以下依赖:

    <dependency>
        <groupId>io.prometheus</groupId>
        <artifactId>simpleclient</artifactId>
        <version>0.9.0</version>
    </dependency>
    <dependency>
        <groupId>io.prometheus</groupId>
        <artifactId>simpleclient_hotspot</artifactId>
        <version>0.9.0</version>
    </dependency>
    <dependency>
        <groupId>io.prometheus</groupId>
        <artifactId>simpleclient_dropwizard</artifactId>
        <version>0.9.0</version>
    </dependency>
    <dependency>
        <groupId>io.prometheus</groupId>
        <artifactId>simpleclient_servlet</artifactId>
        <version>0.9.0</version>
    </dependency>
    <dependency>
        <groupId>io.prometheus</groupId>
        <artifactId>jmx_prometheus_javaagent</artifactId>
        <version>0.9.0</version>
    </dependency>

添加完依赖之后,我们可以通过以下方式将Hystrix的数据暴露给Prometheus:

    @Bean
    public ServletRegistrationBean getServlet() {
        HystrixMetricsStreamServlet servlet = new HystrixMetricsStreamServlet();
        ServletRegistrationBean
    registrationBean = new ServletRegistrationBean<>(servlet);
        registrationBean.setLoadOnStartup(1);
        registrationBean.addUrlMappings("/hystrix.stream");
        registrationBean.setName("HystrixMetricsStreamServlet");

        return registrationBean;
    }

   
  

然后我们启动服务,访问http://localhost:xxxx/hystrix.stream,就可以看到Hystrix运行情况的实时监控数据。

六、Hystrix熔断器

Hystrix熔断器可以帮助我们在服务调用出现问题时,避免服务出现级联故障。

以下是熔断器常用属性:

  • circuitBreaker.requestVolumeThreshold:熔断器请求阈值,如果在设置的时间窗口内,请求次数小于requestVolumeThreshold,则熔断器不会开启
  • circuitBreaker.sleepWindowInMilliseconds:休眠时间窗口,开启熔断器后,在该时间窗口内,即使请求通过,也不会尝试关闭熔断器
  • circuitBreaker.errorThresholdPercentage:错误率阈值,当请求错误率达到阈值时,熔断器会开启

可以通过以下方式,设置熔断器的属性:

    @HystrixCommand(fallbackMethod = "fallbackMethod", commandProperties = {
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "20"),
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "5000"),
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50")
    })
    public Object serviceMethod() {
        // ...
    }

七、Hystrix熔断策略

Hystrix提供了多种熔断策略,可以根据不同业务场景来选择合适的策略。以下是几种常用的熔断策略:

  • 采用百分比失败率(FPR),该方法适用于流量较小的情况。当错误率达到一定程度时,自动熔断服务
  • 采用固定间隔切换(Fixed Interval),在一段时间内不断进行服务测试,如果测试通过,则切换服务
  • 采用连续失败计数(Consecutive Failures),服务调用出现连续失败时,自动熔断服务

可以通过以下方式,指定熔断策略:

    @HystrixCommand(fallbackMethod = "fallbackMethod", commandProperties = {
            // 指定熔断策略为采用百分比失败率(FPR)
            @HystrixProperty(name = "circuitBreaker.enabled", value = "true"),
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "5"),
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50")
    })
    public Object serviceMethod() {
        // ...
    }

八、Hystrix熔断应用场景选取

熔断器和服务降级对于分布式系统来说非常重要,因为避免级联故障和积压请求,是确保分布式系统可靠性的重要措施。

下面列举了几个适用于Hystrix熔断应用场景:

  • 当服务调用需耗费大量时间时,可使用超时机制,限制服务调用时间,减少请求积压。
  • 当服务出现故障时,可使用熔断器,开启熔断机制,避免服务出现级联故障。
  • 当服务调用频率过高时,可使用限流机制,使得服务调用不会对系统产生过大的压力。

综合使用这些机制,可以有效地保障分布式系统在高并发、大流量的情况下的稳定性和高可用性。