[Spring-Cloud-Alibaba] Sentinel persistence rule

Prior to the exercise, as long as the restart of the application, you need to be reconfigured, so that our actual project is not practical, then there is no way to save the configuration of the rules we down? The answer is YES, then the next, to tell you how to introduce the Sentinel rule persist.

Document: Portal

  • File Datasource (file storage)
    • Pull mode
    • Push mode
  • Nacos configuration
  • Apollo
File Datasource
Pull mode

Principle:
Extended write data source ( WritableDataSource), client actively polling pulling rule to a rule management center on a regular basis, this rule may be the center of RDBMS, files, etc.
pull mode data sources (such as local files, RDBMS, etc.) are generally available written. The client needs to use the registered data sources: the register read data corresponding to the corresponding source RuleManager, write data to the transport of source registered WritableDataSourceRegistryin.

Process is as follows:

Pull Demo
  • Step 1: Add a profile

        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-extension</artifactId>
        </dependency>
  • Step 2: write persistence code that implementscom.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存储文件数据源加载类
     *
     * @author <a href="mailto:[email protected]">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);
            // 流控规则
            ReadableDataSource<String, List<FlowRule>> flowRuleRDS = new FileRefreshableDataSource<>(
                    flowRulePath,
                    flowRuleListParser
            );
            // 将可读数据源注册至FlowRuleManager
            // 这样当规则文件发生变化时,就会更新规则到内存
            FlowRuleManager.register2Property(flowRuleRDS.getProperty());
            WritableDataSource<List<FlowRule>> flowRuleWDS = new FileWritableDataSource<>(
                    flowRulePath,
                    this::encodeJson
            );
            // 将可写数据源注册至transport模块的WritableDataSourceRegistry中
            // 这样收到控制台推送的规则时,Sentinel会先更新到内存,然后将规则写入到文件中
            WritableDataSourceRegistry.registerFlowDataSource(flowRuleWDS);
    
            // 降级规则
            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);
    
            // 系统规则
            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);
    
            // 授权规则
            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);
    
            // 热点参数规则
            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);
        }
    
        /**
         * 流控规则对象转换
         */
        private Converter<String, List<FlowRule>> flowRuleListParser = source -> JSON.parseObject(
                source,
                new TypeReference<List<FlowRule>>() {
                }
        );
        /**
         * 降级规则对象转换
         */
        private Converter<String, List<DegradeRule>> degradeRuleListParser = source -> JSON.parseObject(
                source,
                new TypeReference<List<DegradeRule>>() {
                }
        );
        /**
         * 系统规则对象转换
         */
        private Converter<String, List<SystemRule>> systemRuleListParser = source -> JSON.parseObject(
                source,
                new TypeReference<List<SystemRule>>() {
                }
        );
    
        /**
         * 授权规则对象转换
         */
        private Converter<String, List<AuthorityRule>> authorityRuleListParser = source -> JSON.parseObject(
                source,
                new TypeReference<List<AuthorityRule>>() {
                }
        );
    
        /**
         * 热点规则对象转换
         */
        private Converter<String, List<ParamFlowRule>> hotParamFlowRuleListParser = source -> JSON.parseObject(
                source,
                new TypeReference<List<ParamFlowRule>>() {
                }
        );
    
        /**
         * 创建目录
         *
         * @param filePath
         */
        private void mkdirIfNotExits(String filePath) {
            File file = new File(filePath);
            if (!file.exists()) {
                file.mkdirs();
            }
        }
    
        /**
         * 创建文件
         *
         * @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: Enable the code above

    Create a resource directory resources/META-INF/servicesdirectory and create a file com.alibaba.csp.sentinel.init.InitFunc, reads:

    com.sxzhongf.sharedcenter.configuration.sentinel.datasource.FileDataSourceInit
Pull the advantages and disadvantages
  • advantage
    1. Simple, without any dependence
    2. No external dependencies
  • Shortcoming
    1. Does not guarantee the consistency (the rule is to use FileRefreshableDataSourcethe update, there will be a delay)
    2. Does not guarantee real-time (using the rule is FileRefreshableDataSourceregularly updated)
    3. Pull too frequently may also have performance problems
    4. Since the files are stored in a local, easily lost
  • References:
    1. ITMUCH
    2. Sentinel WIKI
Push mode

Recommended by setting rules as the console will be pushed to the center of uniform rules, client implementation ReadableDataSourceinterface end center monitor real-time access rule changes , process is as follows:

  • The principle

    1. Console push rule to Nacos / Remote Configuration Center
    2. Sentinel client ships Nacos configuration changes, update the local cache
  • shared_center service processing

    1. Add dependent
      <dependency>
          <groupId>com.alibaba.csp</groupId>
          <artifactId>sentinel-datasource-nacos</artifactId>
      </dependency>
    1. Add Configuration
    spring:
      cloud:
        sentinel:
          datasource:
            sxzhongf_flow:
              nacos:
                server-addr: localhost:8848
                dataId: ${spring.application.name}-flow-rules
                groupId: SENTINEL_GROUP
                # 规则类型,取值见: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 processing

    Dashboard transformation rules mainly through two interfaces:

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

    • Download Sentinel Source Code

    • Modify the original sentinel-dashboardPOM file in the project

          <!-- for Nacos rule publisher sample -->
          <dependency>
              <groupId>com.alibaba.csp</groupId>
              <artifactId>sentinel-datasource-nacos</artifactId>
              <!--注释掉原文件中的scope,让其不仅在test的时候生效-->
              <!--<scope>test</scope>-->
          </dependency>
    • Lazy mode: copy sentinel-dashboardnacos package under the item under test (

      src/test/java/com/alibaba/csp/sentinel/dashboard/rule/nacosTo src/main/java/com/alibaba/csp/sentinel/dashboard/rulethe next

    • Modify the default controller provider & publisher

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

          @Autowired
          // @Qualifier("flowRuleDefaultProvider")
              @Qualifier("flowRuleNacosProvider")
          private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
          @Autowired
              // @Qualifier("flowRuleDefaultPublisher")
          @Qualifier("flowRuleNacosPublisher")
          private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;
    • Open the /Sentinel-1.6.2/sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.htmlfile, modify the code:

      <!--<li ui-sref-active="active">-->
                  <!--<a ui-sref="dashboard.flow({app: entry.app})">-->
                    <!--<i class="glyphicon glyphicon-filter"></i>&nbsp;&nbsp;流控规则 V1</a>-->
      <!--</li>-->
      
      ---
      
      改为
      
        <li ui-sref-active="active">
          <a ui-sref="dashboard.flow({app: entry.app})">
            <i class="glyphicon glyphicon-filter"></i>&nbsp;&nbsp;NACOS 流控规则 V1</a>
        </li>

    The Dashboard you want to modify the code has been good.

  • Restart the Sentinel-dashboard mvn clean package -DskipTests

  • Test results

    Sentinel add flow control rules:

    Nacos view the synchronization configuration:


Guess you like

Origin www.cnblogs.com/zhangpan1244/p/11228020.html