微服务保护Sentinel监控

解决雪崩的常见方式有四种:

1.超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待,缓解雪崩问题

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

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

4.流量控制(预防雪崩):限制业务访问的QPS(业务每秒的请求数),避免服务因流量的突增而故障。

什么是雪崩问题

微服务之间相互调用,因为调用链中的一个服务故障,引起整个链路都无法访问的情况。
sentinel 官网地址
启动sentinel

java -jar sentinel-dashboard-1.8.1.jar

一.在微服务中整合Sentinel

1.引入sentinel依赖:

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>

2.配置控制台地址

spring:
    sentinel:
      transport:
        dashboard: localhost:8080 # sentinel控制台地址

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

二.限流规则

1.快速入门

流控模式
在添加限流规则时,点击高级选项,可以选择三种流控模式:

1.直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式
2.关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流
3.链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流

2.流量控制模式-关联

关联模式:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流
使用场景:比如用户支付时需要修改订单状态,同时用户要查询订单。查询和修改操作会争抢数据库锁,产生竞争。业务需求是有限支付和更新订单的业务,因此当修改订单业务触发阈值时,需要对查询订单业务限流。

3.流量控制模式-链路

链路模式:只针对从指定链路访问到本资源的请求做统计,判断是否超过阈值。

需求:有查询订单和创建订单业务,两者都需要查询商品。针对从查询订单进入到查询商品的请求统计,并设置限流。
步骤:
1.在OrderService中添加一个queryGoods方法,不用实现业务
2.在OrderController中,改造/order/query端点,调用OrderService中的queryGoods方法
3.在OrderController中添加一个/order/save的端点,调用OrderService的queryGoods方法
4.给queryGoods设置限流规则,从/order/query进入queryGoods的方法限制QPS必须小于2

注意:
Sentinel默认只标记Controller中的方法为资源,如果要标记其它方法,需要利用@SentinelResource注解

 @SentinelResource("goods")
    public void queryGoods(){
        System.err.println("查询商品");
    }

Sentinel默认会将Controller方法做context整合,导致链路模式的流控失效,需要修改application.yml,添加配置:web-context-unify: false

spring:
    sentinel:
      transport:
        dashboard: localhost:8080 # sentinel控制台地址
      web-context-unify: false # 关闭context整合

4.流控效果

流控效果是指请求达到流控阈值时应该采取的措施,包括三种:

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

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

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

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

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

总结:

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

5.热点参数限流 (注意:热点参数限流对默认的SpringMVC资源无效)

之前的限流是统计访问某个资源的所有请求,判断是否超过QPS阈值。而热点参数限流是分别统计参数值相同的请求,判断是否超过QPS阈值。
案例:
给/order/{orderId}这个资源添加热点参数限流,规则如下:
默认的热点参数规则是每1秒请求量不超过2
给102这个参数设置例外:每1秒请求量不超过4
给103这个参数设置例外:每1秒请求量不超过10
在这里插入图片描述

资源配置 @SentineLResource(“hot”)
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值