1.什么是雪崩问题?

  • 微服务之间相互调用,因为调用链中的一个服务故障,引起整个链路都无法访问的情况。

2.雪崩解决方案?

2.1限流

**流量控制**是对服务的保护,限制业务访问的QPS,避免因瞬间高并发流量而导致服务故障,进而避免雪崩。是一种预防措施。
image-20210715173555158.png

2.2限流模式

2.2.1直接 : /order/(orderId) 5 QPS 每秒中超过5个请求后,全部限流

image-20210715201827886.png

2.2.2关联 : /order/query 低

  1. /order/update 优先级高<br /> query 创建限流 10QPS<br /> update update资源每秒钟达到10个请求时,对query资源限流<br />![image-20210716102103814.png](https://cdn.nlark.com/yuque/0/2022/png/26104196/1645614980682-bf194702-66c6-46f1-8f3d-a58ae68d4b89.png#clientId=u902a7467-1a7c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=487&id=u0c5ebb6e&margin=%5Bobject%20Object%5D&name=image-20210716102103814.png&originHeight=730&originWidth=921&originalType=binary&ratio=1&rotation=0&showTitle=false&size=114286&status=done&style=none&taskId=u9ad1de3c-3c09-4a20-9a3f-d386d4adb31&title=&width=614)<br />![image-20210716103143002.png](https://cdn.nlark.com/yuque/0/2022/png/26104196/1645615008838-8d4e64f6-aa5d-41af-b889-c74309ef2133.png#clientId=u902a7467-1a7c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=154&id=u7068e33d&margin=%5Bobject%20Object%5D&name=image-20210716103143002.png&originHeight=231&originWidth=1183&originalType=binary&ratio=1&rotation=0&showTitle=false&size=23275&status=done&style=none&taskId=u468c670f-ea00-4cc8-977f-0eca50bdc28&title=&width=788.6666666666666)

2.2.3链路 : /queryOrder goods 对查询商品进行限流 5QPS

                                                设置入口路径queryOrder<br />![image-20210716105408723.png](https://cdn.nlark.com/yuque/0/2022/png/26104196/1645615041190-3dc58f55-a532-400a-bfce-34bcbb1a2fb3.png#clientId=u902a7467-1a7c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=442&id=u7962ce93&margin=%5Bobject%20Object%5D&name=image-20210716105408723.png&originHeight=663&originWidth=826&originalType=binary&ratio=1&rotation=0&showTitle=false&size=98586&status=done&style=none&taskId=u7a102638-2bc9-4d53-a3dc-32bf011e4f9&title=&width=550.6666666666666)

2.2.4总结

流控模式有哪些?

•直接:对当前资源限流

•关联:高优先级资源触发阈值,对低优先级资源限流。

•链路:阈值统计时,只统计从指定资源进入当前资源的请求,是对请求来源的限流

2.2.5流控效果

在流控的高级选项中,还有一个流控效果选项:
image-20210716110225104.png
流控效果是指请求达到流控阈值时应该采取的措施,包括三种:

  • 快速失败:达到阈值后,新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。

  • warm up:预热模式,对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值。

  • 排队等待:让所有的请求按照先后次序排队执行,两个请求的间隔不能小于指定时长

2.3热点参数限流

之前的限流是统计访问某个资源的所有请求,判断是否超过QPS阈值。而热点参数限流是分别统计参数值相同的请求,判断是否超过QPS阈值。
配置示例:
image-20210716120536714.png
代表的含义是:对hot这个资源的0号参数(第一个参数)做统计,每1秒相同参数值的请求数不能超过5

3.隔离和降级

Sentinel支持的雪崩解决方案:

  • 线程隔离(仓壁模式)
  • 降级熔断

线程隔离之前讲到过:调用者在调用服务提供者时,给每个调用的请求分配独立线程池,出现故障时,最多消耗这个线程池内资源,避免把调用者的所有资源耗尽。
熔断降级:是在调用方这边加入断路器,统计对服务提供者的调用,如果调用的失败比例过高,则熔断该业务,不允许访问该服务的提供者了。

声明服务降级方法:
配置文件上:
feign.sentinel.enable = true

服务降级类 实现 FallbackFactory接口
create(异常) ==> 代表远程调用时出现了什么异常
{
new Feign接口实现类(){
服务降级的方法(){
//TODO 服务降级方法
}
}
}

3.1线程隔离(舱壁模式)

线程隔离有两种方式实现:

  • 线程池隔离
  • 信号量隔离(Sentinel默认采用)

线程池隔离:给每个服务调用业务分配一个线程池,利用线程池本身实现隔离效果
信号量隔离:不创建线程池,而是计数器模式,记录业务使用的线程数量,达到信号量上限时,禁止新的请求。
image-20210716123240518.png

3.2熔断降级

熔断降级是解决雪崩问题的重要手段。其思路是由断路器统计服务调用的异常比例、慢请求比例,如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求。
image-20210716130958518.png


4.授权规则

授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式。

  • 白名单:来源(origin)在白名单内的调用者允许访问
  • 黑名单:来源(origin)在黑名单内的调用者不允许访问