com.alibaba.csp sentinel-datasource-nacos
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 #是否集群模式
}
]
可以参考: Sentinel 的 GitHub 文档进行学习。
https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6
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": ["
@Service
public class SampleService {
//资源点名称为createOrder
@SentinelResource("createOrder")
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 秒钟。



