1.什么是雪崩问题?
- 微服务之间相互调用,因为调用链中的一个服务故障,引起整个链路都无法访问的情况。
2.雪崩解决方案?
2.1限流
**流量控制**是对服务的保护,限制业务访问的QPS,避免因瞬间高并发流量而导致服务故障,进而避免雪崩。是一种预防措施。
2.2限流模式
2.2.1直接 : /order/(orderId) 5 QPS 每秒中超过5个请求后,全部限流
2.2.2关联 : /order/query 低
/order/update 优先级高<br /> query 创建限流 10QPS<br /> update 当update资源每秒钟达到10个请求时,对query资源限流<br /><br />
2.2.3链路 : /queryOrder goods 对查询商品进行限流 5QPS
设置入口路径queryOrder<br />
2.2.4总结
流控模式有哪些?
•直接:对当前资源限流
•关联:高优先级资源触发阈值,对低优先级资源限流。
•链路:阈值统计时,只统计从指定资源进入当前资源的请求,是对请求来源的限流
2.2.5流控效果
在流控的高级选项中,还有一个流控效果选项:
流控效果是指请求达到流控阈值时应该采取的措施,包括三种:
快速失败:达到阈值后,新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。
warm up:预热模式,对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值。
排队等待:让所有的请求按照先后次序排队执行,两个请求的间隔不能小于指定时长
2.3热点参数限流
之前的限流是统计访问某个资源的所有请求,判断是否超过QPS阈值。而热点参数限流是分别统计参数值相同的请求,判断是否超过QPS阈值。
配置示例:
代表的含义是:对hot这个资源的0号参数(第一个参数)做统计,每1秒相同参数值的请求数不能超过5
3.隔离和降级
Sentinel支持的雪崩解决方案:
- 线程隔离(仓壁模式)
- 降级熔断
线程隔离之前讲到过:调用者在调用服务提供者时,给每个调用的请求分配独立线程池,出现故障时,最多消耗这个线程池内资源,避免把调用者的所有资源耗尽。
熔断降级:是在调用方这边加入断路器,统计对服务提供者的调用,如果调用的失败比例过高,则熔断该业务,不允许访问该服务的提供者了。
声明服务降级方法:
配置文件上:
feign.sentinel.enable = true
服务降级类 实现 FallbackFactory接口
create(异常) ==> 代表远程调用时出现了什么异常
{
new Feign接口实现类(){
服务降级的方法(){
//TODO 服务降级方法
}
}
}
3.1线程隔离(舱壁模式)
线程隔离有两种方式实现:
- 线程池隔离
- 信号量隔离(Sentinel默认采用)
线程池隔离:给每个服务调用业务分配一个线程池,利用线程池本身实现隔离效果
信号量隔离:不创建线程池,而是计数器模式,记录业务使用的线程数量,达到信号量上限时,禁止新的请求。
3.2熔断降级
熔断降级是解决雪崩问题的重要手段。其思路是由断路器统计服务调用的异常比例、慢请求比例,如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求。
4.授权规则
授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式。
- 白名单:来源(origin)在白名单内的调用者允许访问
- 黑名单:来源(origin)在黑名单内的调用者不允许访问
