1\. 在项目 pom.xml 文件中加入 sentinel-datasource-nacos 依赖
<dependency><groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
sentinel-datasource-nacos 是 Sentinel 为 Nacos 扩展的数据源模块,允许将规则数据存储在 Nacos 配置中心,在微服务启动时利用该模块 Sentinel 会自动在 Nacos下载对应的规则数据。
2\. 在application.yml 文件中增加 Nacos下载规则
#spring:# application:
# name: sentinel-sample #应用名&微服务id
# cloud:
# sentinel: #Sentinel Dashboard通信地址
# transport:
# dashboard: 10.173.203.14:9100
# eager: true #取消控制台懒加载
# nacos: #Nacos通信地址
# server-addr: 10.173.203.14:8848
# username: nacos
# password: nacos
#server:
# port: 80
#management:
# endpoints:
# web: #将所有可用的监控指标项对外暴露
# exposure: #可以访问 /actuator/sentinel进行查看Sentinel监控项
# include: '*'
spring:
application:
name: sentinel-sample #应用名&微服务id
cloud:
sentinel: #Sentinel Dashboard通信地址
transport:
dashboard: 10.173.203.158:8080
eager: true #取消控制台懒加载
datasource:
flow: #数据源名称,可以自定义
nacos: #nacos配置中心
#Nacos内置配置中心,因此重用即可
server-addr: ${spring.cloud.nacos.server-addr}
dataId: ${spring.application.name}-flow-rules #定义流控规则data-id,完整名称为:sentinel-sample-flow-rules,在配置中心设置时data-id必须对应。
groupId: SAMPLE_GROUP #gourpId对应配置文件分组,对应配置中心groups项
rule-type: flow #flow固定写死,说明这个配置是流控规则 degrade
username: nacos #nacos通信的用户名与密码
password: nacos
nacos: #Nacos通信地址
server-addr: 10.173.203.14:8848
username: nacos
password: nacos
jackson:
default-property-inclusion: non_null
server:
port: 80
management:
endpoints:
web: #将所有可用的监控指标项对外暴露
exposure: #可以访问 /actuator/sentinel进行查看Sentinel监控项
include: '*'
logging:
level:
root: debug #开启 debug 是学习需要,生产改为 info 即可
3\. 在 Nacos 配置中心页面,新增 data-id 为sentinel-sample-flow-rules 的配置项。
这里 data-id 与 groups 与微服务应用的配置保持对应,最核心的配置内容采用 JSON 格式进行书写,我们来分析下这段流控规则。
[{
"resource":"/test_flow_rule", #资源名,说明对那个URI进行流控
"limitApp":"default", #命名空间,默认default
"grade":1, #类型 0-线程 1-QPS
"count":2, #超过2个QPS限流将被限流
"strategy":0, #限流策略: 0-直接 1-关联 2-链路
"controlBehavior":0, #控制行为: 0-快速失败 1-WarmUp 2-排队等待
"clusterMode":false #是否集群模式
}
]
4\. 查看服务的流量控制规则
访问 : http://localhost/actuator/sentinel在 flowRules 这个数组中,可以看到 对应流控规则
{"appName": "sentinel-sample",
"consoleServer": [{
"r1": "10.173.203.158",
"r2": 8080
}],
"coldFactor": "3",
"rules": {
"systemRules": [],
"authorityRule": [],
"paramFlowRule": [],
"flowRules": [{
"resource": "/test_flow_rule",
"limitApp": "default",
"grade": 1,
"count": 1.0,
"strategy": 0,
"controlBehavior": 0,
"warmUpPeriodSec": 10,
"maxQueueingTimeMs": 500,
"clusterMode": false,
"clusterConfig": {
"thresholdType": 0,
"fallbackToLocalWhenFail": true,
"strategy": 0,
"sampleCount": 10,
"windowIntervalMs": 1000
}
}],
"degradeRules": []
},
"metricsFileCharset": "UTF-8",
"filter": {
"order": -2147483648,
"urlPatterns": ["/**"],
"enabled": true
},
"totalMetricsFileCount": 6,
"datasource": {
"flow": {
"nacos": {
"dataType": "json",
"ruleType": "FLOW",
"serverAddr": "10.173.203.14:8848",
"username": "nacos",
"password": "nacos",
"groupId": "SAMPLE_GROUP",
"dataId": "sentinel-sample-flow-rules"
}
}
},
"clientIp": "10.173.134.200",
"clientPort": "8719",
"logUsePid": false,
"metricsFileSize": 52428800,
"logDir": "C:\\Users\\xulihui\\logs\\csp\\",
"heartbeatIntervalMs": 10000
}
5\. 自定义资源点进行熔断保护
在 sentinel-core 客户端中为开发者提供了 @SentinelResource 注解,该注解允许在程序代码中自定义 Sentinel 资源点来实现对特定方法的保护
在 sentinel-core 中基于 Spring AOP(面向切面技术)可在目标 Service 方法执行前按熔断规则进行检查,只允许有效的数据被送入目标方法进行处理。
5.1 声明切面
// 注解支持的配置Bean@Bean
public SentinelResourceAspect sentinelResourceAspect() {
return new SentinelResourceAspect();
}
5.2 声明资源点
在 SampleService.createOrder 方法上增加 @SentinelResource 注解用于声明 Sentinel 资源点,只有声明了资源点,Sentinel 才能实施限流熔断等保护措施。
/*** 演示用的业务逻辑类
*/
@Service
public class SampleService {
//资源点名称为createOrder
@SentinelResource("createOrder")
/**
* 模拟创建订单业务
* 抛出IllegalStateException异常用于模拟业务逻辑执行失败的情况
*/
public void createOrder() throws IllegalStateException{
try {
//模拟处理业务逻辑需要101毫秒
Thread.sleep(101);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("订单已创建");
}
}
5.3 获取熔断规则
打开sentinel-sample 工程的 application.yml 文件,将服务接入 Nacos 配置中心的参数以获取熔断规则。
datasource:flow: #之前的流控规则,直接忽略
...
degrade: #熔断规则
nacos:
server-addr: ${spring.cloud.nacos.server-addr}
dataId: ${spring.application.name}-degrade-rules
groupId: SAMPLE_GROUP
rule-type: degrade #代表熔断
username: nacos
password: nacos
5.4 在 Nacos 配置熔断规则
设置 data-id 为 sentinel-sample-degrade-rules,Groups 为 SAMPLE_GROUP与微服务的设置保持一致。
[{"resource": "createOrder", #自定义资源名
"limitApp": "default", #命名空间
"grade": 0, #0-慢调用比例 1-异常比例 2-异常数
"count": 100, #最大RT 100毫秒执行时间
"timeWindow": 5, #时间窗口5秒
"minRequestAmount": 1, #最小请求数
"slowRatioThreshold": 0.1 #比例阈值
}]
JSON 完整的含义是:在过去 1 秒内,如果 createOrder资源被访问 1 次后便开启熔断检查,如果其中有 10% 的访问处理时间超过 100 毫秒,则触发熔断 5 秒钟,这期间访问该方法所有请求都将直接抛出 DegradeException,5 秒后该资源点回到“半开”状态等待新的访问,如果下一次访问处理成功,资源点恢复正常状态,如果下一次处理失败,则继续熔断 5 秒钟。