您的位置:

深入了解Spring Boot Hystrix

一、Hystrix简介

Hystrix是Netflix开源的一个延迟和容错库,主要用于处理分布式系统中的应用服务间的延迟、故障和容错机制等问题。它可以作为客户端库使用,责任在于提供默认的线程池和并发请求数量限制之类的基础实现,同时还可以作为服务端组件使用,收集和监控服务调用情况,向调用者返回降级机制的响应等。

Hystrix主要有以下几个特点:

1、降级机制:当一个服务调用失败或处于超时状态时,自动切换到后备方法执行。

2、重试机制:自动发起多次尝试重复请求一个失败的服务。

3、隔离机制:将客户端线程池与服务所在的线程池隔离开,防止因为服务异常导致客户端整个应用程序崩溃。

4、熔断器:当服务调用失败或超时超过一定阈值时,自动打开熔断器进行熔断,避免服务雪崩。

5、实时监控:对熔断器/线程池/请求数量等信息进行实时监控和度量。

二、Hystrix在Spring Boot中的应用

在Spring Boot中,使用Hystrix非常容易。Hystrix提供了Spring Cloud Hystrix Starter,封装了相关的依赖和配置,可以帮助我们快速集成Hystrix。同时,通过在服务类的方法上加上@HystrixCommand注解,可以为每个服务方法自动启用Hystrix。

具体来说,我们需要做以下几个步骤:

1、加入依赖


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

2、启用Hystrix

在应用程序的主类上添加@EnableHystrix注解:


@SpringBootApplication
@EnableHystrix
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }
}

3、使用@HystrixCommand注解

在服务类的方法上加上@HystrixCommand注解,并指定fallback方法。当服务执行失败或超时时,将自动执行fallback方法。


@Service
public class OrderService {

    @Autowired
    private RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "fallback")
    public String getOrder(String orderId) {
        String url = "http://order-service/order/{orderId}";
        return restTemplate.getForObject(url, String.class, orderId);
    }

    public String fallback(String orderId) {
        return "Service unavailable!";
    }        
}

三、降级机制

当服务处于故障或网络问题时,Hystrix自动切换到fallback方法执行,以保障客户端的服务可用性。通过指定fallbackMethod属性,我们可以为每个服务方法定义对应的降级方法。降级方法不能接受与原服务方法不同的参数,同时返回类型可以与原服务方法不同。

四、重试机制

当服务调用失败时,Hystrix会自动发起多次尝试重复请求,以提高服务的可用性。可以通过参数控制重试次数、重试间隔和是否支持重试等。

示例:设置重试次数为3,每次重试的间隔为2s


@HystrixCommand(fallbackMethod = "fallback",
                commandProperties = {
                  @HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE"),
                  @HystrixProperty(name="execution.isolation.semaphore.maxConcurrentRequests", value="10"),
                  @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", value="3000"),
                  @HystrixProperty(name="circuitBreaker.requestVolumeThreshold", value="2"),
                  @HystrixProperty(name="metrics.rollingStats.timeInMilliseconds", value="10000"),
                  @HystrixProperty(name="retry.enabled", value="true"),
                  @HystrixProperty(name="retry.attempts", value="3"),
                  @HystrixProperty(name="retry.interval", value="2000")
                })
public String getOrder(String orderId) {
    String url = "http://order-service/order/" + orderId;
    return restTemplate.getForObject(url, String.class);
}

五、隔离机制

Hystrix通过隔离机制,将客户端线程池与服务所在的线程池隔离开,防止因为服务异常导致客户端整个应用程序崩溃。隔离机制主要有两种策略可选:Thread和Semaphore,默认为Thread模式。可以通过@HystrixCommand注解中的execution.isolation.strategy属性,进行设置。

示例:设置隔离策略为Semaphore,同时最大并发请求数量为10


@HystrixCommand(fallbackMethod = "fallback",
                commandProperties = {
                  @HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE"),
                  @HystrixProperty(name="execution.isolation.semaphore.maxConcurrentRequests", value="10"),
                  @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", value="3000"),
                  @HystrixProperty(name="circuitBreaker.requestVolumeThreshold", value="2"),
                  @HystrixProperty(name="metrics.rollingStats.timeInMilliseconds", value="10000")
                })
public String getOrder(String orderId) {
    String url = "http://order-service/order/" + orderId;
    return restTemplate.getForObject(url, String.class);
}

六、熔断器

当服务调用失败或超时超过一定阈值时,Hystrix会自动打开熔断器进行熔断,防止因为服务异常导致整个系统崩溃。在熔断的情况下,所有的服务调用都将迅速失败并返回预定的fallback响应。当熔断器处于半开状态时,Hystrix会自动进行探测,以确定服务是否恢复。

可以通过@HystrixCommand注解中的circuitBreaker属性,进行配置熔断器的参数。主要属性包括:requestVolumeThreshold(触发熔断器的最小请求数),sleepWindowInMilliseconds(熔断器打开后的休眠时间)等。

示例:设置触发熔断的最小请求数为2,熔断器打开后的休眠时间为5s


@HystrixCommand(fallbackMethod = "fallback",
                commandProperties = {
                  @HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE"),
                  @HystrixProperty(name="execution.isolation.semaphore.maxConcurrentRequests", value="10"),
                  @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", value="3000"),
                  @HystrixProperty(name="circuitBreaker.requestVolumeThreshold", value="2"),
                  @HystrixProperty(name="metrics.rollingStats.timeInMilliseconds", value="10000"),
                  @HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds", value="5000")
                })
public String getOrder(String orderId) {
    String url = "http://order-service/order/" + orderId;
    return restTemplate.getForObject(url, String.class);
}

七、实时监控

Hystrix提供了实时监控功能,可以监测Hystrix熔断器的运行状况,记录请求次数、成功次数、失败次数等相关指标,以帮助开发者进行性能监测、问题排查和提高服务可用性。

在Spring Boot应用程序中,可以加入spring-boot-starter-actuator依赖,以启用相关的监控端点。具体来说,我们需要做以下几个步骤:

1、加入依赖


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>com.netflix.hystrix</groupId>
    <artifactId>hystrix-metrics-event-stream</artifactId>
    <scope>runtime</scope>
</dependency>

2、启用Hystrix监控

在应用程序的主类上添加@EnableHystrixMetricsStream注解,以启用Hystrix实时监控功能。


@SpringBootApplication
@EnableHystrix
@EnableHystrixMetricsStream
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }
}

3、访问监控端点

访问http:// : /actuator/hystrix.stream可以获取Hystrix的实时监控信息。

总结

在分布式系统中,服务间的故障和网络问题是经常会遇到的问题。Hystrix作为延迟和容错库,采用了许多强大的机制,以保障服务的可用性和性能。在Spring Boot应用中,我们可以通过简单的配置和注解使用Hystrix,并通过实时监控功能,帮助我们提高服务质量和可用性。