Sentinel服务调控---Sentinel常用规则介绍与测试

本文介绍了Sentinel的界面、流控规则、熔断规则和热点规则。Sentinel用于服务的流量控制,通过QPS或并发线程数阈值实现限流,并提供慢调用比例、异常比例和异常数熔断策略。同时,Sentinel还支持参数级别的热点规则限制。文中通过实际测试展示了各项规则的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Sentinel界面介绍

在这里插入图片描述
       Sentinel界面主要分为功能区以及展示区,左边的主要是每个服务相对应的服务调控规则,如:流控,熔断,热点,系统规则等,而右边则是展示区,主要展示相对应功能的观察以及操作页面。

实时监控: 主要是监控一些资源的实时状态,如:接口的响应时间,接口访问的成功以及一个线形展示界面,这个界面主要是展示某个时间段的资源访问情况

簇点链路: 主要是展示指定客户端资源的运行情况,分为树状以及列表俩种模式。

流控规则: 主要是监控应用流量的 QPS 或并发线程数等指标,并设置相关的阈值

熔断规则: 与Hystrix的熔断基本一样,用来预防服务调用超时等错误从而导致服务崩溃等情况

热点规则: 可以使规则设置详细到参数,用来设置参数规则的

系统规则: 主要用来监控系统的资源使用情况,大部分作用于Linux系统

授权规则: 主要是针对Sentinel系统登录用户的权限使用情况

2. 流控规则

2.1 界面介绍

       Sentinel流控规则主要是针对每个资源的访问次数,时间等信息来进行调整与控制,其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
在这里插入图片描述
资源名: 唯一的名称,默认是路径名,就是说这个规则是加到哪个接口或者方法的

针对来源: Sentinel可以针对服务调用者来进行限流,可以填相关的微服务名,默认是default(不区分来源)

阈值类型/单机阈值:

  • QPS:每分钟的请求数量,当这个资源的每分钟请求数量达到阈值时,进行限流

  • 并发线程数:当调用该api的线程数达到阈值时,进行限流,线程数只有流控模式,并没有流控效果,线程数与QPS类似,但他们是不同的

  • 不同点:QPS与线程数的区别在于,QPS模式是接收了所有的请求,但只执行一个,而线程数则是只接收一个请求,其他请求不接受。

流控模式:

  • 直接:api达到限流阈值时,直接限流
  • 关联:当关联的资源达到阈值时,就将自己限流。比如:A接口关联了B接口,当B达到阈值时,就降A限流
  • 链路:只记录指定链路上的链路的流量当达到阈值时限流

流控效果:

  • 快速失败:直接失败,抛出异常,返回相关的提示信息
  • Warm up:预热模式,根据codeFactor的值,默认是3,从阈值/codeFactor开始,经过预热时长,才达到设置的QPS阈值
  • 排队等待:严格控制请求通过的时间,让请求可以以均匀的速度通过,对应的是漏桶算法

2.2 效果测试

前提: 搭建好测试项目,可参考:https://blog.csdn.net/I_am_fine_/article/details/124564895

2.2.1 测试QPS-直接-快速失败

设置流控规则: 阈值设为1,表示该接口一秒钟只能触发一次,超过则直接限流

测试结果: 以刷新的方式来模拟调用
在这里插入图片描述

2.2.2 测试QPS-直接-WarmUP

设置流控规则: 预热模式的话主要是,比如我们设置阈值为10,预热时长为5,那么系统初始化的阈值为10/3(取整),当经过5秒后阈值才提升为10
在这里插入图片描述
测试: 一直刷新页面,一开始一秒超过了3次,他会限流,然后一直点,5秒后则正常了,除非一秒的刷新次数超过10次
在这里插入图片描述
在这里插入图片描述

3. 熔断规则

        Sentinel的熔断降级跟Hystrix断路器熔断降级类似,都是在我们调用服务时,避免服务链路出错导致请求发送堆积从而影响整个服务宕机,从而使用熔断降级的方法来响应请求。

        Sentinel熔断降级会在调用链路中某个资源出现不稳定状态(比如:调用超时,服务内部异常数过多等等),对这个资源的调用进行限制,让他快速失败,避免影响到其他资源从而导致服务宕机。简单点来说就是:当我们在服务之间相互调用时,一个服务多次出现了读取超时或错误时,我们就熔断这个服务或这个服务中的某一个方法,让他快速失败,等熔断时间过去了,才让他恢复正常。

        Sentinel对比Hystrix的熔断规则来说的话,大体上是类似的,但Sentinel在配置熔断规则时会更加的方便简单,而且Sentinel提供的熔断规则方式比Hystrix更加丰富。

注意: 在Sentinel1.8之前,sentinel的熔断是没有半开状态的,在1.8之后,引入了半开状态(请求探测恢复状态)。

3.1 界面介绍

