1.功能特点
- 丰富的应用场景:例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等
- 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500
台以下规模的集群的汇总运行情况。 - 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC
的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。 - 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI
扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
开源生态
Sentinel 分为两个部分:
- 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
- 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。
2.快速接入
控制台效果
3.入门使用
引入pom
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>最新版本</version>
</dependency>
添加配置
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # 这里使用的是nacos注册中心,实际配置以自己项目的注册中心为准
sentinel:
transport:
dashboard: 127.0.0.1:8080 # 上面启动的地址
实际中的应用和配置
专业术语说明:
3.1.阈值类型 QPS 流控模式直接
相关参数和方法说明
Sentinel提供了这样的功能,让我们可以另外定义一个方法来代替被限制或异常服务返回数据,这就是fallback和blockHandler
- fallback:失败调用,若本接口出现未知异常,则调用fallback指定的接口。
- blockHandler:sentinel定义的失败调用或限制调用,若本次访问被限流或服务降级,则调blockHandler指定的接口。
1.测试的service层
/**
* 阈值类型 QPS 流控模式直接
*/
String hello(String limit);
2.service实现层
@SentinelResource(value = "limit",defaultFallback = "defaultFallback",blockHandler = "handlerException",blockHandlerClass = {BlockException.class})
@Override
public String hello(String limit) {
return "阈值类型 QPS 流控模式直接";
}
//自定义简单的 服务限流或者降级回调方法
public String defaultFallback(){
return "太拥挤了 ~ 请稍后重试 ";
}
public String handlerException(){
return "测试超出流量限制的部分是否会进入到blockHandler的方法。";
}
3.controller层
@Autowired
private SentinelService sentinelService;
@GetMapping("/test1")
public String testA(){
return "this is testA -----------";
}
@GetMapping("/test2")
public String testB(){
return "this is testB -----------";
}
@GetMapping("/limit")
public String limit (){
return sentinelService.hello("测试QPS限流");
}
4.依次调用上面的三个测试接口,因为Sentinel服务监控是懒加载的,只有当服务的接口被调用之后,才会被监控中心捕捉到,调用之后,在面板可以看到如下数据
5.对相关服务的接口进行流控配置 ,流控配置如下(当前接口在1s内次数超过3次,直接触发限流操作,进入失败的回调方法)
6.测试,在浏览器获取使用postman快速点击接口http://localhost:8041/limit,当1s内超过三次,进去预先设置的回调方法,返回的参数为
3.2.阈值类型 线程数、流控模式 直接
1.service层
String threadTest(String thread);
2.service测试层
@SentinelResource(value = "thread",defaultFallback = "defaultFallback",blockHandler = "handlerException",blockHandlerClass = {BlockException.class})
@Override
public String threadTest(String thread) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "阈值类型 线程数、流控模式 直接";
}
3.controller层
@GetMapping("/thread")
public String thread(){
return sentinelService.threadTest("线程测试");
}
4.使用Apache jmeter 进行多线程测试
创建5个线程,正常测试. 每个线程结果正常返回, 添加线程限制限流配置
5.设置线程阈值为4个,创建五个线程去调用接口,从返回结果可以看出,前面四个线程返回结果正常,有一个线程返回的是被限制的结果
3.3.阈值类型 QPS、流控模式 关联
1.基于上面的test1和test2接口不变,将这两个接口建立关联关系.
2.模拟场景: 支付接口和订单接口,放支付接口进入阈值的时候,会限制订单接口的产生.缓解服务的压力.具体的流程如下
3.测试接口,单独快速、慢速的测试test1和test2接口,返回结果都是正常
4.使用postman和Jmeter测试两个接口,创建多个线程跑test2的同时使用postman调用test1 ,触发限流,返回异常日志.当test2结束限流之后,test1接口才会正常返回
3.4.流控效果
1.快速失败
直接失败,进入异常处理,或者进入指定的回调,不做其它的额外处理.
2.Warm Up 从开始到最大的阈值,会进入一个缓冲阶段,一开始的阈值是最大阈值的1/3,然后缓慢增大,直到最大的阈值,适用于与突然增大的流量转变成缓慢增大,避免突然出现的大流量造成服务器的宕机。
说明: 比如设置阈值为10,最初的请求最大允许阈值为10/3=3个,当再次出现大量的请求,自动会在5s内将阈值自动从3提升至10个
3.排队等待
设置阈值类型为QPS 单机阈值为2个,流控效果为排队等待。实现的效果为当1s内,当前接口的请求次数超过2个,那么剩下的不会直接进去异常,进入排队,等待前面的接口调用完成之后才会继续调用后面的接口,也可以设置超时时间,如果超过当前时间还没调用完,后面的接口直接会被丢弃进入异常
使用JMeter创建10个线程测试接口,线程间隔时间为0.4s,超时时间设置2000ms,会发现只有一小部分被限流,其它的请求都会缓慢执行.
3.5.熔断降级
-
平均响应时间 (DEGRADE_GRADE_RT):当 1s 内持续进入 N 个请求,对应时刻的平均响应时间(秒级)均超过阈值(count,以 ms 为单位),那么在接下的时间窗口(DegradeRule 中的timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地熔断(抛出 DegradeException)。注意Sentinel 默认统计的 RT 上限是 4900 ms,超出此阈值的都会算作 4900 ms,若需要变更此上限可以通过启动配置项-Dcsp.sentinel.statistic.max.rt=xxx 来配置。
-
异常比例 (DEGRADE_GRADE_EXCEPTION_RATIO):当资源的每秒请求量 >= N(可配置),并且每秒异常总数占通过量的比值超过阈值(DegradeRule 中的 count)之后,资源进入降级状态,即在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
-
异常数 (DEGRADE_GRADE_EXCEPTION_COUNT):当资源近 1 分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的,若 timeWindow 小于 60s,则结束熔断状态后仍可能再进入熔断状态。
RT 平均响应时间
1.如果请求的平均响应数超过阈值(ms),则会进入准降级状态。 2、如果接下来1s内持续进入5个请求,他们的RT都持续超过了这个阈值,那么在接下来的时间窗口(s)内,就会对这个服务进行降级。 3、RT默认最大为4900ms,如果需要更大,可以通过 -Dcsp.sentinel.statistic.max.rt=xxx 进行配置。
异常比例数
每秒的异常总数,占通过量的比值超过配置的值之后,触发熔断降级。 时间窗口和之前一样,属于熔断保护时间。 占的比值数范围为:[0.0,1.0];
异常数
资源 1分钟 内的异常总数超过限定的阈值,触发熔断降级!
设定异常数为3,表示一分钟请求的异常出现了3个及以上,触发熔断降级!
[注意]此处有坑!
由于异常数是按照分钟统计的个数,时间窗口中的设置也必须要大于60s。 不然会出现:结束熔断保护后仍可能继续熔断保护(不会释放!)