Spring Cloud gateway 六 Sentinel nacos存儲動態刷新
- 2019 年 11 月 13 日
- 筆記
微服務當前這麼火爆的程度,如果不能學會一種微服務框架技術。怎麼能升職加薪,增加簡歷的籌碼?spring cloud 和 Dubbo 需要單獨學習。說沒有時間?沒有精力?要學倆個框架?而Spring Cloud alibaba只需要你學會一個就會擁有倆種微服務治理框架技術。何樂而不為呢?加油吧!騷猿年
### Sentinel規則
Sentinel 的理念是開發者只需要關注資源的定義,當資源定義成功後可以動態增加各種流控降級規則。Sentinel 提供兩種方式修改規則:
通過 API 直接修改 (loadRules)
通過 DataSource 適配不同數據源修改
手動通過 API 修改比較直觀,可以通過以下幾個 API 修改不同的規則:
FlowRuleManager.loadRules(List<FlowRule> rules); // 修改流控規則 DegradeRuleManager.loadRules(List<DegradeRule> rules); // 修改降級規則
特別注意一下這倆個方法。後面會拿一個做案例說明
手動修改規則(硬編碼方式)一般僅用於測試和演示,生產上一般通過動態規則源的方式來動態管理規則。
### DataSource 擴展
上述 loadRules() 方法只接受記憶體態的規則對象,但更多時候規則存儲在文件、資料庫或者配置中心當中。DataSource 介面給我們提供了對接任意配置源的能力。相比直接通過 API 修改規則,實現 DataSource 介面是更加可靠的做法。
推薦通過控制台設置規則後將規則推送到統一的規則中心,客戶端實現 ReadableDataSource 介面端監聽規則中心實時獲取變更,流程如下:
DataSource 擴展常見的實現方式有:
- 拉模式:客戶端主動向某個規則管理中心定期輪詢拉取規則,這個規則中心可以是 RDBMS、文件,甚至是 VCS 等。這樣做的方式是簡單,缺點是無法及時獲取變更;
- 推模式:規則中心統一推送,客戶端通過註冊監聽器的方式時刻監聽變化,比如使用 Nacos、Zookeeper 等配置中心。這種方式有更好的實時性和一致性保證。
Sentinel 目前支援以下數據源擴展:
- Pull-based: 文件、Consul (since 1.7.0)
- Push-based: ZooKeeper, Redis, Nacos, Apollo
因為是註冊中心和配置中心 都使用的nacos。這裡也只介紹nacos 的使用方式。
整合程式碼修改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 [email protected] * @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整合
如何喜歡可以關注分享本公眾號。
版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。轉載請附帶公眾號二維碼