SpringCloud Day12---SpringCloud Alibaba Sentinel 服务熔断与限流(二)

简介: SpringCloud Day12---SpringCloud Alibaba Sentinel 服务熔断与限流(二)

15.4.3 流控效果


1.直接->快速失败(默认的流控处理)


直接失败,抛出异常: Blocked by Sentinel (flow limiting)


源码:com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController


2.预热


公式:阈值除以coldFactor(默认值为3),经过预热时长后才会达到阈值


官网:https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6


默认coldFactor为3,即请求 QPS 从 threshold / 3 开始,经预热时长逐渐升至设定的 QPS 阈值。

b95c8f93850a240447141ceccfb66fc7.png


限流 冷启动: https://github.com/alibaba/Sentinel/wiki/%E9%99%90%E6%B5%81—%E5%86%B7%E5%90%AF%E5%8A%A8


源码

com.alibaba.csp.sentinel.slots.block.flow.controller.WarmUpController

0064ced73577513bc4dfcecbb635cc90.png


WarmUp配置

默认 coldFactor(系统初始化的阀值) 为 3,即请求QPS从(threshold / 3) 开始,经多少预热时长才逐渐升至设定的 QPS 阈值。


案例,阀值为10,预热时长设置5秒。

系统初始化的阀值为10 / 3 约等于3,即阀值刚开始为3;然后过了5秒后阀值才慢慢升高恢复到10754b3082cf112ca6d4dceb4f040672fc.png


测试

访问:多次点击http://localhost:8401/testB, 刚开始不行,后续慢慢OK


应用场景

如:秒杀系统在开启的瞬间,会有很多流量上来,很有可能把系统打死,预热方式就是把为了保护系统,可慢慢的把流量放进来,慢慢的把阀值增长到设置的阀值。


3.排队等待


匀速排队,让请求以均匀的速度通过,阀值类型必须设成QPS,否则无效。

设置含义:/testA每秒1次请求,超过的话就排队等待,等待的超时时间为20000毫秒


image.png



  • 官网:

https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6


2361e7d8b69bc4e8c4a5f9e012496a2e.png



  • 源码

com.alibaba.csp.sentinel.slots.block.flow.controller.RateLimiterController

  • 测试

在后台打印日志,可以看到1s请求被执行一次.


4251806b5e3e2feb3e8d210d3eba2193.png




15.5 降级规则


15.5.1 官网


https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7


15.5.2 基本介绍


e66866f120b77def59e3a9611ca2ced2.png


RT(平均响应时间,秒级)

平均响应时间 超出阈值 且 在时间窗口内通过的请求>=5,两个条件同时满足后触发降级

窗口期过后关闭断路器

RT最大4900(更大的需要通过-Dcsp.sentinel.statistic.max.rt=XXXX才能生效)


异常比列(秒级)

QPS >= 5 且异常比例(秒级统计)超过阈值时,触发降级;时间窗口结束后,关闭降级


异常数(分钟级)

异常数(分钟统计)超过阈值时,触发降级;时间窗口结束后,关闭降级


进一步说明

Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。


当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException)。


Sentinel的断路器是没有半开状态的

半开的状态系统自动去检测是否请求有异常,没有异常就关闭断路器恢复使用,有异常则继续打开断路器不可用。具体可以参考Hystrix


15.5.3 降级策略实战


1.RT


  • 是什么?


826d2a0bef29b1352f405a196096b219.png


da7b723c1c46e816f7c6c06f8c141e3e.png


  • 测试


Controller代码添加

@GetMapping("/testD")
public String testD()
{
    //暂停几秒钟线程
    try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }
    log.info("testD 测试RT");
    return "------testD";
}


配置


42165a15c174833ba0c5ffa0994b03c4.png


jmeter压测


9f6e02a72e5fb899cbb02b9814986c70.png


访问testD



94699b3a352840f0f9b59d802372be44.png


结论:


按照上述配置,永远一秒钟打进来10个线程(大于5个了)调用testD,我们希望200毫秒处理完本次任务,

如果超过200毫秒还没处理完,在未来1秒钟的时间窗口内,断路器打开(保险丝跳闸)微服务不可用,保险丝跳闸断电了. 后续我停止jmeter,没有这么大的访问量了,断路器关闭(保险丝恢复),微服务恢复OK


2.异常比例


是什么

38517b42e41ca289c20008d46d8f1b18.png



0d2dc26ecf1bd1b9d547dd7fb57e7d16.png


  • 测试


代码修改:

@GetMapping("/testD")
public String testD()
{
    log.info("testD 测试RT");
    int age = 10/0;
    return "------testD";
}

配置


10deead466f1c27c7d2a4e859689c52b.png

jmeter



image.png

结论:


