2018/2/20 Springretry,Feign,以及用通俗的语言(自认为)教会你关于Hystrix的复杂概念
本来想昨天写的,但临时有事。弄的一晚上都没睡觉,现在头好晕,所以此笔记如果有语言措辞的组织不当,还请见谅;最后,本文可能涉及到大量专业名词,我会尽量用通俗的语句去阐述清楚它们的意思,但如果还是没看懂,请自己百度;
首先介绍下Springretry,Spring为我们提供的一个重试机制工具类,而在SpringCloud中,其一般都是与ribbon整合来进行负载均衡调用的重试;
这里注掉连接超时时间和处理超时时间的原因的是我在没有配置断路器(Hystrix的时候,这两个设置没起到作用,只有配置的情况下才起到作用);
另外要注意的是,重试时切换示例次数那个配置如果不配置的话会把你当前要调用服务的所有实例都切换然后试一次;
最后在配置retry的时候一定要做好幂等处理,因为当你的请求发过去后,处理超时不代表连接超时,可能服务的提供方已经在做一些逻辑处理,只是还没结束,但这个时候到达了处理超时时间,那么retry就会直接再发一次请求。这样如果你是做post请求的话,那么就等于插入了多条数据;
Hystrix,这个要划重点,我觉得在说这个框架之前,有必要先说说分布式架构里著名的CAP定理,C(数据一致性),A(服务可用性(对一个服务的请求必须要得到响应)),P(服务容错性(不能因为一个服务的问题而影响到其它服务));
我个人认为Hystrix在分布式服务里解决了非核心业务中中的P以及A。为什么这么说呢?
先来给大家模拟一个场景:
服务A与服务B,其中服务B是服务A的依赖服务。此时,一个请求访问了服务A,而服务A为了响应这个请求则必须去调用服务B。但此时,服务B因为机器原因出现了一些故障导致无法很快速的响应服务A,因此,服务A堆积的请求越来越多,线程资源无法释放,这样一来,就会导致服务A瘫痪,而服务A一瘫痪,可能会导致依赖服务A的服务也会
跟着瘫痪,就像多米诺骨牌一样,服务一个连着一个瘫痪掉,形成了雪堆效应(网上通用说法,我更喜欢理解为蝴蝶效应),这也就是没法实现CAP定理中的P了;
而Hystrix做了什么事呢?
很简单,降级处理,依赖隔离,信号量,以及熔断机制
降级处理,很简单,当服务连接或处理超时,亦或者触发了某些条件后(依赖隔离,信号量),就不会走实际调用的方法,而是走fallback属性指定的一个方法,比如我们本来是要去从redis中获取一条数据的,但因为redis连接或处理超时,亦或者访问线程超过了我们设定的数值后,那么我们就可以在fallback方法中指定一个方法,而这个方法则是去
访问数据库的,这就是所谓的降级处理,当最佳选择不能使用时,便实行次佳选择;
当然也可以在触发异常时做降级处理
依赖管理:
就是说当前这个方法的运行,我Hystrix内部维护一个线程池专门去运行它,而不需要你的容器请求线程,此时你容器的请求线程就可以离开,等到我完成任务的时候,再会通知请求线程返回我处理完的结果;
其实当你调用HystrixCommand这个注解的时候,已经就是默认开启了依赖管理,至于默认的线程数量,任务队列的大小,我倒是没有在官方文档中找到,不过这个是可以配置的;
前面两个配置应该都能看懂,最后一个是什么意思呢?
queueSizeRejectionThreshold这个属性的意思是,实际任务队列的大小,而且此属性是动态的,也就是说,你可以在项目运行时更改,它可以动态的去控制,貌似这个是用到什么Rxjava热观察的一个技术,具体的也不用去深究,理解为热加载一类的技术即可;
至于为什么需要这个属性呢?这是为了根据服务器实际情况去动态的调整任务队列,以免引起任务积压,导致响应太慢;
最后一但任务队列满了后,就会自动走降级方法;
这里再提一个点:
这个commanKey属性看上去没有意义,但其实是对于实行依赖管理后线程组的分组,也就是说,多个方法使用了同一个key,那么它们就共用同一个线程组;
信号量:
因为依赖管理使用的是内部线程池,并且是并发状态,考虑到线程并发处理,线程之间的切换调度,这些都比较耗资源与时间。所以如果对于响应时间要求非常高的服务,那么依赖管理肯定无法满足我们的需求,这个时候就需要信号量了;
那么信号量是什么呢?信号量其实就是一个开关,比如你现在限定只能有十个线程同时调用此方法,如果此时有第十一个线程的话,那么便会直接走降级方法;
熔断机制:
此机制概念较模糊,它的作用是,在一定的时间内(官方术语叫快照窗),你当前如果有超过一定百分比的请求都走了降级处理的话(当然它有一个请求的最低数量限制,只有超过了这个请求数量才会开始计算),那么后面的请求都是走降级方法。在经过一段时间后,它会放行一个请求去走主逻辑(原本我们调用的方法),如果此时没有出现问题,
那么它就会快速清空线程池,并关闭熔断机制,让后面的请求继续交由依赖管理机制;
看到这里应该明白为什么我说Hystrix能解决A和P了吧?其实Hystrix的功能十分强大,远不止于这些,详情可以查询官方文档;ps:谷歌浏览器的翻译贼好用,推荐英文不行的使用谷歌浏览器访问,翻译控件开关在右上角。收藏的那个★旁边;
最后Feign:
其实就是本地创建一个你要调用的服务的代理,这个太简单,直接看代码就行,我注释都写的比较全
此时负责降级处理的类
在访问依赖服务的时候,直接调用我们使用Feign的在本地绑定的访问服务的代理即可,spring会帮我们依赖注入
有一点要注意:
如果你是Dalston.SR1版本请手动开启feign的断路器功能,其它版本请忽略,网上的教程也大都是此版本,但我当时使用的是SR3,并且当时没有手动开启,而断路器功能是正常启用的,所以如果SR3版本应该是默认开启的
2018/2/20 Springretry,Feign,以及用通俗的语言(自认为)教会你关于Hystrix的复杂概念的更多相关文章
- 2018.6.20 Java考试试题总结(Java语言基础与面向对象编程)最新版
Java考试试题总结 一.单选题(每题1分 * 50 = 50分) 1.java程序的执行过程中用到一套JDK工具,其中javac.exe指( B ) A.java语言解释器 B.java字节码编译器 ...
- OSC Source Code Innovation Salon(2018.10.20)
时间:2018.10.20地点:北京 朝阳 浦项中心B座2层
- PCB 所建不凡 AWS 技术峰会2018 • 深圳站 2018.9.20
在去[AWS 技术峰会2018 • 深圳站]之提前并没有AWS提前做功课,主要PCB这行业基本自己搭服务器搭应用,不会买云服务器.由于没用过企业级的云服务器,对云这方面还是了解还是非常有限的. 市面上 ...
- 谁能用通俗的语言解释一下什么是 RPC 框架
转载自知乎:https://www.zhihu.com/question/25536695 知乎上很多问题的答案还是很好的,R大就经常在上面回答问题~ 谁能用通俗的语言解释一下什么是 RPC 框架? ...
- 2018.8.20 Python之路---常用模块
一.re模块 查找: re.findall(‘正则表达式’,‘字符串’) 匹配所有符合正则表达式的内容,形成一个列表,每一项都是列表中的一个元素. ret = re.findall('\d+','sj ...
- 2018.10.20 2018-2019 ICPC,NEERC,Southern Subregional Contest(Online Mirror, ACM-ICPC Rules)
i207M的“怕不是一个小时就要弃疗的flag”并没有生效,这次居然写到了最后,好评=.= 然而可能是退役前和i207M的最后一场比赛了TAT 不过打得真的好爽啊QAQ 最终结果: 看见那几个罚时没, ...
- 2018.9.20 Educational Codeforces Round 51
蒟蒻就切了四道水题,然后EF看着可写然而并不会,中间还WA了一次,我太菜了.jpg =.= A.Vasya And Password 一开始看着有点虚没敢立刻写,后来写完第二题发现可以暴力讨论,因为保 ...
- 2018.5.20 oracle强化练习
--现在有一个商店的数据库,记录客户以及购物的情况, 商品表goods (商品号 goodsid varchar2(8) 商品名 goodsname varchar2(20) 单价 unitprice ...
- 【2018.10.20】CXM笔记(思维)
1. 给你个环状字符串,问从哪个地方拆开能使它的字典序最小. 先预处理任意子串的哈希值. 然后枚举拆点,将它与当前最优的拆点比较谁更优(就是从哪拆的字典序更小),具体方法是二分+哈希找出两串最长的相同 ...
随机推荐
- js学习笔记-事件委托
通过事件委托,你可以把事件处理器绑定到父元素上,避免了把事件处理器添加到多个子级元素上.从而优化性能. 事件代理用到了事件冒泡和目标元素.而任何一个元素的目标元素都是一开始的那个元素. 这里首先要注意 ...
- mysql之修改字符编码
目录 统一修改字段编码 修改单个字段编码 修改表字符编码 统一修改字段编码: alter table `tablename` convert to character set utf8; 修改表字符编 ...
- Javascript数据结构之栈
作者原文:http://hawkzz.com/blog/blog/1515054561771 定义 栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶.栈被称为一种先入后出的数据结构 ...
- 免费大数据搜索引擎 xunsearch 实践
以前在IBM做后端开发时,也接触过关于缓存技术,当时给了n多文档来学习,后面由于其他紧急的项目,一直没有着手去仔细研究这个技术,即时后来做Commerce的时候,后台用了n多缓存技术,需要build ...
- Android SpannableString及字体设置
import android.content.Context; import android.graphics.Color; import android.text.SpannableString; ...
- iOS programming UITabBarController
iOS programming UITabBarController 1.1 View controllers become more interesting when the user's acti ...
- iTOP-6818开发板-Android4.4系统下RFID射频模块测试例程
平台:迅为iTOP-6818开发板 系统:Android4.4版本 例程:RFID射频模块测试例程 rc522 驱动在 Android 系统的内核是默认集成的,用户可以在开发板上使用命令“ls /de ...
- Activiti数据库表结构(表详细版)
http://blog.csdn.net/hj7jay/article/details/51302829 1 Activiti数据库表结构 1.1 数据库表名说明 Activiti工作流总 ...
- 前端工程化与webpack
(1) 前端工程化 近几年来,前端领域飞速发展,前端的工作早已不再是切几张图,写几个页面那么简单,项目比较大时,很可能会多人协同开发,模块化,组件化,CSS预编译等技术也被广泛的使用.前端自动化( ...
- selenium click radio
radio = dr.find_element_by_xpath('//*[@id="contentTable"]/tbody/tr[1]/td[1]/input') webdri ...