SpringCloudAlibaba——Sentinel
什么是Sentinel
一个轻量级的面向云原生微服务的流量控制,熔断降级组件。
Sentinel主要分为两个部分
-
核心库:Java客户端,不依赖任何框架,能够运行所有Java运行时环境,同时对Dubbo/SpringCloud等框架
也有较好的支持。 -
控制台:Dashboard基于SpringBoot开发,打包后可以直接运行,不需要额外的Tomcat等应用容器。
Sentinel的下载与安装
下载地址:
https://github.com/alibaba/Sentinel/releases
选择版本
下载的是一个jar包,只要电脑上有java运行环境就可以运行
启动Sentinel
构建演示案例
新建cloudalibaba-sentinel-service8401 model
-
新建model
-
改pom
<dependencies> <!--SpringCloud alibaba sentinel-datasource-nacos:后续做持久化用到--> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> </dependency> <!--SpringCloud alibaba Sentinel--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <!--openFeign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!--spring cloud alibaba nacos--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--web/actuator这两个一般一起使用,写在一起--> <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.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>
-
改yml
server: port: 8401 spring: application: name: cloudalibaba-sentinel-service cloud: nacos: discovery: # Nacos服务注册中心地址 server-addr: xxxxxx:8848 sentinel: transport: # 配置Sentinel dashboard地址 dashboard: localhost:8080 # 默认8719端口,假如被占用会自动从8719开始一次+1扫描,直至找到被占用的端口。 port: 8719 management: endpoints: web: exposure: include: "*"
-
业务类
-
启动Sentinel和演示model并测试
- 要在Sentinel可视化界面中显示启动的演示类,必须先访问一次controller业务才能显示(懒加载机制)
流控规则
名词解析
测试效果
QPS+直接+快速失败
当每秒访问的次数大于2时直接显示该失败页面
线程数 = 1
线程数1:一次只能处理一个该api:/testA请求,当调用该api的线程数达到阈值的时候,进行限流
流控模式——关联
testA关联的资源testB达到阈值后,就限流testA自己
流控模式——链路
链路流控模式指的是,当从某个接口过来的资源达到限流条件时,开启限流
流控效果
-
快速失败: 直接失败,抛出异常:Blocked by Sentinel(flow limiting)
-
Warm Up: 预热,即突然间有大量的请求打过来,会给一个缓冲时间
即预热5s ,在这5s内的阈值为 阈值除以coldFactor(默认是3)= 3,经过预热时长后才会达到真正的阈值 -
排队等待
当阈值超出时,不要直接拒绝,让其排队
当排队超过超时时间才失败
降级规则
- RT:超出阈值且在时间窗口设定的时间内,且通过的请求>=5,两个条件同时满足后触发降级。
- 异常比例
当资源的每秒请求量 >=5,并且每秒异常总数占通过量的比值超过阈值之后,资源进入降级状态。
- 异常数:当资源近1分钟的异常数目超过阈值后会进行熔断
注意:时间窗口一定要大于60s,如果小于60s,熔断结束后仍可能在进入熔断状态
服务降级小结:这里的降级指的是熔断,即直接断开,1.72版没有半开状态,熔断后就只能等过了时间窗口期才能访问
热点key规则![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/71c7d27a355f4930f4f25f9c88e67790.png)
对访问链接中的某个参数进行限制
实例
在controller中添加如下代码
@GetMapping("/testHotKey") //这个代表rest请求地址
@SentinelResource(value = "testHotKeyabc001", blockHandler = "del_testHotKey")
public String testHotKey(@RequestParam(value = "p1", required = false) String p1,
@RequestParam(value = "p1", required = false) String p2){
return "------testHotKey";
}
public String del_testHotKey(String p1, String p2, BlockException e){
return "这次不用默认的兜底提示Blocked by Sentinel(flow limiting),自定义提示:del_testHotKeyo(╥﹏╥)o...";
}
在Sentinel控制台添加规则
测试:快速访问多次
参数例外项![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c37215b800a23f666cf16f3494332745.png)
测试
系统规则
对整个系统进行的规则配置,触发后整个系统限流,类似全局配置