Sentinel实现熔断和限流
# ⼀、概述
1、简介
丰富的应⽤场景:Sentinel 承接了阿⾥巴巴近 10 年的双⼗⼀⼤促流量的核⼼场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填⾕、集流量控制、实时熔断下游不可⽤应⽤等。
完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接⼊应⽤的单台机器秒级数据,甚⾄ 500 台以下规模的集的汇总运⾏情况。
⼴泛的开源⽣态:Sentinel 提供开箱即⽤的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引⼊相应的依赖并进⾏简单的配置即可快速地接⼊ Sentinel。
完善的 SPI 扩展点:Sentinel 提供简单易⽤、完善的 SPI 扩展接⼝。您可以通过实现扩展接⼝来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
2、主要特性
# ⼆、初始化监控⼯程
1、新建⼀个模块,在pom中添加以下依赖;
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!--持久化会⽤到-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<!--OpenFeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--引⼊⾃⼰定义的包-->
<dependency>
<groupId>com.xhanglog.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2、配置⽂件l;
server:
port: 8401
spring:
application:
name: cloudalibaba-sentinel-service
cloud:
nacos:
discovery:
server-addr: localhost:8848 #nacos服务注册中⼼地址
sentinel:
transport:
dashboard: localhost:8080 #配置sentinel dashboard地址
port: 8719 #默认8719端⼝,如果被占⽤会+1扫描,直到到未被占⽤的端⼝
management:
endpoints:
web:
exposure:
3、主启动类加上 注解。
4、启动项⽬,发送⼀个请求,看sentinel 控制台会出现如下图内容:
# 三、流控规则
说明:
资源名:唯⼀名称,默认请求路径;针对来源:Sentinel 可以对调⽤者进⾏限流,填写微服务名,默认default (不区分来源);
阈值类型:QPS (每秒钟请求数量):当调⽤该api 的QPS 达到阈值的时候,进⾏限流;
线程数:当调⽤该api 的线程数达到阈值的时候,进⾏限流;
流控模式:直接:api 达到限流条件时,直接限流;
关联:当关联的资源达到阈值时就限流⾃⼰;
链路:只记录指定链路上的流量(指定资源从⼊⼝进来的流量,如果达到阈值就进⾏限流);
流控效果:
快速失败:直接失败抛异常;
Warm Up :根据codeFactor (冷加载因⼦,默认3)的值,从阈值/codeFactor ,经过预热时长才达到设置的QPS 阈值;
排队等待:匀速排队,让请求匀速通过,阈值类型必须设置为QPS ,否则⽆效。
# 四、降级规则
说明:
RT (平均响应时间):
平均响应时间超出阈值且在时间窗⼝内通过的请求⼤于等于5时触发降级,时间窗⼝期过后会关闭断路器,RT 最⼤为4900ms ,超出此阈值的都会算作 4900 ms ,若需要变更此上限可以通过启动配置项 来配置。
异常⽐例(秒级):
QPS >= 5,并且每秒异常总数占通过量的⽐值超过阈值之后,资源进⼊降级状态,异常⽐率的阈值范围是 ,代表 0% - 100%。时间窗⼝结束后关闭降级。异常数(分钟级):
资源近 1 分钟的异常数⽬超过阈值之后会进⾏熔断。注意由于统计时间窗⼝是分钟级别的,若 时间窗⼝⼩于 60s ,则结束熔断状态后仍可能再进⼊熔断状态。
# 五、热点 Key 限流
配置举例:
编写两个⽅法
热点规则配置如下图;
当浏览器没秒请求包含p1参数的次数超过1次,会执⾏的结果。
# 六、规则持久化
1、将sentinel 的规则持久化到nacos 中,在pom 中引⼊以下依赖;
2、在配置⽂件中添加以下配置:
3、在nacos 中加⼊配置,⽂件类型为json ,dataId 就是以上配置的dataId;
exposure:
include: "*"
@EnableDiscoveryClient -Dcsp.sentinel.=xxx [0.0, 1.0]@GetMapping("/testHotKey")
@SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey")
public String testHotKey(@RequestParam(value = "p1",required = false)String p1,
@RequestParam(value = "p2",required = false)String p2){
return "************************testHotKey";
}
public String deal_testHotKey(String p1, String p2, BlockException exception){
return "************************deal_testHotKey";
}
deal_testHotKey <dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
spring:
cloud:
sentinel:
#将sentinel 配置信息持久化到nacos
datasource:
ds1:
nacos:
server-addr: localhost:8848
dataId: cloudalibaba-sentinel-service
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow
[
{
"resource": "/rateLimit/byUrl",
"limitApp": "default",
"grade": 1,
"count": 1,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
说明:
resource:资源名称;
limitApp:来源应⽤;
grade:阈值类型,0表⽰线程数,1表⽰QPS;
count:单机阈值;
strategy:流控模式,0表⽰直接,1表⽰关联,2表⽰链路;
controlBehavior:流控效果,0表⽰快速失败,1表⽰Warm UP,2表⽰排队等待;springcloud和springboot
clusterMode:是否集。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论