Hystrix——让你的服务更稳一点
摘要: 1、为什么要用Hystrix在分布式服务环境下,服务之间的调用关系变得错综复杂,你是否担心依赖的服务延迟导致自己的服务也被拖跨呢?是否在苦苦思考如何优雅的对依赖服务进行异步调用呢?是否希望当流量高峰时自动进行 ...
1、为什么要用Hystrix 在分布式服务环境下,服务之间的调用关系变得错综复杂,你是否担心依赖的服务延迟导致自己的服务也被拖跨呢?是否在苦苦思考如何优雅的对依赖服务进行异步调用呢?是否希望当流量高峰时自动进行服务降级避免把自己线程耗尽而宕机?以上的问题,Hystrix能有效的解决。
2、什么是Hystrix
![]() Hystrix由Netflix于2011年创立的项目,最初是用于解决系统快速恢复的需求,其特性能保证在分布式服务中,防止服务失败引起的级联失败,项目的熔断机制能够使依赖服务的调用快速失败并且自动恢复,有效避免对失败的服务进行请求。同时对每个接口进行线程池隔离(或按信号量隔离),避免因为高峰流量或服务延迟导致线程耗尽而宕机。
![]() 3、Hystrix入门介绍
Hystrix使用HystrixCommand和HystrixObservableCommand进行对调用接口的封装,从而使接口的调用自动实现了线程隔离以及调用熔断机制,通过执行execute() 或者queue() 就能完成接口的同步或者异步调用。使用上手相当轻松,那么我们就先以一个简单程序来认识Hystrix:
a) 项目加入Hystrix依赖
![]() b) 创建一个用来被调用的方法, HelloWorldService
![]() c) 创建一个使用HystrixCommand包装的调用, HelloWorldInvoker
![]() d) 进行调用测试
![]() 4、Hystrix核心框架(HystrixCommand)
HystrixCommand是框架的流程核心类,主要承担封装接口的调用执行,将接口调用进行命令分组,调用执行进行线程池隔离,请求的结果缓存命中,判断熔断,以及执行错误或熔断后的结果FallBack机制流程,主要工作流程如下图:
![]() 4.1 HystrixCommand创建
HystrixCommand创建需要两个必填参数:HystrixCommandGroupKey和HystrixThreadPoolKey,HystrixCommandGroupKey用于进行command分组,便于调用统计。HystrixThreadPoolKey用于线程池隔离,相同的线程池key的接口调用,将会使用相同的线程池,线程池大小默认为10个线程,其余参数将会一并初始化。
![]() 4.2 HystrixCommand执行
分别可使用execute(),queue(),observe(),toObservable()完成接口调用并包装上述工作全流程, 四种执行方式区别如下:
a) execute:command执行后进行同步等待,直到结果返回
b) queue:command执行后返回一个Future对象,Future对象可以进行异步的结果获取
c) observe:command立即执行,进行接口调用后并返回observable,外部subscriber进行数据读取
d) toObservable:command不会立即执行,接口调用仅当有外部subscriber进行订阅后,接口才会被调用
前三种执行方式都是toObservable的变种,command底层均是执行toObservable方法得到一个Observable对象,然后该对象被订阅的Subscriber进行结果获取。过程如下:
![]() 5、Hystrix核心框架(HystrixCircuitBreaker)
5.1 熔断器HystrixCircuitBreaker,是保证调用接口延迟或失败情况下自动熔断,保证服务不被外部调用的失败而拖跨。熔断器和每个HystrixCommand绑定,为每个独立的command进行失败计数和熔断状态控制。在创建command时对熔断器进行初始化
![]() 5.2 HystrixCircuitBreaker 通过HealthCountsStream维护一个command调用的健康计数器,如果计数器的线程堆积数大于允许的阙值或者调用失败比例大于允许的百分比,则进行熔断处理,后续接口调用均会被短路并降级调用fallBack()返回。
![]() 5.3 HystrixCircuitBreaker将在熔断后的一段时间内,允许部分请求进行接口调用,若返回接口正确,则熔断器将关闭,服务进行正常请求,若此时接口调用仍旧失败,则熔断器保持熔断,并重新进行半熔断状态倒计时。
6、Hystrix核心框架(RequestCache)
接口调用中,如果不是高频次修改的数据查询结果,可以使用请求缓存来减少服务调用的网络开销,Hystrix会基于调用的key进行结果命中,当能匹配到结果是则直接返回结果而避免进行接口调用。
a) 请求缓存是基于command中的getCacheKey()方法判断是否是相同请求,所以需重写该方法
![]() b) 确保在调用之前开启HystrixRequestContext,可以使用统一的拦截器来进行拦截开启。
![]() 7、Hystrix核心框架(FallBack)
当接口调用超时或者直接出现异常,框架将对接口调用进行降级处理,调用fallBack进行结果返回。接口调用的降级只需要在HystrixCommand中重写getFallBack()方法,方法同接口调用一样的返回,用于直接书写接口返回,或者在fallBack中继续调用HystrixCommand进行接口的降级调用
![]() 8、项目中的应用实现 Hystrix的服务隔离主要有两种,常用的就是线程池隔离的方式,对热点接口建立单独的线程池避免对主程序的影响。另一种是信号量的方式,用的场景不是太多。两者的区别其实就是一个增大系统的开销,一个则直接限制了线程总的并发数,开销更小一些。
在传统Spring项目中的应用
<!-- hystrix --> 在Spring的配置文件中配置Hystrix的切面信息 <bean id="hystrixAspect" class="com.netflix.hystrix.contrib.javanica.aop.aspectj.HystrixCommandAspect"></bean> 主要是开启注解的AOP扫描 @Configuration 可以看到我们主要是通过这个类切面扫描Hystrix的相关注解,以达到接口处理前,提前执行Hystrix相关逻辑的代码。 /** 注意: 9、总结
Hystrix对于接口调用具有很好的保护,能在多服务依赖的分布式系统中,有效的提供应用的可用性,并且对失败应用进行熔断和恢复检查,让应用在复杂的环境中也能各种稳。
常用参数介绍
|
Hystrix——让你的服务更稳一点的更多相关文章
- SpringCloud实战-Hystrix请求熔断与服务降级
我们知道大量请求会阻塞在Tomcat服务器上,影响其它整个服务.在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败.高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险 ...
- 用 Hystrix 构建高可用服务架构
1 hystrix是什么 在分布式系统中,每个服务都可能会调用很多其他服务,被调用的那些服务就是依赖服务,有的时候某些依赖服务出现故障也是很正常的. Hystrix 可以让我们在分布式系统中对服务间的 ...
- Hystrix请求熔断与服务降级
Hystrix请求熔断与服务降级 https://www.cnblogs.com/huangjuncong/p/9026949.html SpringCloud实战-Hystrix请求熔断与服务降级 ...
- 更强、更稳、更高效:解读 etcd 技术升级的三驾马车
点击下载<不一样的 双11 技术:阿里巴巴经济体云原生实践> 本文节选自<不一样的 双11 技术:阿里巴巴经济体云原生实践>一书,点击上方图片即可下载! 作者 | 陈星宇(宇慕 ...
- SpringCloud学习之Hystrix请求熔断与服务降级(六)
我们知道大量请求会阻塞在Tomcat服务器上,影响其它整个服务.在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败.高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险 ...
- 孤荷凌寒自学python第四十六天开始建构自己用起来更顺手一点的Python模块与类尝试第一天
孤荷凌寒自学python第四十六天开始建构自己用起来更顺手一点的Python模块与类,尝试第一天 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 按上一天的规划,这是根据过去我自学其它编程语 ...
- CODING Pages 服务全面升级,更快更稳更可靠!
尊敬的 CODING 用户: 您好! 由于原上游服务商无法满足 CODING Pages 日益增长的用户量以及访问速度需求,同时提供的 DDoS 解决方案无法支撑大型 DDoS 攻击,给 CODING ...
- 【架构】Kubernetes和Spring Cloud哪个部署微服务更好?
Spring Cloud 和Kubernetes都自称自己是部署和运行微服务的最好环境,但是它们在本质上和解决不同问题上是有很大差异的.在本文中,我们将看到每个平台如何帮助交付基于微服务的架构(MSA ...
- nodejs 从helloworld到高质量的后台服务server的一点思考
---恢复内容开始--- 新公司用的nodejs作为app和网站的后台服务server,所以最近对nodejs一直在学习,加上之前简单的学习了一点,看了两天后台接口源码,所以就直接上手干活了,下面是我 ...
随机推荐
- JS对象—数组总结(创建、属性、方法)
JS对象—数组总结(创建.属性.方法) 1.创建字符串 1.1 new Array() var arr1 = new Array(); var arr2 = new Array(6); 数组的长度为6 ...
- Unity旋转问题的总结
1.物体的直接旋转 transform.Rotate();这个函数是在当前状态下网某个方向旋转.并且这里可以设置为世界空间或者自身空间. transform.rotation;这里可以通过直接定义一个 ...
- 【LeetCode】123、买卖股票的最佳时机 III
Best Time to Buy and Sell Stock III 题目等级:Hard 题目描述: Say you have an array for which the ith element ...
- 【神经网络与深度学习】caffe+VS2013+Windows无GPU快速配置教程
首先来一波地址: happynear大神的第三方caffe:http://blog.csdn.net/happynear/article/details/45372231 Neil Z大神的第三方ca ...
- 微信小程序 解析html格式内容
需要引入html-view文件 1/js 代码 const HtmlParser=require('../../utils/html-view/index') data: { coupon_text: ...
- javascript 数据类型之数值转换
数值转换 一.有3个函数可以把非数值转换为数值: Number() parse Int() parse Float() 说明: 1.Number()可以用于任何数据类型,强转类型,如果不能把指转成数值 ...
- Win10无法安装.net framework 3.5出错提示无法安装以下功能该怎么办?
在Windows操作系统中,.NET Framewor对今天应用程序的成功提供了的安全解决方案,它能强化两个安全模型间的平衡.在提供对资源的访问,以便以完成有用的工作,对应用程序的安全性作细致的控制以 ...
- Spring MVC 中使用AOP 进行事务管理--XML配置实现
1.今天写一篇使用AOP进行事务管理的示例,关于事务首先需要了解以下几点 (1)事务的特性 原子性(Atomicity):事务是一个原子操作,由一系列动作组成.事务的原子性确保动作要么全部完成,要么完 ...
- 【转帖】大话Spring Cloud
springcloud(一):大话Spring Cloud 2017/05/01 http://www.ityouknow.com/springcloud/2017/05/01/simple-sp ...
- ORA-01406:提取的列值被截断 ; SQL Server :将截断字符串或二进制数据
oracle 数据库可以正常连接,表数据也可以正常读取, 但在程序中相同的位置,有时会报错,有时不会报错,有的电脑会报错,有的不会 报错内容为 ORA-01406:提取的列值被截断 查了网上提供的一些 ...