Sentinel限流熔断
Sentinel 概述
Sentinel (分布式系统的流量防卫兵) 是阿里开源的一套用于服务容错的综合性解决方案。它以流量为切入点, 从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。
Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景, 例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
Sentinel核心分为两个部分:
核心库(Java 客户端):能够运行于所有 Java 运行时环境,同时对Dubbo /Spring Cloud 等框架也有较好的支持。
控制台(Dashboard):基于 Spring Boot 开发,打包后可以直接运行。
Sentinel安装
1.打开sentinel下载网址
https://github.com/alibaba/Sentinel/releases
2.下载jar包
3.在sentinel对应目录下,cmd回车进入
4.输入命令
java -Dserver.port=8180 -Dcsp.sentinel.dashboard.server=localhost:8180 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.0.jar
执行之后等待
访问Sentinel
1.Sentinel默认端口8180,访问localhost:8180即可访问登录界面
2.登录sentinel,用户名和密码都是sentinel
快速入门
通过网关作为服务访问的入口,对系统中的服务进行访问,例如访问sca-provider资源
第一步:创建gateway模块,添加pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<--还可以添加nacos实现负载均衡-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
第二步:创建application.yml 添加相关配置,配置如下
spring:
application:
name: sca-gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848
gateway:
discovery:
locator:
enabled: true #开启通过服务注册中心的serviceId创建路由
routes:
- id: route01 #路由id,自己指定一个唯一值即可
# uri: http://localhost:8080/ #网关帮我们转发的url
uri: lb://sca-provider #lb这里表示负载均衡,sca-provider为注册中心的服务名
predicates: ###断言(谓词):匹配请求规则
- Path=/nacos/provider/echo/** #请求路径定义,此路径对应uri中的资源**/
filters: ##网关过滤器,用于对谓词中的内容进行判断分析以及处理
- StripPrefix=1 #转发之前去掉path中第一层路径,例如nacos
第三步:创建启动类
第四步:访问资源url,localhost:9000/nacos/provider/echo/9000,需要先启动sca-provider,sca-gateway服务
predicates说明
Predicate(断言)又称谓词,用于条件判断,只有断言结果都为真,才会真正的执行路由。断言其本质就是定义路由转发的条件.
predicates 内置工厂
1.基于dataTime类型的断言工厂
此类型的断言根据时间做判断,主要有三个:
1) AfterRoutePredicateFactory:判断请求日期是否晚于指定日期
2) BeforeRoutePredicateFactory:判断请求日期是否早于指定日期
3) BetweenRoutePredicateFactory:判断请求日期是否在指定时间段内
-After=2020-12-31T23:59:59.789+08:00[Asia/Shanghai]
当且仅当请求时的时间After配置的时间时,才转发该请求,若请求时的时间不是After配置的时间时,则会返回404 not found。时间值可通过ZonedDateTime.now()获取。
2.基于header的断言工厂HeaderRoutePredicateFactory
判断请求Header是否具有给定名称且值与正则表达式匹配。例如:
-Header=X-Request-Id, \d+
3.基于Method请求方法的断言工厂
MethodRoutePredicateFactory接收一个参数,判断请求类型是否跟指定的类型匹配。例如:
-Method=GET
4.基于Query请求参数的断言工厂,QueryRoutePredicateFactory
接收两个参数,请求param和正则表达式, 判断请求参数是否具 有给定名称且值与正则表达式匹配。例如:
-Query=pageSize,\d+
网关限流
网关是所有请求的公共入口,所以可以在网关进行限流,而且限流的方式也很多,我们采用Sentinel组件来实现网关的限流。
限流快速入门
第一步:添加依赖,在原有spring-cloud-starter-gateway依赖的基础上再添加如下两个依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
第二步:添加sentinel及路由规则(假如已有则无需设置)
sentinel:
transport:
dashboard: localhost:8180
port: 8719
eager: true
routes: #配置网关路由规则
- id: route01 #路由id,自己指定一个唯一值即可
#uri: http://localhost:8081/ #网关帮我们转发的url
uri: lb://sca-provider #lp这里表示负载均衡,sca-provider为注册中心的服务名
predicates: ###断言(谓此):匹配请求规则
- Path=/nacos/provider/echo/** #请求路径定义
filters: ##网关过滤器,用于对谓词中的内容进行判断分析以及处理
- StripPrefix=1 #转发之前去掉path中第一层路径,例如nacos
第三步:启动网关项目,检测sentinel控制台的网关菜单。
启动时,添加sentinel的jvm参数,通过此菜单可以让网关服务在sentinel控制台显示不一样的菜单,代码如下
-Dcsp.sentinel.app.type=1
如图中位置
访问sentinel控制台 效果如图,则表示配置成功
配置网关流量规则
打开浏览器访问url 多次点击如图所示,表示配置成功