Hystrix源于Netflix API团队在2011年启动的弹性工程工做,而目前它在Netflix天天处理着数百亿的隔离线程以及数千亿的隔离信号调用。该库旨在经过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix具有拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以及监控和配置等功能。
目前托管在github上。git
在大中型分布式系统中,一般系统不少依赖(HTTP,Dubbo等),若是一个应用不能对来自依赖的故障进行有效处理,那该应用自己就处在被拖垮的风险中。在一个高流量的网站中,某个单一的后端一旦发生延迟,将会在数秒内致使全部应用资源被耗尽。github
例如:一个依赖30个服务的系统,每一个服务99.99%可用。
此系统的失败率为1-99.99%的30次方 ≈ 0.3%
意味着一亿次请求 会有 3,000,00次失败
随着服务依赖数量的变多,服务不稳定的几率会成指数性提升.后端
Hystrix把服务调用统称为依赖调用, Hystrix经过命令模式封装依赖调用,每个依赖调用封装在HystrixCommand中,每一个命令在Hystrix的线程池中运行。另外能够对其配置分组名、线程组,使得不一样的依赖能够分类在不一样的线程组,隔离不一样模块的依赖,也可根据负载状况,配置不一样组的线程数。Hystrix还提供一种熔断器(CircuitBreaker)的机制,Hystrix能够经过设定的条件判断该封装的依赖调用是否能够正确调用,若是在必定时间内调用失败次数过多,则会熔断自身,使得相同的调用没法执行,待冷却以后从新再试。缓存
1.pom.xml中加入依赖app
<dependency> <groupId>com.netflix.hystrix</groupId> <artifactId>hystrix-core</artifactId> <version>${hystrix.version}</version> </dependency>
2.继承HystrixCommand,在run()方法中完成对依赖的调用:异步
public class CustomeCommand extends HystrixCommand<String> { protected CustomeCommand(String input) { //设置HystrixCommand的属性 super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomeGroup")) .andCommandKey(HystrixCommandKey.Factory.asKey("CustomeKey")) .andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("CustomeThreadPool")) .andCommandPropertiesDefaults(HystrixCommandProperties.Setter() .withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.THREAD)) .andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter() .withCoreSize(10)) ); } @Override protected String run() throws Exception { //访问真正的服务 return "hello World!"; } //服务降级 @Override protected String getFallback() { return "exeucute Falled"; } //请求缓存 @Override protected String getCacheKey() { // } }
GroupKey:该命令属于哪个组,能够帮助咱们更好的组织命令。
CommandKey:该命令的名称
ThreadPoolKey:该命令所属线程池的名称,一样配置的命令会共享同一线程池,若不配置,会默认使用GroupKey做为线程池名称。
CommandProperties:该命令的一些设置,包括断路器的配置,隔离策略,降级设置,以及一些监控指标等。
ThreadPoolProerties:关于线程池的配置,包括线程池大小,排队队列的大小等。分布式
3.调用HystrixCommandide
CustomeCommand command = new CustomeCommand(); String result = command.execute();
同步执行:即一旦开始执行该命令,当前线程就得阻塞着直到该命令返回结果,而后才能继续执行下面的逻辑。当调用命令的execute()方法即为同步执行(内部使用queue().get() )。
异步执行:命令开始执行会返回一个Future<T>的对象,不阻塞后面的逻辑,开发者本身根据须要去获取结果。当调用HystrixCommand的queue()方法即为异步执行。gradle
CustomeCommand command = new CustomeCommand(); Future<String> result = command.queue(); while (!result.isDone()){ System.out.println("Do other things ..."); }
响应式执行:命令开始执行会返回一个Observable<T> 对象,开发者能够给给Obeservable对象注册上Observer或者Action1对象,响应式地处理命令执行过程当中的不一样阶段。当调用HystrixCommand的observe()方法,或使用Observable的工厂方法(just(),from())即为响应式执行,这个功能的实现是基于Netflix的另外一个开源项目RxJava网站
CustomeCommand command = new CustomeCommand(); Observable<String> result = command.observe(); result.subscribe(new Action1<String>() { @Override public void call(String str) { logger.info("Command called. Result is:{}", str); } });
或
CustomeCommand command = new CustomeCommand(); Observable<String> result = command.observe(); result.subscribe(new Observer<String>() { @Override public void onCompleted() { logger.info("Command Completed"); } @Override public void onError(Throwable e) { logger.error("Command failed", e); } @Override public void onNext(String args) { logger.info("Command finish,result is {}", args); } }); }
Hystrix还提供给咱们一个监控功能Hystrix-dashboard,能够直接使用其开源项目进行配置,就能实时的观察咱们的服务调用状况。
1.构建dashboard项目
Shell代码 收藏代码
$ git clone https://github.com/Netflix/Hy...
$ cd Hystrix/hystrix-dashboard
$ ../gradlew jettyRun
打开路径:http://localhost:7979/hystrix...
2.配置服务状态上报
<servlet> <display-name>HystrixMetricsStreamServlet</display-name> <servlet-name>HystrixMetricsStreamServlet</servlet-name> <servlet-class>com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HystrixMetricsStreamServlet</servlet-name> <url-pattern>/hystrix.stream</url-pattern> </servlet-mapping>
3.添加stream
在hystrix-dashboard中按照说明添加本身的 http://hystrix-app:port/hystr... ,而后监视
4.若是是集群,经过turbine进行监视
https://github.com/Netflix/Hy...
http://ningandjiao.iteye.com/...
http://fobject.iteye.com/blog...