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