Sentinel规则配置之外部数据源

在前面的示例中,对于Sentinel的限流和熔断的规则都是通过硬编码实现的,在实际的开发过程中,我们都会选择外部配置的方式来定制规则。Sentinel为我们提供了sentinel-datasource-extension来实现规则的外部配置化,并能实现热更新。

首先我们需要引入对应的依赖包

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-extension</artifactId>
    <version>1.8.0</version>
</dependency>

该依赖包中源文件总共也就9个,其关系如下所示

Sentinel规则配置之外部数据源

其中的FileRefreshableDataSource可供我们读取外部的配置文件,并对文件的更新做监控。那么在代码中我们应该怎么使用呢?

/**
     * 格式:
     * [
     *   {
     *     "resource": "helloworld",
     *     "controlBehavior": 2,
     *     "count": 5,
     *     "grade": 1,
     *     "limitApp": "default",
     *     "strategy": 0
     *   }
     * ]
     * */
    public void flowRule() throws FileNotFoundException {
        // 保存了限流规则的文件的地址
        String flowRuleName = "flow-rule.json";
        //定义用于进行数据转换的对象
        Converter<String, List<FlowRule>> converter = new Converter<String, List<FlowRule>>(){
            /**
             * 将读取到的JSON数据转换为对应的对象
             * @param source 从数据源(本例是文件)读取到的数据
             * */
            @Override
            public List<FlowRule> convert(String source) {
                ObjectMapper  objectMapper = new ObjectMapper() ;
                try {
                    return objectMapper.readValue(source, new TypeReference<List<FlowRule>>(){}) ;
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            }
        } ;
        // 创建文件规则数据源
        FileRefreshableDataSource<List<FlowRule>> flowRuleDataSource
                = new FileRefreshableDataSource<List<FlowRule>>(flowRuleName, converter);
        // 将Property注册到 RuleManager 中去
        FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
    }

    public void degradeRule() throws FileNotFoundException {
        // 保存了熔断规则的文件的地址
        String degradeRuleRuleName = "degrade-rule.json";
        //定义用于进行数据转换的对象
        Converter<String, List<DegradeRule>> converter = new Converter<String, List<DegradeRule>>(){
            /**
             * 将读取到的JSON数据转换为对应的对象
             * @param source 从数据源(本例是文件)读取到的数据
             * */
            @Override
            public List<DegradeRule> convert(String source) {
                ObjectMapper  objectMapper = new ObjectMapper() ;
                try {
                    return objectMapper.readValue(source, new TypeReference<List<DegradeRule>>(){}) ;
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            }
        } ;
        // 创建文件规则数据源
        FileRefreshableDataSource<List<DegradeRule>> flowRuleDataSource
                = new FileRefreshableDataSource<List<DegradeRule>>(degradeRuleRuleName, converter);
        // 将Property注册到 DegradeRuleManager 中去
        DegradeRuleManager.register2Property(flowRuleDataSource.getProperty());
    }

当然,以上的代码应该在系统初始化的时候运行,以免在执行限流时找不到对应的规则。至于是如何实现规则的热更新的,只需要从FlowRuleManager.register2Property方法入手跟踪源码便知,相对简单。


除了使用文件外,Sentinel还提供了其它的一些拓展供大家直接使用,看如下的这些依赖包便能知道是做什么的了,期原理和上面是一致的,在这就不缀诉了。

    <!-- 从nacos中拉取规则的配置 -->
    <dependency>
      <groupId>com.alibaba.csp</groupId>
      <artifactId>sentinel-datasource-nacos</artifactId>
      <version>1.8.0</version>
    </dependency>
    <!-- 从apollo中拉取规则的配置 -->
    <dependency>
      <groupId>com.alibaba.csp</groupId>
      <artifactId>sentinel-datasource-apollo</artifactId>
      <version>1.8.0</version>
    </dependency>
    <!-- 从zookeeper中拉取规则的配置 -->
    <dependency>
      <groupId>com.alibaba.csp</groupId>
      <artifactId>sentinel-datasource-zookeeper</artifactId>
      <version>1.8.0</version>
    </dependency>
    <!-- 从consul中拉取规则的配置 -->
    <dependency>
      <groupId>com.alibaba.csp</groupId>
      <artifactId>sentinel-datasource-consul</artifactId>
      <version>1.8.0</version>
    </dependency>
    <!-- 从redis中拉取规则的配置 -->
    <dependency>
      <groupId>com.alibaba.csp</groupId>
      <artifactId>sentinel-datasource-redis</artifactId>
      <version>1.8.0</version>
    </dependency>

Sentinel规则配置之外部数据源

猜你喜欢

转载自blog.51cto.com/dengshuangfu/2545297