按照上述配置,单独访问一次,必然来一次报错一次(int age = 10/0),调一次错一次;


开启jmeter后,直接高并发发送请求,多次调用达到我们的配置条件了。断路器开启(保险丝跳闸),微服务不可用了,不再报错error而是进行服务降级了。


3.异常数


是什么


c1b04a5d0ec84990d728fa421c9e49f4.png

时间窗口一定要大于等于60秒。


bb049798d6077aa37f9bdc83e5c28c32.png


  • 测试


代码:

@GetMapping("/testE")
public String testE()
{
    log.info("testE 测试异常比例");
    int age = 10/0;
    return "------testE 测试异常比例";
}

配置:



e12dbf416213fd8fac7816a0a8bd21a1.png


结论:


访问: http://localhost:8401/testE,第一次访问绝对报错,因为除数不能为零,

我们看到error窗口,但是达到5次报错后,进入熔断后降级。


15.6 热点key限流

15.6.1 基本介绍


何为热点


热点即经常访问的数据,很多时候我们希望统计或者限制某个热点数据中访问频次最高的TopN数据,并对其访问进行限流或者其它操作


cac91c37b295caf5693d1348a93397b7.jpg


15.6.2 官网


https://github.com/alibaba/Sentinel/wiki/%E7%83%AD%E7%82%B9%E5%8F%82%E6%95%B0%E9%99%90%E6%B5%81


15.6.3 承上启下复习start


兜底方法分为系统默认和客户自定义两种


之前的case,限流出问题后,都是用sentinel系统默认的提示:Blocked by Sentinel (flow limiting)


我们能不能自定?类似hystrix,某个方法出问题了,就找对应的兜底降级方法?


结论: 从HystrixCommand 到@SentinelResource


15.6.4 修改Controller

@GetMapping("/testHotKey")
@SentinelResource(value = "testHotKey",blockHandler = "dealHandler_testHotKey")
public String testHotKey(@RequestParam(value = "p1",required = false) String p1, 
                         @RequestParam(value = "p2",required = false) String p2){
    return "------testHotKey";
}
public String dealHandler_testHotKey(String p1,String p2,BlockException exception)
{
    return "-----dealHandler_testHotKey";
}

sentinel系统默认的提示:Blocked by Sentinel (flow limiting).

底层源码:com.alibaba.csp.sentinel.slots.block.BlockException


15.6.5 配置


b99fa453b402fdbbffef26e1c21e47a6.png


限流模式只支持QPS模式,固定写死了。(这才叫热点)

@SentinelResource注解的方法参数索引,0代表第一个参数,1代表第二个参数,以此类推

单机阀值以及统计窗口时长表示在此窗口时间超过阀值就限流。

上面的抓图就是第一个参数有值的话,1秒的QPS为1,超过就限流,限流后调用dealHandler_testHotKey支持方法。


使用blockHandler前后对比:


@SentinelResource(value = “testHotKey”): 异常打到了前台用户界面看到,不友好

@SentinelResource(value = “testHotKey”,blockHandler = “dealHandler_testHotKey”),方法testHotKey里面第一个参数只要QPS超过每秒1次,马上降级处理.而且用了我们自己定义的,更加灵活.


15.6.6 测试


以下访问都是不停的进行访问


访问http://localhost:8401/testHotKey?p1=abc ===> error ×


访问http://localhost:8401/testHotKey?p1=abc&p2=33 ===> error ×


访问 http://localhost:8401/testHotKey?p2=abc ===> right √


结论:第一个参数p1,当QPS超过1秒1次点击后马上被限流.


15.6.7 参数例外项


1.上述案例演示了第一个参数p1,当QPS超过1秒1次点击后马上被限流


2.特例情况

普通 超过1秒钟一个后,达到阈值1后马上被限流

我们期望p1参数当它是某个特殊值时,它的限流值和平时不一样

假如当p1的值等于5时,它的阈值可以达到200

3.配置

07b7b88ab41ecc5dfd7774171514aa0b.png

点击添加按钮



9e40fa3ac58e9e3f15781d1388f2fabc.png

4.测试


访问:http://localhost:8401/testHotKey?p1=5 ,无论方式是否超过1s一次,系统都未报错


访问:http://localhost:8401/testHotKey?p1=3 ,当方式超过1s一次,进行报错…


原因:当p1等于5的时候,阈值变为200.当p1不等于5的时候,阈值就是平常的1


5.前提条件


热点参数的注意点,参数必须是基本类型或者String


15.6.8 其他—添加异常看看(后面详细介绍)


@SentinelResource

处理的是Sentinel控制台配置的违规情况,有blockHandler方法配置的兜底处理;


RuntimeException

int age = 10/0,这个是java运行时报出的运行时异常RunTimeException,@SentinelResource不管


