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整合
如何喜歡能夠關注分享本公衆號。