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一直在学习,加上之前简单的学习了一点,看了两天后台接口源码,所以就直接上手干活了,下面是我 ...
随机推荐
- centos 7 ip a 或ifconfig 报command not found
CentOS 7 下 ifconfig command not found 或 ip command not found 解决办法 首先查看:/sbin/ifconfig /sbin/ip 是否存 ...
- Cocos2d-X多线程(2) 线程的互斥量std::mutex和线程锁
多个线程同时访问共享资源时,经常会出现冲突等.为了避免这种情况的发生,可以使用互斥量,当一个线程锁住了互斥量后,其他线程必须等待这个互斥量解锁后才能访问它. thread提供了四种不同的互斥量: 1. ...
- LeetCode.922-按奇偶排序数组 II(Sort Array By Parity II)
这是悦乐书的第354次更新,第379篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第216题(顺位题号是922).给定非负整数的数组A,A中的一半整数是奇数,而剩下的一半 ...
- 【miscellaneous】监狱智能视频监控系统设计解决方案
监狱智能视频监控系统设计解决方案 一.系统概况 随着司法监狱管理系统内视频监控系统的日益发展,现有的被动式人工监控这一传统模式已无法满足新形势下的监管工作需求,尤其是现在靠轮询的视频监控方式,无法对突 ...
- cell_phone_network(树形dp求最小支配集)
Cell Phone Network Farmer John has decided to give each of his cows a cell phone in hopes to encoura ...
- Git介绍、安装、命令和实战
一.Git介绍 Git是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. 二.Git安装(Mac系统) 在Git官网下载安装包双击直接安装 在终端输入git来检测Git ...
- shiro三连斩之概念
1, 什么是Shiro? Shiro是一个安全框架,用于解决系统的认证和授权问题,同时提供了会话管理,数据加密,与WEB集成,缓存等机制. Authentication:身份认证/登录,验证用户是不是 ...
- HDU 3182 ——A Magic Lamp(思维)
Description Kiki likes traveling. One day she finds a magic lamp, unfortunately the genie in the lam ...
- 786B - Legacy(线段树 + 最短路)线段树优化建图
题意: 就是给定一张n nn个点的图,求源点s ss到每个点的单源最短路.这张图共有q组边,连边方式有3种: a→b ,边权为w的单向边:a→[l,r] ,即a到连续区间[l,r]中的每一个点都有一条 ...
- 使用python的subprocess模块调用linux系统命令
subprocess模块主要有call().check_call().check_output().Popen()函数,简要描述如下: Main API ======== call(...): Run ...













