美文网首页
Sentinel(一)规则配置

Sentinel(一)规则配置

作者: QuinnSun | 来源:发表于2020-06-16 17:56 被阅读0次

    3种规则配置方式

    硬编码

    sentinel的每种RuleManager提供了API来修改规则(loadRules)

    例如:

    FlowRuleManager.loadRules(List<FlowRule> rules); // 修改流控规则
    DegradeRuleManager.loadRules(List<DegradeRule> rules); // 修改降级规则
    

    DataSource-pull(拉模式)

    • 自定义拉取规则:可以继承 AutoRefreshDataSource 抽象类,然后实现 readSource() 方法,在该方法里从指定数据源读取字符串格式的配置数据。

    • 官方提供了使用文件配置规则的方式

    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-datasource-extension</artifactId>
        <version>x.y.z</version>
    </dependency>
    

    接入方式:

    private void init() throws Exception {
        // 保存了限流规则的文件的地址
        String flowRuleName = yourFlowRuleFileName();
        Converter<String, List<FlowRule>> parser = source -> JSON.parseObject(source,new TypeReference<List<FlowRule>>() {});
        // 创建文件规则数据源
        FileRefreshableDataSource<List<FlowRule>> flowRuleDataSource = new FileRefreshableDataSource<>(flowRuleName, parser);
        // 将Property注册到 RuleManager 中去
        FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
    }
    

    FileRefreshableDataSource 会周期性的读取文件以获取规则,当文件有更新时会及时发现,并将规则更新到内存中。

    DataSource-push(推模式)

    实现推模式的数据源最简单的方式是继承 AbstractDataSource 抽象类,在其构造方法中添加监听器,并实现 readSource() 从指定数据源读取字符串格式的配置数据。

    • 官方提供4种规则中心
    • redis
    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-datasource-redis</artifactId>
        <version>x.y.z</version>
    </dependency>
    

    接入方式:

    private void init() throws Exception {
        String redisHost = yourRedisHost();
        String redisPort = yourRedisPort();
        String ruleKey = yourRuleKey();
        String channel = yourChannel();
        Converter<String, List<FlowRule>> parser = source -> JSON.parseObject(source,new TypeReference<List<FlowRule>>() {});
        RedisConnectionConfig config = RedisConnectionConfig.builder()
            .withHost(redisHost)
            .withPort(redisPort)
            .build();
        ReadableDataSource<String, List<FlowRule>> redisDataSource = new RedisDataSource<>(config, ruleKey, channel, parser);
        FlowRuleManager.register2Property(redisDataSource.getProperty());
    }
    
    • nacos
    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-datasource-nacos</artifactId>
        <version>x.y.z</version>
    </dependency>
    

    接入方式:

    private void init() throws Exception {
        String remoteAddress = yourRemoteAddress();
        String groupId = yourGroupId();
        String dataId = yourDataId();
        Converter<String, List<FlowRule>> parser = source -> JSON.parseObject(source,new TypeReference<List<FlowRule>>() {});
        ReadableDataSource<String, List<FlowRule>> nacosDataSource = new NacosDataSource<>(remoteAddress, groupId, dataId, parser);
        FlowRuleManager.register2Property(nacosDataSource.getProperty());
    }
    
    • ZK
    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-datasource-zookeeper</artifactId>
        <version>x.y.z</version>
    </dependency>
    

    接入方式:

    private void init() throws Exception {
        String remoteAddress = yourRemoteAddress();
        String path = yourPath();
        Converter<String, List<FlowRule>> parser = source -> JSON.parseObject(source,new TypeReference<List<FlowRule>>() {});
        ReadableDataSource<String, List<FlowRule>> zookeeperDataSource = new ZookeeperDataSource<>(remoteAddress, path, parser);
        FlowRuleManager.register2Property(zookeeperDataSource.getProperty());
    }
    
    • Apollo
    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-datasource-apollo</artifactId>
        <version>x.y.z</version>
    </dependency>
    

    接入方式:

    private void init() throws Exception {
        String namespaceName = yourNamespaceName();
        String ruleKey = yourRuleKey();
        String defaultRules = yourDefaultRules();
        Converter<String, List<FlowRule>> parser = source -> JSON.parseObject(source,new TypeReference<List<FlowRule>>() {});
        ReadableDataSource<String, List<FlowRule>> apolloDataSource = new ApolloDataSource<>(namespaceName, ruleKey, path, defaultRules);
        FlowRuleManager.register2Property(apolloDataSource.getProperty());
    }
    

    相关文章

      网友评论

          本文标题:Sentinel(一)规则配置

          本文链接:https://www.haomeiwen.com/subject/xvhrxktx.html