熔断降级怎么实现的?
是Sentinel实现的熔断降级。
熔断和降级是两个概念:
微服务远程调用我们用的OpenFeign,它集成了Sentinel,在远程调用时由断路器统计服务调用的异常比例、慢请求比例,如果超出阈值则会熔断该服务。
降级是当遇到访问失败可以快速返回一些默认数据或者友好提示,避免长期等待服务提供方,提高系统的稳定性。
熔断降级结合后是当线路断开后直接走降级线路避免再次去请求失败线路。
断路器包括三个状态:
- closed:关闭状态,断路器放行所有请求,并开始统计异常比例、慢请求比例、异常数。超过阈值则切换到open状态
 - open:打开状态,服务调用被熔断,访问被熔断服务的请求会被拒绝,快速失败,直接走降级逻辑。Open状态5秒后会进入half-open状态
 - half-open:半开状态,放行一次请求,根据执行结果来判断接下来的操作。请求成功则切换到closed状态,请求失败则切换到open状态。
 
我们在开发中具体是这么做的:
- 首先在服务调用方配置sentinel,引入sentinel的依赖,配置sentinel的地址
 - 在服务调用方配置开启feign使用sentinel。
 - 在服务调用方编写feign接口并编写降级逻辑。
 - 通过Sentinel控制台配置熔断策略,比如:异常比例、慢请求比例。
 
Sentinel实现熔断、限流的底层原理是什么?
Sentinel提供多种流量 控制算法 ,包括:滑动窗口算法、令牌桶算法以及漏桶算法等。
滑动窗口算法:
是一种用于统计单位时间内请求次数的方法,用来实现限流的目的。它将时间划分为多个小的时间窗口,并在每个小窗口内记录请求的数量。当新的请求到来时,系统会检查当前小窗口内的请求数量是否超过了预设的阈值,如果超过则拒绝请求。
令牌桶算法:
核心思想是一个桶中存储了一定数量的令牌,每当有请求到达时,就需要从桶中取出一个令牌。如果没有足够的令牌,则请求被延迟或拒绝。
以固定的速率生成令牌,存入令牌桶中,如果令牌桶满了以后,多余令牌丢弃。
请求进入后,必须先尝试从桶中获取令牌,获取到令牌后才可以被处理
如果令牌桶中没有令牌,则请求等待或丢弃
在使用令牌桶算法时,可能会存在突发流量导致系统过载,所以尽量不要将令牌上限设定到服务能承受的QPS上限。而是预留一定的波动空间,这样我们才能应对突发流量。
漏桶算法:
漏桶算法与令牌桶相似,但在设计上更适合应对并发波动较大的场景,以解决令牌桶中的问题。
就是请求到达后不是直接处理,而是先放入一个队列。而后以固定的速率从队列中取出并处理请求。之所以叫漏桶算法,就是把请求看做水,队列看做是一个漏了的桶。