[Spring-Cloud-Alibaba]Sentinel規(guī)則持久化

在之前的練習(xí)中,只要應(yīng)用重啟,就需要重新配置,這樣在我們實際的項目是非常不實用的,那么有沒有辦法把我們配置的規(guī)則保存下來呢?答案是YES,那么接下來,給大家來介紹如何將Sentinel規(guī)則持久化。

十多年的從化網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。成都全網(wǎng)營銷的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整從化建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)公司從事“從化網(wǎng)站設(shè)計”,“從化網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。

Document: 傳送門

  • File Datasource(文件存儲)
    • Pull 模式
    • Push 模式
  • Nacos configuration
  • Apollo
File Datasource
Pull 模式

原理:
擴展寫數(shù)據(jù)源(WritableDataSource), 客戶端主動向某個規(guī)則管理中心定期輪詢拉取規(guī)則,這個規(guī)則中心可以是 RDBMS、文件 等
pull 模式的數(shù)據(jù)源(如本地文件、RDBMS 等)一般是可寫入的。使用時需要在客戶端注冊數(shù)據(jù)源:將對應(yīng)的讀數(shù)據(jù)源注冊至對應(yīng)的 RuleManager,將寫數(shù)據(jù)源注冊至 transport 的 WritableDataSourceRegistry 中。

過程如下:

[Spring-Cloud-Alibaba] Sentinel 規(guī)則持久化

