一、微服务“熵”和 “环”
1.1、微服务之“熵”
可以先看看2012年淘宝核心链路应用拓扑图
1.2、微服务之“环”
如何检测服务调用是否存在环路(参考单链表环路定义:在链表中某个节点的next元素指向在它前面出现过的节点,则表明该链表存在环路)
1.3、微服务之“环”检测识别
一种常见的环路识别方法:
上游服务调用下游服务时追加自身来源标识参数(trace),
下游服务收到请求时判断trace中包含自身标识次数达到固定阈值,则判定存在环路
如上图,A->B->C->D->B … 存在B、C、D、E环路
环路的危害显而易见,短时间内消耗大量服务资源,直至服务崩溃
1.4、微服务之“环”检测识别具体实现
实质就是在RPC调用层实现该判定逻辑,很少的代码入侵
二、服务熔断降级工具hystrix-go介绍
三、熔断的一些相关基础概念
首先我们要了解什么是服务雪崩:
如图,假设存在服务A->B->C调用链,A流量突增,A能扛得住,B也能扛得住,C扛不住了,这时C会影响B服务的返回结果,此时的B服务无法返回满足A预期的数据,如果A服务对B服务又有重试,可能会导致B服务完全不可用,A服务面向客户端,对于客户端来说A服务无法返回预期数据,也是不可用的了
一个服务失败,导致整条链路的服务都失败的情形,称之为服务雪崩
那什么是熔断?下面我们来用生活中常见的熔断应用举例,
第一个图是2020年3月9号,受疫情和石油崩盘影响,美国股票市场出现熔断
第二个图保险丝是用来防止过大电流产生危险的一种装置,电流大时,因过热保险丝会熔断,切断电路,起到保护作用。保险丝简单价廉,但更换麻烦。
第三个图空气开关,电流将流过双金属片而发热。如果电流过大,双金属片发热多而发生弯曲,使电路断开,起到保护作用。在排除故障后,只要稍后等双金属片冷却,按复位按钮就可恢复工作
服务熔断的原理
如下图所示,,断路器模式的状态图,当远程服务被调用时,断路器将监视这个调用,如调用时间太长,断路器将会介入并中断调用。此外,断路器将监视所有对远程资源的调用,如对某一个远程资源的调用失败次数足够多,那么断路器会出现并采取快速失败,阻止将来调用此远程资源的请求.
什么是服务降级
服务降级主要有两种场景:
一、当下游的服务因为某种原因响应过慢,下游服务主动停掉一些不太重要的业务,释放出服务器资源,增加响应速度
二、当下游的服务因为某种原因不可用,上游主动调用本地的一些降级逻辑,避免卡顿,迅速返回给用户
在实际的项目中,可以采用以下的方式来完成降级工作
梳理出核心业务流程和非核心业务流程。然后在非核心业务流程上加上开关,一旦发现系统扛不住,关掉开关,结束这些次要流程。
一个微服务下肯定有很多功能,区分出主要功能和次要功能。然后次要功能加上开关,需要降级的时候,把次要功能关了
降低一致性,即将核心业务流程的同步改异步,将强一致性改最终一致性
默认兜底数据,返回静态数据,实现方式包括hard code,配置数据,文件缓存等
Hystrix 是由 Netflex 开发的一款开源组件,提供了基础的熔断功能。 Hystrix 将降级的策略封装在 Command 中,提供了 run 和 fallback 两个方法,前者表示正常的逻辑,比如微服务之间的调用……,如果发生了故障,再执行 fallback方法返回结果,我们可以把它理解成保底操作。如果正常逻辑在短时间内频繁发生故障,那么可能会触发短路,也就是之后的请求不再执行 run,而是直接执行 fallback。hystrix-go 则是用 go 实现的 hystrix 版,更确切的说,是简化版
另外,也可以从hystrix-go的配置项看有哪些功能
配置1: Timeout
超时时间,默认1秒
配置2: RequestVolumeThreshold
默认值20.意思是至少有20个请求才进行errorThresholdPercentage错误百分比计算。比如一段时间(10s)内有19个请求全部失败了。错误百分比是100%,但熔断器不会打开,因为requestVolumeThreshold的值是20.
配置3: SleepWindow
过多长时间,熔断器再次检测是否开启,默认为5000,即5s钟
配置4: ErrorPercentThreshold
设定错误百分比,默认值50%,例如一段时间(10s)内有100个请求,其中有55个超时或者异常返回了,那么这段时间内的错误百分比是55%,大于了默认值50%,这种情况下触发熔断器-打开。
按照以上配置的熔断器表现如下:
每当20个请求中,有50%失败时(包括1秒超时失败),熔断器就会打开,此时再调用此服务,将会直接返回失败,不再调远程服务。直到5s钟之后,重新检测该触发条件,判断是否把熔断器关闭,或者继续打开
五、熔断服务在rpc调用中的应用说明
我们用一组图展示加入熔断前后的RPC调用流程对比,充分说明熔断服务的作用