总结

@SentinelResource主管配置出错,运行出错该走异常走异常


15.7 系统规则


因为全局配置是对系统所有的请求生效的,所以本章使用的场景较少.


58d3a393d8115359e4c4cc7dcf3d43cd.png


15.7.1 是什么


https://github.com/alibaba/Sentinel/wiki/%E7%B3%BB%E7%BB%9F%E8%87%AA%E9%80%82%E5%BA%94%E9%99%90%E6%B5%81


Sentinel 系统自适应限流从整体维度对应用入口流量进行控制,结合应用的 Load、CPU 使用率、总体平均 RT、入口 QPS 和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。

e4a07239936c9f990332c42c7009a3a7.png

15.7.2 各项配置参数说明

2a3eb2e1791193438754b17bbdb3abac.png


15.7.3 配置全局QPS


…略


15.8 @SentinelResource


15.8.1 按资源名称限流+后续处理


1.修改Module—cloudalibaba-sentinel-service8401

  • POM


<dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
    <groupId>com.rg.springcloud</groupId>
    <artifactId>cloud-api-commons</artifactId>
    <version>${project.version}</version>
</dependency>


业务类RateLimitController

@RestController
public class RateLimitController
{ 
  @GetMapping("/byResource")
    @SentinelResource(value = "byResource",blockHandler = "handleException")
    public CommonResult byResource(){
        return new CommonResult(200, "按资源名称限流测试OK", new Payment(2020L, "serial001"));
    }
    public CommonResult handleException(BlockException exception){
        return new CommonResult(444, exception.getClass().getCanonicalName() + "\t服务不可用");
    }


2.配置流控规则

  • 配置步骤

187868b157dd49272833a5d1aedaa698.png

  • 图形配置和代码关系


83e65945b4a2cbf8b7fe8547c2d1f7f5.png


表示1秒钟内查询次数大于1,就跑到我们自定义的方法,进行限流

3.测试


1秒钟点击1下,OK

超过上述,疯狂点击,返回了自己定义的限流处理信息,限流发生

4e1420980cc59906039bcc6b89ca543f.png


4.额外问题


此时关闭问服务8401看看,Sentinel控制台,流控规则消失了===> 说明 在sentinel上的配置是临时的

相关文章
|
4月前
|
Java UED Sentinel
微服务守护神:Spring Cloud Sentinel,让你的系统在流量洪峰中稳如磐石!
【8月更文挑战第29天】Spring Cloud Sentinel结合了阿里巴巴Sentinel的流控、降级、熔断和热点规则等特性,为微服务架构下的应用提供了一套完整的流量控制解决方案。它能够有效应对突发流量,保护服务稳定性,避免雪崩效应,确保系统在高并发下健康运行。通过简单的配置和注解即可实现高效流量控制,适用于高并发场景、依赖服务不稳定及资源保护等多种情况,显著提升系统健壮性和用户体验。
90 1
|
6月前
|
监控 Java Sentinel
使用Sentinel进行服务调用的熔断和限流管理(SpringCloud2023实战)
Sentinel是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
164 3
|
3月前
|
监控 Java API
谷粒商城笔记+踩坑(25)——整合Sentinel实现流控和熔断降级
先简单介绍熔断、降级等核心概念,然后阐述SpringBoot整合Sentinel的实现方式,最后介绍Sentinel在本项目中的应用。
谷粒商城笔记+踩坑(25)——整合Sentinel实现流控和熔断降级
|
4月前
|
算法 NoSQL Java
spring cloud的限流算法有哪些?
【8月更文挑战第18天】spring cloud的限流算法有哪些?
93 3
|
5月前
|
监控 Dubbo 应用服务中间件
通用快照方案问题之Sentinel与SpringCloud和Dubbo的整合如何解决
通用快照方案问题之Sentinel与SpringCloud和Dubbo的整合如何解决
50 0
|
6月前
|
监控 Java API
深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南
深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南
142 0
深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南
|
6月前
|
自然语言处理 监控 开发者
springCloud之Sentinel流量路由、流量控制、流量整形、熔断降级
springCloud之Sentinel流量路由、流量控制、流量整形、熔断降级
132 0
|
3月前
|
SpringCloudAlibaba API 开发者
新版-SpringCloud+SpringCloud Alibaba
新版-SpringCloud+SpringCloud Alibaba
|
4天前
|
Java Nacos Sentinel
Spring Cloud Alibaba:一站式微服务解决方案
Spring Cloud Alibaba(简称SCA) 是一个基于 Spring Cloud 构建的开源微服务框架,专为解决分布式系统中的服务治理、配置管理、服务发现、消息总线等问题而设计。
81 12
Spring Cloud Alibaba:一站式微服务解决方案
|
4月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
135 1