Pull Demo
  • Step 1: 添加配置

      <dependency>
          <groupId>com.alibaba.csp</groupId>
          <artifactId>sentinel-datasource-extension</artifactId>
      </dependency>
  • Step 2: 編寫持久化代碼,實現(xiàn)com.alibaba.csp.sentinel.init.InitFunc

    • 代碼參考自:傳送門
    import com.alibaba.csp.sentinel.command.handler.ModifyParamFlowRulesCommandHandler;
    import com.alibaba.csp.sentinel.datasource.*;
    import com.alibaba.csp.sentinel.init.InitFunc;
    import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule;
    import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRuleManager;
    import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule;
    import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager;
    import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
    import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
    import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule;
    import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRuleManager;
    import com.alibaba.csp.sentinel.slots.system.SystemRule;
    import com.alibaba.csp.sentinel.slots.system.SystemRuleManager;
    import com.alibaba.csp.sentinel.transport.util.WritableDataSourceRegistry;
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.TypeReference;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.List;
    
    /**
    * FileDataSourceInit for : 自定義Sentinel存儲文件數(shù)據(jù)源加載類
    *
    * @author <a href="mailto:magicianisaac@gmail.com">Isaac.Zhang | 若初</a>
    * @since 2019/7/21
    */
    public class FileDataSourceInit implements InitFunc {
      @Override
      public void init() throws Exception {
          // TIPS: 如果你對這個路徑不喜歡,可修改為你喜歡的路徑
          String ruleDir = System.getProperty("user.home") + "/sentinel/rules";
          String flowRulePath = ruleDir + "/flow-rule.json";
          String degradeRulePath = ruleDir + "/degrade-rule.json";
          String systemRulePath = ruleDir + "/system-rule.json";
          String authorityRulePath = ruleDir + "/authority-rule.json";
          String hotParamFlowRulePath = ruleDir + "/param-flow-rule.json";
    
          this.mkdirIfNotExits(ruleDir);
          this.createFileIfNotExits(flowRulePath);
          this.createFileIfNotExits(degradeRulePath);
          this.createFileIfNotExits(systemRulePath);
          this.createFileIfNotExits(authorityRulePath);
          this.createFileIfNotExits(hotParamFlowRulePath);
          // 流控規(guī)則
          ReadableDataSource<String, List<FlowRule>> flowRuleRDS = new FileRefreshableDataSource<>(
                  flowRulePath,
                  flowRuleListParser
          );
          // 將可讀數(shù)據(jù)源注冊至FlowRuleManager
          // 這樣當規(guī)則文件發(fā)生變化時,就會更新規(guī)則到內(nèi)存
          FlowRuleManager.register2Property(flowRuleRDS.getProperty());
          WritableDataSource<List<FlowRule>> flowRuleWDS = new FileWritableDataSource<>(
                  flowRulePath,
                  this::encodeJson
          );
          // 將可寫數(shù)據(jù)源注冊至transport模塊的WritableDataSourceRegistry中
          // 這樣收到控制臺推送的規(guī)則時,Sentinel會先更新到內(nèi)存,然后將規(guī)則寫入到文件中
          WritableDataSourceRegistry.registerFlowDataSource(flowRuleWDS);
    
          // 降級規(guī)則
          ReadableDataSource<String, List<DegradeRule>> degradeRuleRDS = new FileRefreshableDataSource<>(
                  degradeRulePath,
                  degradeRuleListParser
          );
          DegradeRuleManager.register2Property(degradeRuleRDS.getProperty());
          WritableDataSource<List<DegradeRule>> degradeRuleWDS = new FileWritableDataSource<>(
                  degradeRulePath,
                  this::encodeJson
          );
          WritableDataSourceRegistry.registerDegradeDataSource(degradeRuleWDS);
    
          // 系統(tǒng)規(guī)則
          ReadableDataSource<String, List<SystemRule>> systemRuleRDS = new FileRefreshableDataSource<>(
                  systemRulePath,
                  systemRuleListParser
          );
          SystemRuleManager.register2Property(systemRuleRDS.getProperty());
          WritableDataSource<List<SystemRule>> systemRuleWDS = new FileWritableDataSource<>(
                  systemRulePath,
                  this::encodeJson
          );
          WritableDataSourceRegistry.registerSystemDataSource(systemRuleWDS);
    
          // 授權(quán)規(guī)則
          ReadableDataSource<String, List<AuthorityRule>> authorityRuleRDS = new FileRefreshableDataSource<>(
                  flowRulePath,
                  authorityRuleListParser
          );
          AuthorityRuleManager.register2Property(authorityRuleRDS.getProperty());
          WritableDataSource<List<AuthorityRule>> authorityRuleWDS = new FileWritableDataSource<>(
                  authorityRulePath,
                  this::encodeJson
          );
          WritableDataSourceRegistry.registerAuthorityDataSource(authorityRuleWDS);
    
          // 熱點參數(shù)規(guī)則
          ReadableDataSource<String, List<ParamFlowRule>> hotParamFlowRuleRDS = new FileRefreshableDataSource<>(
                  hotParamFlowRulePath,
                  hotParamFlowRuleListParser
          );
          ParamFlowRuleManager.register2Property(hotParamFlowRuleRDS.getProperty());
          WritableDataSource<List<ParamFlowRule>> paramFlowRuleWDS = new FileWritableDataSource<>(
                  hotParamFlowRulePath,
                  this::encodeJson
          );
          ModifyParamFlowRulesCommandHandler.setWritableDataSource(paramFlowRuleWDS);
      }
    
      /**
       * 流控規(guī)則對象轉(zhuǎn)換
       */
      private Converter<String, List<FlowRule>> flowRuleListParser = source -> JSON.parseObject(
              source,
              new TypeReference<List<FlowRule>>() {
              }
      );
      /**
       * 降級規(guī)則對象轉(zhuǎn)換
       */
      private Converter<String, List<DegradeRule>> degradeRuleListParser = source -> JSON.parseObject(
              source,
              new TypeReference<List<DegradeRule>>() {
              }
      );
      /**
       * 系統(tǒng)規(guī)則對象轉(zhuǎn)換
       */
      private Converter<String, List<SystemRule>> systemRuleListParser = source -> JSON.parseObject(
              source,
              new TypeReference<List<SystemRule>>() {
              }
      );
    
      /**
       * 授權(quán)規(guī)則對象轉(zhuǎn)換
       */
      private Converter<String, List<AuthorityRule>> authorityRuleListParser = source -> JSON.parseObject(
              source,
              new TypeReference<List<AuthorityRule>>() {
              }
      );
    
      /**
       * 熱點規(guī)則對象轉(zhuǎn)換
       */
      private Converter<String, List<ParamFlowRule>> hotParamFlowRuleListParser = source -> JSON.parseObject(
              source,
              new TypeReference<List<ParamFlowRule>>() {
              }
      );
    
      /**
       * 創(chuàng)建目錄
       *
       * @param filePath
       */
      private void mkdirIfNotExits(String filePath) {
          File file = new File(filePath);
          if (!file.exists()) {
              file.mkdirs();
          }
      }
    
      /**
       * 創(chuàng)建文件
       *
       * @param filePath
       * @throws IOException
       */
      private void createFileIfNotExits(String filePath) throws IOException {
          File file = new File(filePath);
          if (!file.exists()) {
              file.createNewFile();
          }
      }
    
      private <T> String encodeJson(T t) {
          return JSON.toJSONString(t);
      }
    }
  • Step 3: 啟用上述代碼

    resource 目錄下創(chuàng)建 resources/META-INF/services 目錄并創(chuàng)建文件com.alibaba.csp.sentinel.init.InitFunc ,內(nèi)容為:

    com.sxzhongf.sharedcenter.configuration.sentinel.datasource.FileDataSourceInit
