赞
踩
Sentinel 的理念是开发者只需要关注资源的定义,当资源定义成功后可以动态增加各种流控降级规则。
在实际使用过程中,设置规则之后,保存在内存中,应用重启后,规则失效,而目前sentinel并没有直接提供持久化保存规则的功能,需要自己实现。
Sentinel 提供两种方式修改规则:
手动通过 API 修改比较直观,可以通过以下几个 API 修改不同的规则:
FlowRuleManager.loadRules(List<FlowRule> rules); // 修改流控规则
DegradeRuleManager.loadRules(List<DegradeRule> rules); // 修改降级规则
手动修改规则(硬编码方式)一般仅用于测试和演示,生产上一般通过动态规则源的方式来动态管理规则。
上述 loadRules() 方法只接受内存态的规则对象,但更多时候规则应该存储在文件、数据库或者配置中心当中。DataSource 接口给我们提供了对接任意配置源的能力。相比直接通过 API 修改规则,实现 DataSource 接口是更加可靠的做法。
推荐通过控制台设置规则后将规则推送到统一的规则中心,客户端实现 ReadableDataSource 接口端监听规则中心实时获取变更,流程如下:
DataSource 扩展常见的实现方式有:
Sentinel 目前支持以下数据源扩展:
Nacos 是阿里中间件团队开源的服务发现和动态配置中心。Sentinel 针对 Nacos 作了适配,底层可以采用 Nacos 作为规则配置数据源。
为了后续深入研究,这里直接克隆sentinel源码,地址,切换到1.8分支,导入IDEA,并启动控制台,使用sentinel/sentinel登录。
参考文档,创建一个spring cloud项目,并初步集成nacos、sentinel控制台。
集成Nacos注册中心
集成Nacos配置中心
集成Sentinel
首先需要添加sentinel对Nacos数据源的支持依赖。
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
新建一个配置,配置Data ID为服务名(spring.application.name)加上后缀,Group为DEFAULT_GROUP(默认分组)。
特别注意的是配置内容,需要使用JSON格式。这里是一个数组,数组中每个Json对象表示一条流控规则。
每个规则类型不同,其格式也不同。所以一个配置文件,只能对应一种规则类型,当你想配置所有的规则时,需要创建不同的配置文件。
这里创建两个配置,一个是流控规则,一个是降级规则,配置内容如下:
sentinel-demo-sentinel文件流控规则:
[
{
"resource": "/**",
"limitApp": "default",
"grade": 1,
"count": 1,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
sentinel-demo-sentinel-degrade文件降级规则:
[
{
"count":500,
"grade":0,
"limitApp":"default",
"minRequestAmount":5,
"resource":"/test",
"slowRatioThreshold":1,
"statIntervalMs":1000,
"timeWindow":100
}
]
规则在nacos中配置完成后,需要在yml中配置nacos-datasource,这里配置了两个datasource,一个是流控规则,一个是降级规则。
spring: application: name: sentinel-demo cloud: sentinel: transport: dashboard: localhost:8080 # sentinel注册地址 datasource: r1: nacos: # nacos地址 server-addr: localhost:8848 # nacos中配置文件的data-id data-id: ${spring.application.name}-sentinel # nacos 分组 group-id: DEFAULT_GROUP # 规则类型 流控 rule-type: flow r2: nacos: server-addr: localhost:8848 data-id: ${spring.application.name}-sentinel-degrade group-id: DEFAULT_GROUP rule-type: degrade
这里需要注意rule-type的配置,需要根据不同的配置规则文件配置,比如${spring.application.name}-sentinel这个配置文件是流控规则,就需要配置为flow。
rule-type的配置项对应RuleType 枚举类。
public enum RuleType {
FLOW("flow", FlowRule.class),
DEGRADE("degrade", DegradeRule.class),
PARAM_FLOW("param-flow", ParamFlowRule.class),
SYSTEM("system", SystemRule.class),
AUTHORITY("authority", AuthorityRule.class),
GW_FLOW("gw-flow", "com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule"),
GW_API_GROUP("gw-api-group", "com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition");
}
我们启动nacos、sentinel、服务后台,查看规则,发现Ncaos中的规则能够在控制台中显示。
访问流控接口,触发限流规则,发现规则生效
修改Nacos中的流控规则,然后查看sentinel控制台,发现规则会自动更新。
在sentinel控制台添加流控规则,发现新加规则并没有在Nacos配置中更新,那么肯定是保存在内存中了。。。过一会儿就会被清理掉。
通过实践发现,基于以上方案,可以实现在Nacos中持久化规则,但是实际开发,我们更需要的是在控制台中直接添加规则,然后持久化到Nacos中,实现双向同步。如何实现呢?后续深入分析。。。
想要的:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。