一篇搞定Sentinel-搭建Spring Cloud Alibaba服务组件Sentinel实现服务资源控制
1、Sentinel介绍
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
官网地址:
https://sentinelguard.io/zh-cn/
https://github.com/alibaba/Sentinel
新手指南:
https://github.com/alibaba/Sentinel/wiki/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97
2、首先下载Sentinel控制台
Sentinel下载地址:
https://github.com/alibaba/Sentinel/releases
选择合适的Sentinel版本进行下载。下载版本需要和Spring Cloud Alibaba版本进行对比,以防下载的版本和其他组件不兼容。这里附加版本说明地址:
https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E#2021x-%E5%88%86%E6%94%AF
我使用的Spring Cloud Alibaba Version为2.2.6.RELEASE版本,通过版本关系对比需要下载的Sentinel版本为1.8.1,找到该版本进行下载:
这里直接选择jar包下载,也可以自己下载源码进行编译。
3、启动Sentinel控制台
由于下载的为jar包所以需要有JDK安装环境,安装环境是学习java必备的技能这里不做介绍,直接启动jar包:
java -jar sentinel-dashboard-1.8.1.jar
这里启动的默认端口号为8080。访问IP:8080登录sentinel,默认账号密码:sentinel
登录成功我们会发现控制台只有一个首页其他的什么的没有。因为目前没有服务程序接入,所以sentinel检测不到服务。我们可以修改启动命令,添加参数,让sentinel也能检测到自己。命令:
java -Dserver.port=8820 -Dcsp.sentinel.dashboard.server=localhost:8820 -Dcsp.sentinel.api.port=8719 -Dproject.name=spring-cloud -jar sentinel-dashboard-1.8.1.jar
-Dserver.port=8820 #指定控制台端口,不使用默认端口
-Dcsp.sentinel.dashboard.server=localhost:8820 #指定控制台地址和端口。
-Dcsp.sentinel.api.port=8719 #客户端监控 API 的端口默认是 8719,如果该端口占用,会在默认端口+1。如果+1后8020端口也被占用,则还会持续+1,直到发现没有占用的端口为止。
-Dproject.name=spring-cloud #指定应用的名称
如果需要重新设置用户名密码,启动参数加入:
-Dsentinel.dashboard.auth.username=admin
-Dsentinel.dashboard.auth.password=12345qwe
这里只设置这几个参数。如果想要配置更多参数,可以查看官网启动配置项,文档地址:
https://sentinelguard.io/zh-cn/docs/startup-configuration.html
执行上面Java命令,启动Sentinel。访问IP:8820登录sentinel,默认账号密码:sentinel
登录成功,我们会发现控制台多个一个应用程序,这个就是通过上面Java启动命令修改的应用名称,sentinel检测到的自己的服务。
4、客户端接入控制台
通过上面三步骤,Sentinel控制台就安装并启动成功了,接下来我们该通过代码接入客户端。首先打开我们的SpringCloud项目,在模块module的pom中添加sentinel依赖,这里我加到我项目的订单模块中order-module:
<!--服务熔断降级--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
如果之前没有搭建过SpringCloud项目,可以查看我之前写的随笔进行搭建。点击文章链接:
https://www.cnblogs.com/eternality/p/17757310.html
jar包引入成功后,就可以在配置文件中加入配置信息了。配置如下:
spring:
profiles:
active: dev
application:
# 服务名称
name: order-service-model
cloud:
sentinel:
enabled: true #开启Sentinel
eager: true # 取消控制台懒加载,项目启动即连接Sentinel
transport:
dashboard: localhost:8080 #控制台地址
启动项目,查看sentinel控制台:
这里我启动了两个订单模块服务,可以发现,sentinel中显示了订单模块,说明在order-module中成功接入控制台了。
注意:
如果在配置文件中没有配置取消懒加载spring.cloud.sentinel.eager: true 则项目启动成功在sentinel控制台不会显示模块信息。需要访问一次接口才会显示,因为默认为懒加载模式。
接下来就可以测试Sentinel是否连接成功了,访问接口在实时监控和簇点链路中查看是否有接口信息。
如果想要对外暴露更多信息,我们可以集成SpringBoot的Actuator,对外暴露端点endpoint。Actuator可以了解服务的各种情况,健康检查,服务状态之类。
<!--监控--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
在配置文件中加入暴露端点信息:
#暴露端点
management:
endpoints:
web:
exposure:
include: '*'
5、规则配置
控制规则、降级规则、热点规则、系统规则、授权规则本次不做相关介绍,可以在官方上面学习。点击链接进行查看:
https://github.com/alibaba/Sentinel/wiki/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8
6、Sentinel配置规则持久化
Sentinel配置的规则默认不是真实存在的,只要重新启动微服务项目,之前添加的规则都会消失,需要重新添加。所以需要配置规则持久化,将配置信息保存在注册中心nacos中,这样不管重启多少次项目,最初创建的规则还在。
首先在pom中加入依赖:
<!-- Sentinel规则持久化至Nacos配置 --> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> </dependency>
依赖加入成功后,就可以在项目配置文件中加入配置信息了:
spring:
profiles:
active: dev
application:
# 服务名称
name: order-service-model
cloud:
sentinel:
enabled: true
eager: true # 取消控制台懒加载,项目启动即连接Sentinel
transport:
dashboard: localhost:8080 #控制台地址
#port: 8722
datasource:
#五种规则持久化到Nacos中 authority(授权规则)、degrade(降级规则)、flow(流控规则)、param-flow(热点规则)、system(系统规则)
#sentinel 数据持久化-控流
ds1:
nacos:
server-addr: 127.0.0.1:8848 # 配置nacos server 注册中心地址
dataId: order-service-model-sentinel # 和nacos中保持对应
groupId: DEFAULT_GROUP # 和 nacos中保持对应
data-type: json # 规则类型:流控
namespace: 23857f22-27ac-4947-988a-1b88d4eeb807
# 对于 nacos 数据类型 注意网关流控规则对应 gw-flow
rule-type: flow #表示流控规则,可配置规则:flow,degrade,authority,system,param-flow,gw-flow,gw-api-group
#sentinel 数据持久化-降级
ds2:
nacos:
server-addr: 127.0.0.1:8848 # 配置nacos server 注册中心地址
dataId: order-service-model-sentinel-demotion # 和nacos中保持对应
groupId: DEFAULT_GROUP # 和 nacos中保持对应
data-type: json # 规则类型:流控
namespace: 23857f22-27ac-4947-988a-1b88d4eeb807
# 对于 nacos 数据类型
rule-type: degrade #表示降级规则,可配置规则:flow,degrade,authority,system,param-flow,gw-flow,gw-api-group
#sentinel 数据持久化-热点
ds3:
nacos:
server-addr: 127.0.0.1:8848 # 配置nacos server 注册中心地址
dataId: order-service-model-sentinel-hotspot # 和nacos中保持对应
groupId: DEFAULT_GROUP # 和 nacos中保持对应
data-type: json # 规则类型:流控
namespace: 23857f22-27ac-4947-988a-1b88d4eeb807
# 对于 nacos 数据类型
rule-type: PARAM_FLOW #表示降级规则,可配置规则:flow,degrade,authority,system,param-flow,gw-flow,gw-api-group
在nacos的配置列表中添加相关配置文件:
控流文件:order-service-model-sentinel
降级文件:order-service-model-sentinel-demotion
热点规则文件:order-service-model-sentinel-hotspot
order-service-model-sentinel配置信息:
[
{
"resource": "redis",
"limitApp": "default",
"grade": 1,
"count": 1,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
https://github.com/alibaba/Sentinel/wiki/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8#%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6%E8%A7%84%E5%88%99-flowrule
order-service-model-sentinel-demotion配置信息:
[
{
"resource": "com.itmy.user.service.IUserExternalService:selectUserAll()",
"grade": 0,
"count": 100.0,
"passCount": 0,
"timeWindow": 20,
"minRequestAmount":1,
"statIntervalMs":2002,
"slowRatioThreshold":0.1
}
]
https://github.com/alibaba/Sentinel/wiki/熔断降级
order-service-model-sentinel-hotspot配置信息:
[
{
"resource": "sentinelTest",
"count": 2,
"paramIdx":0,
"durationInSec":1000
}
]
热点参数限流规则说明:
https://github.com/alibaba/Sentinel/wiki/热点参数限流
上面配置成功后,重新启动项目进行测试。我们可以看到不管重新启动多少次,配置的规则依然在。持久化规则就配置成功了。
注意:
如果后面需要更改配置规则,则需要在nacos的配置中进行修改。在Sentinel中更改如果重新启动项目则还会恢复原来的配置规则。