Pull 優(yōu)缺點
  • 優(yōu)點
    1. 簡單,無任何依賴
    2. 沒有額外依賴
  • 缺點
    1. 不保證一致性(規(guī)則是使用FileRefreshableDataSource定時更新,會有延遲)
    2. 實時性不保證(規(guī)則是使用FileRefreshableDataSource定時更新)
    3. 拉取過于頻繁也可能會有性能問題
    4. 由于文件存儲于本地,容易丟失
  • 參考資料:
    1. ITMUCH
    2. Sentinel WIKI
Push 模式

推薦通過控制臺設(shè)置規(guī)則后將規(guī)則推送到統(tǒng)一的規(guī)則中心,客戶端實現(xiàn)ReadableDataSource接口端監(jiān)聽規(guī)則中心實時獲取變更,流程如下:

<img src="https://user-images.githubusercontent.com/9434884/45406233-645e8380-b698-11e8-8199-0c917403238f.png" width="500" />

  • 實現(xiàn)原理

    1. 控制臺推送規(guī)則到Nacos/遠程配置中心
    2. Sentinel client 艦艇Nacos配置變化,更新本地緩存
  • shared_center service 加工

    1. 添加依賴
      <dependency>
          <groupId>com.alibaba.csp</groupId>
          <artifactId>sentinel-datasource-nacos</artifactId>
      </dependency>
    1. 添加配置
    spring:
      cloud:
        sentinel:
          datasource:
            sxzhongf_flow:
              nacos:
                server-addr: localhost:8848
                dataId: ${spring.application.name}-flow-rules
                groupId: SENTINEL_GROUP
                # 規(guī)則類型,取值見:org.springframework.cloud.alibaba.sentinel.datasource.RuleType
                rule_type: flow
            sxzhongf_degrade:
              nacos:
                server-addr: localhost:8848
                dataId: ${spring.application.name}-degrade-rules
                groupId: SENTINEL_GROUP
                rule-type: degrade
  • Sentinel dashboard 加工

    Dashboard 規(guī)則改造主要通過2個接口:

    com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider & com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher

    • Download Sentinel Source Code

    • 修改原sentinel-dashboard項目下的POM文件
        <!-- for Nacos rule publisher sample -->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
            <!--注釋掉原文件中的scope,讓其不僅在test的時候生效-->
            <!--<scope>test</scope>-->
        </dependency>
    • 偷懶模式:復(fù)制sentinel-dashboard項目下test下的nacos包(

    src/test/java/com/alibaba/csp/sentinel/dashboard/rule/nacossrc/main/java/com/alibaba/csp/sentinel/dashboard/rule

    • 修改controller中的默認provider & publisher

    com.alibaba.csp.sentinel.dashboard.controller.v2.FlowControllerV2

        @Autowired
        // @Qualifier("flowRuleDefaultProvider")
            @Qualifier("flowRuleNacosProvider")
        private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
        @Autowired
            // @Qualifier("flowRuleDefaultPublisher")
        @Qualifier("flowRuleNacosPublisher")
        private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;
    • 打開 /Sentinel-1.6.2/sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.html文件,修改代碼:
    <!--<li ui-sref-active="active">-->
                <!--<a ui-sref="dashboard.flow({app: entry.app})">-->
                  <!--<i class="glyphicon glyphicon-filter"></i>??流控規(guī)則 V1</a>-->
    <!--</li>-->
    
    ---
    
    改為
    
      <li ui-sref-active="active">
        <a ui-sref="dashboard.flow({app: entry.app})">
          <i class="glyphicon glyphicon-filter"></i>??NACOS 流控規(guī)則 V1</a>
      </li>

    Dashboard中要修改的代碼已經(jīng)好了。

  • 重新啟動 Sentinel-dashboard mvn clean package -DskipTests

  • 測試效果

    Sentinel 添加流控規(guī)則:

    [Spring-Cloud-Alibaba] Sentinel 規(guī)則持久化

    Nacos 查看同步的配置:

    [Spring-Cloud-Alibaba] Sentinel 規(guī)則持久化


網(wǎng)站標題:[Spring-Cloud-Alibaba]Sentinel規(guī)則持久化
標題URL:http://www.muchs.cn/article26/ghoijg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗、微信公眾號、虛擬主機、域名注冊、App設(shè)計、網(wǎng)站設(shè)計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名