微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩
解决雪崩问题的常见方式有四种:
1.超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待

2.舱壁模式:限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离。

3.熔断降级:由断路器统计业务执行的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的一切请求。

4.流量控制:限制业务访问的QPS,避免服务因流量的突增而故障。

总结:
什么是雪崩问题?
如何避免因瞬间高并发流量而导致服务故障?
如何避免因服务故障引起的雪崩问题?

Sentinel是阿里巴巴开源的一款微服务流量控制组件。官网地址:
https://sentinelguard.io/zh-cn/index.html
https://sentinelguard.io/zh-cn/index.html
1.sentinel官方提供了UI控制台,方便我们对系统做限流设置。大家可以在GitHub下载。
2.下载好使用如下语句启动:
![]()
3.然后访问:localhost:8080 即可看到控制台页面,默认的账户和密码都是sentinel

4.如果要修改Sentinel的默认端口、账户、密码,可以通过下列配置:

5.举例说明修改端口号:


6.修改完成后可以访问8090登录sentinel

7. 登录后发现里面什么内容也没有

是因为我们在微服务工程里面还没有和sentinel进行配置
我们在SpringCloud项目中整合Sentinel,并且连接Sentinel的控制台,步骤如下
1.导入依赖Sentinel依赖
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
- dependency>
2.配置控制台

3.访问微服务的任意端点,触发sentinel监控


雪崩问题虽然有四种方案,但是限流是避免服务因突发的流量而发生故障,是对微服务雪崩问题的预防。我们先学习这种模式
簇点链路:就是项目内的调用链路,链路中被监控的每个接口就是一个资源。默认情况下sentinel会监控SpringMVC的每一个端点(Endpoint),因此SpringMVC的每一个端点(Endpoint)就是调用链路中的一个资源

流控、熔断等都是针对簇点链路中的资源来设置的,因此我们可以点击对应资源后面的按钮来设置规则:
点击资源/order/buy/{pid}/{num}后面的流控按钮,就可以弹出表单。表单中可以添加流控规则,如下图所示:

其含义是限制 /order/buy/{pid}/{num}这个资源的单机QPS为5,即每秒只允许5次请求,超出的请求会被拦截并报错
需求:给/order/buy/{pid}/{num}这个资源设置流控规则,QPS不能超过 5,然后测试。
1)首先在sentinel控制台添加限流规则

2)利用jmeter测试

20个用户,2秒内运行完,QPS是10,超过了5.
选中流控入门,QPS<5右键运行:
在这里插入图片描述
注意,不要点击菜单中的执行按钮来运行。
结果

可以看到,成功的请求每次只有5个
在添加限流规则时,点击高级选项,可以选择三种流控模式
• 直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式• 关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流• 链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流
当/write资源访问量触发阈值时,就会对/read资源限流,避免影响/write资源。
练习
需求:
1)定义
端点,模拟订单查询
重启服务,查看sentinel控制台的簇点链路:
配置流控规则
2.对哪个端点限流,就点击哪个端点后面的按钮。我们是对订单查询/product/queryProduct限流,因此点击它后面的按钮:
3.在Jmeter测试
选择《流控模式-关联》:

可以看到1000个用户,100秒,因此QPS为10,超过了我们设定的阈值:5
查看http请求:

显示该服务被限流了,说明我们的设置成功了
总结:
满足下面条件可以使用关联模式:
u 两个有竞争关系的资源u 一个优先级较高,一个优先级较低
链路模式:只针对从指定链路访问到本资源的请求做统计,判断是否超过阈值。
例如有两条请求链路:
如果只希望统计从/test2进入到/common的请求,则可以这样配置:

这样设置的效果为对test2进行限流,对test1不进行限流
练习
需求:有查询订单和创建订单业务,两者都需要查询商品。针对从查询订单进入到查询商品的请求统计,并设置限流。
Sentinel默认只标记Controller中的方法为资源,如果要标记其它方法,需要利用@SentinelResource注解,示例

1). 添加查询商品方法

2)查询订单时,查询订单

3)保存订单时,查询订单

4.添加流控规则



5.测试

可以看到这里200个用户,50秒内发完,QPS为4,超过了我们设定的阈值2
6.访问 saveOrder

发现没有被限流
7.访问queryOrder

发现被限流了每次只有2个通过
流控模式有哪些?
• 直接:对当前资源限流• 关联:高优先级资源触发阈值,对低优先级资源限流。• 链路:阈值统计时,只统计从指定资源进入当前资源的请求,是对请求来源的限流
在流控的高级选项中,还有一个流控效果选项:

流控效果是指请求达到流控阈值时应该采取的措施,包括三种:
warm up也叫预热模式,是应对服务冷启动的一种方案。请求阈值初始值是 threshold / coldFactor,持续指定时长后,逐渐提高到threshold值。而coldFactor的默认值是3.
例如,我设置QPS的threshold为10,预热时间为5秒,那么初始阈值就是 10 / 3 ,也就是3,然后在5秒后逐渐增长到10.

练习
需求:给/order/{orderId}这个资源设置限流,最大QPS为10,利用warm up效果,预热时长为5秒
1)添加根据id查询的方法

2)配置流控规则


3)测试



随着时间推移,成功比例越来越高:
6到Sentinel控制台查看实时监控

发现刚开始时有拒绝QPS,随着时间后拒绝QPS情况没有发生
当请求超过QPS阈值时,快速失败和warm up 会拒绝新的请求并抛出异常。而排队等待则是让所有请求进入一个队列中,然后按照阈值允许的时间间隔依次执行。后来的请求必须等待前面执行完成,如果请求预期的等待时间超出最大时长,则会被拒绝。
例如:QPS = 5,意味着每200ms处理一个队列中的请求;timeout = 2000,意味着预期等待超过2000ms的请求会被拒绝并抛出异常

练习
需求:给/order/{orderId}这个资源设置限流,最大QPS为10,利用排队的流控效果,超时时长设置为5s
1)添加流控规则

2)Jmeter测试
选择《流控效果,队列》

3)查看
这里因为单机阈值设置的为5而且等待时间为2秒,所以等待区最多可以有10,在这里因为线程数为33时间为3秒,所以抛出的错误为线程数减去等待区的值再减去时间乘以阈值得出错误为8处

流控效果有哪些?
• 快速失败: QPS 超过阈值时,拒绝新的请求• warm up : QPS 超过阈值时,拒绝新的请求; QPS 阈值是逐渐提升的,可以避免冷启动时高并发导致服务宕机。• 排队等待:请求会进入队列,按照阈值允许的时间间隔依次执行请求;如果请求预期等待时长大于超时时间,直接拒绝