场景
微服务会划分出多个模块,模块之间的调用频率可能比较高,这时可能会存在服务雪崩(一个服务失败,导致整条链路的服务都失败的情形)的,如图:
随着时间的推移,从刚开始的C不可用变成了最终的系统不可用,此时,我们应该寻找容错的办法来避免雪崩效应。
容错的措施
1.设置超时:设置访问超时时间,超时后返回错误
2.限流:限制访问的流量
3.舱壁模式:设置多个线程池来分散流量
4.断路器模式:采用一个中间服务,如果A服务访问某个服务失败一定的次数,中间服务就开启,并停止A继续访问某服务,一段时间后中间服务关闭,A服务再次访问某服务,如此往复。着重解释断路器的三态转换,理解断路器的优势
Sentinel
Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助您保障微服务的稳定性
整合Sentinel
添加依赖(actuator用来便于演示)
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
搭建Sentinel控制台
下载jar包:sentinel-dashboard-1.6.2.jar
运行java -jar sentinel-dashboard-1.6.2.jar
将应用整合到控制台,添加配置
spring:cloud:sentinel:transport:dashboard: localhost:8080
和Ribbon一样Sentinel也是懒加载
我们访问应用中Controller中一个方法
流控规则
访问方法之后,我们在簇点链路中可以为刚才访问的方法添加流控规则
QPS:访问次数
线程数:调用这个api的线程数
假设勾选了QPS,单机阈值是1
直接:当访问超过1,就进行限流
关联:当设定的方法达到阈值,就限流自己,适用于如果一个读方法,一个写方法,我们可以控制优先读还是优先写。
链路:只记录指定链路上的流量,适用于指定某个方法进行限流,比较细粒度。
Warm Up:可以让允许通过的流量缓慢增加,可以设置预热时长,即经过某个时长后,达到阈值,比较适用于秒杀等大访问量突增
排队等待:只适用于QPS,设置时长后,将请求排队等待,适用于流量突然增加,让流量均匀的增加。
降级规则
RT:秒级,默认4900ms,简单理解就是平均响应时间超出阈值并且在时间窗口内的请求大于设定的值次数触发降级,直到时间窗口设定的值结束,即
异常比例:秒级,QPS大于阈值,触发降级
异常数:分钟级,异常数超过阈值,触发降级
热点规则
在统计窗口统计时间内,某个参数索引的位置访问,超过阈值,就会被限流。可以对请求方法的参数进行限制,适用于某些参数访问非常高,同时希望提升api可用性的场景。
参数索引所使用的类型只能是基本类型
总结
本文介绍了引用Sentinel的引入和基本规则的配置,后续将介绍系统规则和授权规则,还有整合Feign客户端,持久化规则(推拉模式)以及部分源码解读。
后续会持续更新,可以关注公众号: 阿清的日常
后台留言,会细致解答。