Spring Cloud Alibaba系列之三Sentinel服务熔断及限流
Sentinel:分布式系统的流量防卫兵,具有以下特征:
- 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。 - 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Apache Dubbo、gRPC、Quarkus 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。同时 Sentinel 提供 Java/Go/C++ 等多语言的原生实现。
- 完善的 SPI 扩展机制:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
Sentinel的主要特性有:
PS:以上内容引用自Sentinel官方文档
Sentinel的使用方式也很简单,只需简单的几步就能搭建成功。
一、安装配置
1.1 在SpringBoot工程中引入依赖
<!--非必须,后续做配置持久化用-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!--非必须,后续做服务熔断用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
1.2 添加配置
server:
port: 8401
spring:
application:
name: cloudalibaba-sentinel-service
cloud:
sentinel:
transport:
dashboard: localhost:8080
port: 8719
1.3 启动Sentinel的Dashboard
java -jar sentinel-dashboard-1.8.2.jar
启动成功界面如下:
由于Sentinel时懒加载的,所以在Dashboard启动之后直接访问界面还没有内容,需要访问一次服务接口才可以加载出内容。
访问 http://localhost:8080/#/dashboard/home 地址,账号/密码默认都是sentinel,即可打开监控界面。
二、服务限流
Sentinel提供的限流模式有三种:直接、关联、链路;同时提供了三种流控效果:快速失败、Warm up、排队等待。
- 直接:当接口请求达到限流阈值条件后,直接限流
- 关联:当关联的接口达到限流阈值条件后,限流本接口
- 链路:记录指定链路上的流量,当流量达到阈值条件后,进行限流
- 快速失败:限流后,直接展示sentinel默认异常提示
- warm up:根据coldfactor(冷却因子,默认为3),从阈值/coldFactor开始,经过预热时长,达到设定的QPS阈值
- 排队等待:匀速排队,让请求以匀速通过,只能设置成QPS类型
以直接模式、快速失败效果为例,设定QPS阈值为1,则意味着在1秒中内如果请求接口的数量大于1,则返回失败。
三、服务熔断降级
Sentinel提供了三种服务降级策略:RT(平均响应时长)、异常数、异常比例。
- 平均响应时间 (DEGRADE_GRADE_RT):当 1s 内持续进入 5 个请求,对应时刻的平均响应时间(秒级)均超过阈值(count,以 ms 为单位),那么在接下的时间窗口(DegradeRule 中的
timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地熔断(抛出 DegradeException)。
注意 Sentinel 默认统计的 RT 上限是 4900 ms,超出此阈值的都会算作 4900 ms,若需要变更此上限可以通过启动配置项 -Dcsp.sentinel.statistic.max.rt=xxx 来配置。 - 异常比例 (DEGRADE_GRADE_EXCEPTION_RATIO):当资源的每秒请求量 >= 5,并且每秒异常总数占通过量的比值超过阈值(DegradeRule 中的 count)之后,资源进入降级状态,即在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
- 异常数 (DEGRADE_GRADE_EXCEPTION_COUNT):当资源近 1 分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的,若 timeWindow 小于 60s,则结束熔断状态后仍可能再进入熔断状态。
下面以RT为例进行测试:
1、服务中接口代码:
@GetMapping("/test")
public voidtestD()
{
try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }
}
2、sentinel中配置:
3、启动jemeter,一秒进10个线程,发现服务被挂死
4、停止jemeter之后服务恢复正常
四、配置持久化
应用重启之后,Sentinel配置的规则会消失,在实际应用中,不符合情况。结合Nacos配置中心特性,可已经Sentinel的规则配置持久化到Nacos中。
1、pom文件中加入依赖
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
2、修改配置
server:
port: 8401
spring:
application:
name: cloudalibaba-sentinel-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
sentinel:
transport:
dashboard: localhost:8080
port: 8719
datasource:
ds1:
nacos:
server-addr: localhost:8848
dataId: cloudalibaba-sentinel-service
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow
management:
endpoints:
web:
exposure:
include: '*'
3、Nacos中添加配置规则
4、重启服务,刷新Sentinel限流规则,访问接口,限流效果生效