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. 给你个环状字符串,问从哪个地方拆开能使它的字典序最小. 先预处理任意子串的哈希值. 然后枚举拆点,将它与当前最优的拆点比较谁更优(就是从哪拆的字典序更小),具体方法是二分+哈希找出两串最长的相同 ...
随机推荐
- VGG16 pre-trained model 实现 image classification
站在巨人的肩膀上!使用VGG预先训练好的weight来,进行自己的分类. 下一阶段是在这上面进行自己的修改,完成自己想要的功能. Github源码 Github上有我全部的工程代码. 环境配置 Pyt ...
- Android Studio 导入新工程项目
1 导入之前先修改工程下相关文件 1.1 只需修改如下三个地方1.2 修改build.gradle文件 1.3 修改gradle/wrapper/gradle-wrapper.properties 1 ...
- 安卓(Android)关于 RecyclerView 不能填充满宽度
RecyclerView 不能填充满屏幕宽度 RecyclerView 的 Adapter 在使用是,一定要 @Overridepublic RecyclerView.ViewHolder onCre ...
- MySql 基础知识-常用命令及sql语句
一.常用mysql命令行命令 1,启动mysql服务 net start mysql. 停止mysql服务 net stop mysql 2,netstart -na|findstr 330 ...
- Java HTTP 组件库选型看这篇就够了
最近项目需要使用 Java 重度调用 HTTP API 接口,于是想着封装一个团队公用的 HTTP client lib. 这个库需要支持以下特性: 连接池管理,包括连接创建和超时.空闲连接数控制.每 ...
- 【转】Web 前沿——HTML5 Form Data 对象的使用
XMLHttpRequest Level 2 添加了一个新的接口——FormData.利用 FormData 对象,我们可以通过 JavaScript 用一些键值对来模拟一系列表单控件,我们还可以使用 ...
- 使用Caliburn.Micro系列2:Convention
CM中实现一个比较有意思的特性,就是智能匹配. 通常使用MVVM的写法:在匹配 View和ViewModel时会使用DataContext,在匹配数据属性时使用Binding,在匹配事件命令时使用Co ...
- Java 字符串格式化 String.format() 的使用
常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得c语言的sprintf()方法,两者有类似之处.format()方法有两种重 ...
- html引用ttf字体文件
在样式表如此定义: @font-face { font-family: MyFontName;//自定义字体名称 src: url(../Gloss_And_Bloom.ttf) } 然后,具体使用: ...
- vue多视图
第一步 在app.vue中 <router-view class="b" name="header"> </router-view> ...