Sentinel 的理念是开发者只须要关注资源的定义,当资源定义成功后能够动态增长各类流控降级规则。Sentinel 提供两种方式修改规则:java
经过 API 直接修改 (loadRules)
经过 DataSource 适配不一样数据源修改
手动经过 API 修改比较直观,能够经过如下几个 API 修改不一样的规则:git
FlowRuleManager.loadRules(List<FlowRule> rules); // 修改流控规则 DegradeRuleManager.loadRules(List<DegradeRule> rules); // 修改降级规则
特别注意一下这俩个方法。后面会拿一个作案例说明github
手动修改规则(硬编码方式)通常仅用于测试和演示,生产上通常经过动态规则源的方式来动态管理规则。spring
上述 loadRules() 方法只接受内存态的规则对象,但更多时候规则存储在文件、数据库或者配置中心当中。DataSource 接口给咱们提供了对接任意配置源的能力。相比直接经过 API 修改规则,实现 DataSource 接口是更加可靠的作法。数据库
推荐经过控制台设置规则后将规则推送到统一的规则中心,客户端实现 ReadableDataSource 接口端监听规则中心实时获取变动,流程以下: api
DataSource 扩展常见的实现方式有:服务器
Sentinel 目前支持如下数据源扩展:并发
由于是注册中心和配置中心 都使用的nacos。这里也只介绍nacos 的使用方式。app
整合代码修改pom 引入jar框架
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> </dependency>
修改yml 配置文件。添加DataSource支持
spring: cloud: sentinel: transport: dashboard: localhost:8890 port: 8719 eager: true datasource: na: nacos: server-addr: 47.99.209.72:8848 groupId: DEFAULT_GROUP dataId: ${spring.application.name}-${spring.profiles.active}-sentinel rule-type: flow
nacos配置中心建立文件 cloud-gateway-demo-dev-sentinel
[ { "resource": "/api", "limitApp": "default", "grade": 1, "count": 5, "strategy": 0, "controlBehavior": 0, "clusterMode": false } ]
启动服务
查看启动台sentinel
若是须要动态修改。直接修改nacos对应配置文件。在进行发布,Sentinel 就会随着动态更新
这个就不带你们去作这个实验了。
还有一种状况 就是上面提升的 手动api方式修改。官方并不推荐
FlowRuleManager.loadRules(List<FlowRule> rules); // 修改流控规则
这种方案这里也实现一下
很简单只要增长一个ApplicationRunner 实现类就能够完成
package com.xian.cloud.runner; import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; /** * <Description> * * @author xianliru@163.com * @version 1.0 * @createDate 2019/11/12 11:18 */ @Component @Slf4j public class FlowRuleRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { try { List<FlowRule> rules = FlowRuleManager.getRules(); if(rules == null ){ rules = new ArrayList<>(); } FlowRule flowRule = new FlowRule("/refreshRoutes"); flowRule.setCount(5).setClusterMode(false).setControlBehavior(0); flowRule.setLimitApp("default"); rules.add(flowRule); log.info("FlowRuleRunner loadRules reules:{} ",rules); FlowRuleManager.loadRules(rules); }catch (Exception e){ log.error("FlowRuleRunner 加载异常 :{}",e.getMessage()); } } }
这里须要要注意下ApplicationRunner 是在项目启动完成以后作的一些事情。若是在run方法里面抛出异常。不进行捕获,会致使程序直接退出
咱们重启启动程序。看一下
思考一下,若是在配置中心修改规则之后refreshRoutes 这个限流规则还会存在么?
如今实验一下,将nacos api修改成test 并发布。
程序日志
2019-11-13 10:23:07.426 INFO 43912 --- [.99.209.72_8848] c.a.n.client.config.impl.ClientWorker : [fixed-47.99.209.72_8848] [polling-resp] config changed. dataId=cloud-gateway-demo-dev-sentinel, group=DEFAULT_GROUP 2019-11-13 10:23:07.535 INFO 43912 --- [.99.209.72_8848] c.a.n.client.config.impl.ClientWorker : [fixed-47.99.209.72_8848] [data-received] dataId=cloud-gateway-demo-dev-sentinel, group=DEFAULT_GROUP, tenant=null, md5=b03e221f14293f3274788cbdb24a44b4, content=[ { "resource": "/test", "limitApp": "default", "grade": 1, "cou... 2019-11-13 10:23:07.535 INFO 43912 --- [.99.209.72_8848] c.a.nacos.client.config.impl.CacheData : [fixed-47.99.209.72_8848] [notify-listener] time cost=0ms in ClientWorker, dataId=cloud-gateway-demo-dev-sentinel, group=DEFAULT_GROUP, md5=b03e221f14293f3274788cbdb24a44b4, listener=com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource$1@10b4e985 2019-11-13 10:23:07.538 INFO 43912 --- [update-thread-1] c.a.nacos.client.config.impl.CacheData : [fixed-47.99.209.72_8848] [notify-ok] dataId=cloud-gateway-demo-dev-sentinel, group=DEFAULT_GROUP, md5=b03e221f14293f3274788cbdb24a44b4, listener=com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource$1@10b4e985
来看一下 Sentinel控制台
在以前经过ApplicationRunner 注入的规则消失了。
若是程序上选中DataSource方式存储动态的限流规则等。就不能在使用官方提供各类工具类加载规则xxx.loadRules。由于动态刷新一次,存储在内存里面的规则就会清空。
手动API 方式 不保证一致性;规则保存在内存中,重启即消失。严重不建议用于生产环境
摘自参考 spring cloud 官方文档
服务器nacos 地址 http://47.99.209.72:8848/nacos
往期地址 spring cloud alibaba 地址
Spring Cloud Alibaba (nacos 注册中心搭建)
Spring Cloud Alibaba 使用nacos 注册中心
Spring Cloud Alibaba nacos 配置中心使用
Spring Cloud alibaba网关 sentinel zuul 四 限流熔断
Spring Cloud gateway 网关服务二 断言、过滤器
Spring Cloud gateway 三 自定义过滤器GatewayFilter
Spring Cloud gateway 五 Sentinel整合
如何喜欢能够关注分享本公众号。