Hystrix是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方,防止级联失败,从而提高系统的可用性和容错性。Hystrix主要通过一下几点实现延迟或者容错:
包裹请求:使用HystrixCommon的或者HystrixObservableCommond包裹对依赖的调用逻辑,每个命令在独立线程执行,即设计模式中的命令模式。
跳闸机制:当某服务错误率超过一定阀值,Hystrix可以自动或者手动跳闸,停止请求该服务一段时间。
资源隔离:Hystrix为每个依赖都维护了一个小型线程池,如果该线程池已满,发往该依赖的请求就立即被拒绝,而不是排队等候,从而加速失败判定。
回退机制:当请求失败,超时、被拒绝或断路器打开时,执行回退逻辑。回退逻辑可由开发人员自行提供,例如返回一个缺省值。
监控:Hystrix可以近乎实时的监控运行指标和配置的变化,例如成功、失败、超时以及被拒绝的请求。
自我修复:断路器打开一段时间后,会自动进入"半开"状态。
看着上面的官方描述可能会比较模糊,还是不清楚到底做的是什么事,其实简单的来讲,就是调用服务提供方时,调用失败后,客户端的处理方式。下面我们以一个简单的例子介绍Hystrix的使用。
要在项目中引用Hystrix,请使用group ID为org.springframework.cloud和artifact ID为spring-cloud-starter-netflix -hystrix的starter。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
该项目同样需要注册服务,服务提供者 服务消费方,以及负载均衡策略,模块如下:eureka-server、hystrix-provider、hystrix-consume三个模块,eureka-server模块代码这里不再展示,hystrix-provider模块代码与ribbon-provider代码一样,创建一个restful接口返回hello+name。这里主要介绍coneume模块代码,也就是hystrix-consume调用hystrix-provider失败时要做的处理,因此我们需要在hystrix-consume模块引入hystrix的starter包。
同样我们也需要在服务调用方即hystrix-consume编写一个restful接口,与ribbon不同的是,我们创建一个Service接口,在Service接口中调用服务提供方,restful接口中调用该Service实例,Service代码如下所示:
@Service
public class HelloServiceImpl implements HelloService {
@Autowired
private RestTemplate restTemplate;
@Override
@HystrixCommand(fallbackMethod = "backMethod")
public String sayHello(String name) {
return restTemplate.getForObject("http://hystrix-provider//hello/"+name, String.class);
}
private String backMethod() {
return "hello world";
}
}
如上代码所示,在方法上添加@HystrixCommand注解,即可在调用服务失败时做出其他的处理方式,上面的方法中在调用服务方失败时调用本地的backMethod方法,并且返回hello world 字符串。至于@HystrixCommand的使用以及原理,我们会在下一篇博客中讲解。在讲解之前我们先了解一下HystrixCommand源代码如下:
public @interface HystrixCommand {
//定义分组
String groupKey() default "";
//命名名称
String commandKey() default "";
//线程池划分
String threadPoolKey() default "";
//请求失败的回调方法名称
String fallbackMethod() default "";
//HystrixCommand注解使用到的一些自定义属性
HystrixProperty[] commandProperties() default {};
//HystrixCommand 线程池使用到的一些自定义属性
HystrixProperty[] threadPoolProperties() default {};
//忽略指定异常
Class<? extends Throwable>[] ignoreExceptions() default {};
// @HystrixCommand注解实现响应式命令时,可以通过 observableExecutionMode参数来控制是使用
//observe()还是toObservable()的执行方式。
ObservableExecutionMode observableExecutionMode() default ObservableExecutionMode.EAGER;
HystrixException[] raiseHystrixExceptions() default {};
//请求失败默认回调方法名称
String defaultFallback() default "";
}
fallBackMethod与defaultFallMethod配置的为调用服务端错误时要调用的方法名称,其中,defaultFallMethod为全局配置,fallBackMethod为单个实例。
ignoreExceptions配置被忽略的异常,配置异常之后,当该抛出该异常时不会触发配置fallBackMethod的方法的调用。
commandKey、 groupKey 以及 threadPoolKey 它们分别表示了命令名称、 分组以及线程池划分。
observableExecutionMode 参数用来控制是使用 observe ()还是toObservable()的执行方式。ObservableExecutionMode. EAGER表示使用 observe ()执行方式;ObservableExecutionMode.LAZY表示使用 toObservable()执行方式。
raiseHystrixExceptions用于配置将哪些运行时异常封装为HystrixRuntimeException
commandProperties和threadPoolProperties分别用于指定Command属性和线程池属性,属性的具体内容我们下一篇讲解。
本篇只是简单讲解一下Hystrix的使用,了解Hystrix的核心为@HystrixCommand注解,至于@HystrixCommand注解的详细介绍会在下一篇详细介绍。