1. Hystrix是谁?
Hystrix源于Netflix API团队在2011年启动的弹性工程工作,而目前它在Netflix每天处理着数百亿的隔离线程以及数千亿的隔离信号调用。该库旨在通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以及监控和配置等功能。
目前托管在github上。
在大中型分布式系统中,通常系统很多依赖(HTTP,Dubbo等),如果一个应用不能对来自依赖的故障进行有效处理,那该应用本身就处在被拖垮的风险中。在一个高流量的网站中,某个单一的后端一旦发生延迟,将会在数秒内导致所有应用资源被耗尽。
例如:一个依赖30个服务的系统,每个服务99.99%可用。
此系统的失败率为1-99.99%的30次方 ≈ 0.3%
意味着一亿次请求 会有 3,000,00次失败
随着服务依赖数量的变多,服务不稳定的概率会成指数性提高.
Hystrix把服务调用统称为依赖调用, Hystrix通过命令模式封装依赖调用,每一个依赖调用封装在HystrixCommand中,每个命令在Hystrix的线程池中运行。另外可以对其配置分组名、线程组,使得不同的依赖可以分类在不同的线程组,隔离不同模块的依赖,也可根据负载情况,配置不同组的线程数。Hystrix还提供一种熔断器(CircuitBreaker)的机制,Hystrix可以通过设定的条件判断该封装的依赖调用是否可以正确调用,如果在一定时间内调用失败次数过多,则会熔断自身,使得相同的调用无法执行,待冷却之后重新再试。
3. 如何使用?1.pom.xml中加入依赖
com.netflix.hystrix hystrix-core ${hystrix.version}
2.继承HystrixCommand,在run()方法中完成对依赖的调用:
public class CustomeCommand extends HystrixCommandHystxixCommand支持如下的配置:{ 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.调用HystrixCommand
CustomeCommand command = new CustomeCommand(); String result = command.execute();HystrixCommand提供了3种执行方式:
同步执行:即一旦开始执行该命令,当前线程就得阻塞着直到该命令返回结果,然后才能继续执行下面的逻辑。当调用命令的execute()方法即为同步执行(内部使用queue().get() )。
异步执行:命令开始执行会返回一个Future
CustomeCommand command = new CustomeCommand(); Futureresult = command.queue(); while (!result.isDone()){ System.out.println("Do other things ..."); }
响应式执行:命令开始执行会返回一个Observable
CustomeCommand command = new CustomeCommand(); Observableresult = command.observe(); result.subscribe(new Action1 () { @Override public void call(String str) { logger.info("Command called. Result is:{}", str); } });
或
CustomeCommand command = new CustomeCommand(); Observable4. Hystrix监控result = command.observe(); result.subscribe(new Observer () { @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.配置服务状态上报
HystrixMetricsStreamServlet HystrixMetricsStreamServlet com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet HystrixMetricsStreamServlet /hystrix.stream
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...
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/70329.html
摘要:断路器本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时,断路器能够及时的切断故障电路,防止发生过载发热甚至起火等严重后果。具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以及监控和配置等功能。 转载请注明出处 http://www.paraller.com 代码机制:熔断 & Fallback & 资源隔离 熔断 概念: 在微服务架构中,我们将系...
摘要:以下示例显示了具有断路器的最小服务器由名为的库提供,在连接到断路器的代理中自动包装带有该注解的,断路器计算何时打开和关闭电路以及在发生故障时应采取的措施。上一篇服务发现下一篇超时和客户端 断路器:Hystrix客户端 Netflix创建了一个名为Hystrix的库,用于实现断路器模式,在微服务架构中,通常有多层服务调用,如以下示例所示: 较低级别的服务中的服务故障可能导致级联故障一直到...
摘要:传播安全上下文或使用,通过增加的属性,来增加相关的配置来达到执行隔离策略,控制线程数或者控制并发请求数来达到熔断降级的作用。 SpringCloud(第 015 篇)电影Ribbon微服务集成Hystrix增加隔离策略控制线程数或请求数来达到熔断降级的作用 - 一、大致介绍 1、本章节介绍关于Hystrix的2种隔离方式(Thread Pool 和 Semaphores); 2、Thr...
摘要:要运行仪表板,请使用注解主类,然后访问并将仪表板指向客户端应用程序中的单个实例的端点。连接到使用的端点时,必须信任服务器使用的证书,如果证书不受信任,则必须将证书导入,以便仪表板成功连接到流端点。 Hystrix超时和Ribbon客户端 使用包装Ribbon客户端的Hystrix命令时,要确保将Hystrix超时配置为长于配置的Ribbon超时,包括可能进行的任何可能的重试,例如,如果...
摘要:栈长得到消息,停止开发了。。。是一个轻量级的容错组件,其灵感来自于,主要为和函数式编程设计的看到这里,栈长表示学不动了。。。上面说了,官方推荐替代的开源组件,这个栈长也没有用过,查了下,资料也比较稀少。 showImg(https://segmentfault.com/img/remote/1460000017201104?w=1600&h=1066); 栈长得到消息,Hystrix ...
阅读 1525·2023-04-26 01:36
阅读 2695·2021-10-08 10:05
阅读 2732·2021-08-05 09:57
阅读 1515·2019-08-30 15:52
阅读 1172·2019-08-30 14:12
阅读 1239·2019-08-30 11:17
阅读 3075·2019-08-29 13:07
阅读 2394·2019-08-29 12:35