让服务更稳 -熔断器hystrix介绍
一、为何使用熔断器
在大中型分布式和微服务架构的系统中,一个系统通常会依赖很多组件,通过不同方式(HTTP,hession,Netty,Dubbo等)连接,如下图
在高并发访问下,这些依赖的稳定性与否对系统的影响非常大。但是依赖有很多不可控问题:如网络连接缓慢,资源繁忙,暂时不可用,服务宕机等。如下图:QPS为50的依赖I出现不可用,但是其他依赖仍然可用。
当依赖I阻塞时,主服务器的线程池就出现阻塞(BLOCK),影响整个线上服务的稳定性,如下图:
在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败。高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险。
我们举个例子:
一个依赖有30个服务的系统,每个依赖服务都能保证99.99%的高可用。
99.99%的30次方≈99.7%,意味着这个系统的最高只能有99.7%的可用性,大大降低了服务的可用性。
解决问题方案:对依赖做隔离,Hystrix就是处理依赖隔离的框架,同时也是可以帮我们做依赖服务的治理和监控。
二、Hystrix服务治理
Hystrix是由Netflix开源的一款容错框架,致力于提升在分布式系统架构中的系统稳定性。主要功能:
1、自动熔断,降级处理
如上面图所示,当主服务发现依赖I大量出现超时、错误、异常等情况时,会对依赖I进行开启熔断处理。开启熔断后,接下来一段时间内将不再调用服务I,主服务走相应的降级逻辑。
好处:
a、对主服务性能影响很小,不会出现大规模的阻塞,拖垮主服务的情况。
b、减少对服务I的调用,降低服务I的压力,有利于服务I的恢复。
2、自动恢复
熔断器在熔断期间会不停的尝试少量请求,当依赖服务I手动或自动恢复后,尝试请求成功,一段时间都成功后,会关闭熔断器,恢复正常访问。
整个过程主服务自动熔断,自动恢复,对主服务对外透明无感知。建议更 适合对查询类接口加入熔断处理。
三、Hystrix监控界面
1、监控平台Hystrix-dashboard
Hystrix-dashboard提供了对依赖服务调用的监控,下图为一个依赖服务的调用详情。
左上角图表:服务调用总体情况
圆形大小表示调用量多少;
颜色表示健康情况,绿色正常,红色异常;
折线图表示调用量-时间图。
右上角图标:”socCaptchaStatic”:服务名称
下面6个数字依次为10s种之内的
成功数、超时数、熔断数、拒绝数、接口异常数、失败数,
百分比为10s种之内的错误占比。
中间图表:
Host:10s之内的平均请求数
Cluster:10s之内集群的平均请求数
Circuit:是否开启熔断
下方图标:
Hosts:集群数
Median:耗时中位数
Mean:耗时平均数
90th:耗时90%分位
99th:耗时99%分位
99.5th:耗时99.5%分位
2、集群监控Turbine
上面监控为单机的调用情况,往往我们需要合并集群内多个实例的调用情况,需要使用Turbine组件,来做合并。
四、Hystrix使用实战
1、依赖maven
2、使用命令模式封装依赖逻辑
输出:
可以看到run方法是在不同的线程中执行。
默认使用的是线程池方法实现,使用线程池来隔离(也可以设置成信号量实现)。原理图
3、使用Fallback() 提供降级策略
输出:
设置超时时间500ms,接口sleep 1s,触发超时,走降级逻辑。Run方法中抛出异常,当前熔断开启都会走降级处理的方法。
4、设置参数
可对不同的command设置不同的参数,用于分组,统计和满足不同的业务需求。
5、配置监控
A、主工程配置servlet
B、下载hystrix-dashboard.war,
地址:http://search.maven.org/remotecontent?filepath=com/netflix/hystrix/hystrix-dashboard/1.5.12/hystrix-dashboard-1.5.12.war
C、下载turbine-web.war,
地址:http://search.maven.org/remotecontent?filepath=com/netflix/turbine/turbine-web/1.0.0/turbine-web-1.0.0.war
修改包中配置文件:config.properties
turbine.instanceUrlSuffix=:8080/soc-web-api/hystrix.stream //某个服务的path
turbine.ConfigPropertyBasedDiscovery.soc-web-api.instances=127.0.0.1 //集群地址
D、把turbine-web合并到hystrix-dashboard中,注意web.xml合并。
E、把hystrix-dashboard放到tomcat中启动,访问http://127.0.0.1:8080/hystrix-dashboard/
输入上图中地址,点击“监控”按钮,即可监控服务。
参考资料:
https://github.com/Netflix/Hystrix
https://github.com/Netflix-Skunkworks/hystrix-dashboard
https://github.com/Netflix/Turbine
作者|开鑫金服-邓安明,安全中心-资深开发。
编辑|Andy
领取专属 10元无门槛券
私享最新 技术干货