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 接口端監聽規則中心實時獲取變更,流程如下:

file

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
file

[      {          "resource": "/api",          "limitApp": "default",          "grade": 1,          "count": 5,          "strategy": 0,          "controlBehavior": 0,          "clusterMode": false      }  ]

啟動服務

查看啟動台sentinel

file

如果需要動態修改。直接修改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方法裏面拋出異常。不進行捕獲,會導致程序直接退出

我們重啟啟動程序。看一下

file

思考一下,如果在配置中心修改規則以後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控制台
file

在之前通過ApplicationRunner 注入的規則消失了。

反思

  • 如果程序上選中DataSource方式存儲動態的限流規則等。就不能在使用官方提供各種工具類加載規則xxx.loadRules。因為動態刷新一次,存儲在內存裏面的規則就會清空。

  • 手動API 方式 不保證一致性;規則保存在內存中,重啟即消失。嚴重不建議用於生產環境

往期資料、參考資料

Sentinel 官方文檔地址

摘自參考 spring cloud 官方文檔

Spring Cloud alibaba 官網地址

示例代碼地址

服務器nacos 地址 http://47.99.209.72:8848/nacos

往期地址 spring cloud alibaba 地址

spring cloud alibaba 簡介

Spring Cloud Alibaba (nacos 註冊中心搭建)

Spring Cloud Alibaba 使用nacos 註冊中心

Spring Cloud Alibaba nacos 配置中心使用

spring cloud 網關服務

Spring Cloud zuul網關服務 一

Spring Cloud 網關服務 zuul 二

Spring Cloud 網關服務 zuul 三 動態路由

Spring Cloud alibaba網關 sentinel zuul 四 限流熔斷

Spring Cloud gateway 網關服務 一

Spring Cloud gateway 網關服務二 斷言、過濾器

Spring Cloud gateway 三 自定義過濾器GatewayFilter

Spring Cloud gateway 網關四 動態路由

Spring Cloud gateway 五 Sentinel整合

如何喜歡可以關注分享本公眾號。
file

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。轉載請附帶公眾號二維碼