在这里插入图片描述

  • 资源名 resource:唯一名称,默认请求路径;

  • 熔断策略 grade

    • 慢调用比例: 请求的响应时间大于 RT 统计为慢调用。当单位统计时长内,请求数目大于设置的最小请求数,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态,若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断;
    • 异常比例 : 当单位统计时长内,请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%;
    • 异常数 : 当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态,若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断;
  • 最大 RT、比例阈值 count: 慢调用比例模式下为慢调用临界 RT(最大响应时间);异常比例和异常数模式下为对应的阈值;

  • 慢调用比例阈值: 仅慢调用比例模式有效(1.8.0 引入),范围是0到1,可以理解为百分数,即100%以内;

  • 熔断时长: 单位为 s,当过了熔断时长后,sentinel进入探测恢复状态(类似于Hystrix里的半开状态);

  • 最小请求数: 请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入);

  • 统计时长:如 60*1000 代表分钟级(1.8.0 引入),就是每多少分钟,毫秒统计一次,判断是否熔断;

3.2 效果测试

3.2.1 慢调用比例测试

在这里插入图片描述
规则简述: 在1000毫秒内,当请求数大于5,接口响应时间大于300ms,慢调用比例达到10%时(就是说全部请求(10个)中,有1个请求的响应时间超过300毫秒),接下来的10秒内自动开启熔断,,10秒后开始进入探测恢复状态。(以上条件都要满足,缺一个服务都不会熔断)

测试方案: 使用Jmete模拟1秒内发送10次请求,让服务进入熔断,10秒后再访问看看服务有没有恢复。

1.修改测试接口,模拟一个请求需要5秒的时间(线程休眠)

@GetMapping("/test")
public String test(){
    try {
        TimeUnit.SECONDS.sleep(5);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return info;
}

2.Jemete模拟压力测试
在这里插入图片描述
3.浏览器测试是否熔断
在这里插入图片描述

4.等待10秒后访问服务是否恢复正常
在这里插入图片描述

3.2.2 异常比例测试

在这里插入图片描述

规则简述: 在1000毫秒内(即1秒),当请求数超过5个,并且请求出现异常的比例超过10%(比如:10个请求内出现一个异常)时,接下来的10秒内自动开启熔断,,10秒后开始进入探测恢复状态。(以上条件都要满足,缺一个服务都不会熔断)

测试方案: 设定程序出现异常,并使用jmete模拟1秒内发送10个请求,使服务进入熔断,10秒后再访问看看服务有没有恢复。

1.设置程序,使程序出现异常

//这个程序本身会出现错误,因为分母不能为0
@GetMapping("/test")
public String test(){
    int a = 1/0;
    return info;
}

2.Jemete模拟压力测试
在这里插入图片描述

3.浏览器测试是否熔断
在这里插入图片描述

4.等待10秒后访问服务是否恢复正常
在这里插入图片描述

3.2.3 异常数测试

在这里插入图片描述

规则简述: 在1000毫秒内,当请求数超过2,并且异常数超过2(就是请求2次,2次都有异常),接下来的10秒内自动开启熔断,,10秒后开始进入探测恢复状态。

测试方案: 设定程序出现异常,连续访问2次请求,使服务进入熔断,10秒后测试服务熔断是否结束。

1.设置程序,使程序出现异常

//这个程序本身会出现错误,因为分母不能为0
@GetMapping("/test")
public String test(){
    int a = 1/0;
    return info;
}

2.浏览器测试是否熔断:连续访问,即1秒内超过3次即可
在这里插入图片描述

3.10秒后访问服务是否恢复正常
在这里插入图片描述

4. 热点规则

4.1 界面介绍

       热点规则主要是针对请求中带有参数的接口,可以看成一种特殊的流量控制规则,仅对带有参数的请求有效。它主要是利用LRU策略统计经常访问的参数,然后利用漏桶算法来进行参数级别的流控。简单点来说就是针对某一个参数来进行流控,限制那个参数的访问效率。
在这里插入图片描述

  • 限流模式:限流模式只支持 QPS 模式;
  • 参数索引:必填,对应 SphU.entry(xxx, args) 中的参数索引位置;
  • 单机阈值:限流阈值,必填,就是;
  • 统计窗口时长:单位为秒,1.6.0 版本开始支持;
  • 是否集群:是否是集群参数流控规则,热点规则提供集群方式;
  • 参数类型: 声明参数类型,为8种基本类似,如:String,int等等
  • 参数值: 对参数的值进行限流
  • 限流阈值: 每秒访问多少次

4.2 效果测试

在这里插入图片描述
规则简述: 对请求中的第一个参数进行限流,当1秒中该请求(带有第一个参数)访问次数超过1时,服务出错,但当第1个参数的值为5的时候,他的阈值就变为1秒中不要超过5次即可。

测试方案: 在请求中设置相对应的参数,首先不指定参数值为5,1秒钟请求次数超过1,测试服务是否出错,然后再把参数定位5来测试。

1.修改测试接口

@GetMapping("/test")
@SentinelResource(value = "test")
public String test(@RequestParam(value = "id") String id){
    return id+":"+info;
}

2.在浏览器中访问
在这里插入图片描述
在这里插入图片描述

3.测试值为5时
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值