一、熔断器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 ServletRegistrationBeangetServlet() { 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熔断应用场景:
- 当服务调用需耗费大量时间时,可使用超时机制,限制服务调用时间,减少请求积压。
- 当服务出现故障时,可使用熔断器,开启熔断机制,避免服务出现级联故障。
- 当服务调用频率过高时,可使用限流机制,使得服务调用不会对系统产生过大的压力。
综合使用这些机制,可以有效地保障分布式系统在高并发、大流量的情况下的稳定性和高可用性。