• 1 规则

Sentinel 追求开发者只需关注资源的定义,当资源定义成功后,可动态增加各种流控降级规则。

Sentinel 提供两种方式修改规则:

  • API 直接修改 (loadRules)
  • 通过 DataSource 适配不同数据源修改

手动 API 修改较直观,可通过以下 API 修改不同规则:

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

手动修改规则(硬编码)仅用于测试和演示,生产一般通过动态规则源来动态管理规则。

2 DataSource 扩展

loadRules() 方法只接受内存态的规则对象,但更多时候规则存储在文件、数据库或配置中心。

DataSource 接口提供对接任意配置源的能力,是更可靠做法。

推荐通过控制台设置规则后将规则推送到统一的规则中心,客户端实现 ReadableDataSource 接口端监听规则中心实时获取变更

2.1 工作流程

2.2 DataSource扩展实现方式

拉模式

客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件,甚至是 VCS 等。这样做的方式是简单,缺点是无法及时获取变更。

拉模式拓展

实现拉模式的数据源最简单的方式是继承 AutoRefreshDataSource 抽象类,然后实现 readSource() 方法,在该方法里从指定数据源读取字符串格式的配置数据。比如 基于文件的数据源

推模式

规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,如用Nacos配置中心,有更好的实时性和一致性保证。

Sentinel 目前支持的数据源扩展:

推模式拓展

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

控制台通常需要做一些改造来直接推送应用维度的规则到配置中心。功能示例可以参考 AHAS Sentinel 控制台的规则推送功能。改造指南可以参考 在生产环境中使用 Sentinel 控制台

2.3 注册数据源

通常需要调用以下方法将数据源注册至指定的规则管理器中:

ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new NacosDataSource<>(remoteAddress, groupId, dataId, parser);
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());

若不希望手动注册数据源,可以借助 Sentinel 的 InitFunc SPI 扩展接口。只需要实现自己的 InitFunc 接口,在 init 方法中编写注册数据源的逻辑。比如:

package com.test.init;

public class DataSourceInitFunc implements InitFunc {

    @Override
    public void init() throws Exception {
        final String remoteAddress = "localhost";
        final String groupId = "Sentinel:Demo";
        final String dataId = "com.alibaba.csp.sentinel.demo.flow.rule";

        ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new NacosDataSource<>(remoteAddress, groupId, dataId,
            source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {}));
        FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
    }
}

接着将对应的类名添加到位于资源目录(通常是 resource 目录)下的 META-INF/services 目录下的 com.alibaba.csp.sentinel.init.InitFunc 文件中,如:

com.test.init.DataSourceInitFunc

这样,当初次访问任意资源的时候,Sentinel 就可以自动去注册对应的数据源了。

3 示例

3.1 API 模式:使用客户端规则 API 配置规则

Sentinel Dashboard 通过客户端自带的规则 API来实时查询和更改内存中的规则。

要使客户端具备规则 API,需在客户端引入依赖:

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
    <version>x.y.z</version>
</dependency>

3.2 拉模式:使用文件配置规则

这个示例展示 Sentinel 是如何从文件获取规则信息的。FileRefreshableDataSource 会周期性的读取文件以获取规则,当文件有更新时会及时发现,并将规则更新到内存中。使用时只需添加以下依赖:

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

3.3 推模式:使用 Nacos 配置规则

Sentinel 针对 Nacos 作适配,底层可采用 Nacos 作为规则配置数据源。使用时只需添加以下依赖:

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
    <version>1.8.6</version>
</dependency>

创建 NacosDataSource 并将其注册至对应的 RuleManager。如:

// remoteAddress 代表 Nacos 服务端的地址
// groupId 和 dataId 对应 Nacos 中相应配置
ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new NacosDataSource<>(remoteAddress, groupId, dataId,
    source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {}));
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());

如希望初始化 Nacos 数据源时携带更多配置(如鉴权配置),可通过带 Properties 的构造函数进行传入。

详细示例参见 sentinel-demo-nacos-datasource

3.4 推模式:使用 ZooKeeper 配置规则

Sentinel针对zk适配,底层可用 zk 作规则配置数据源。只需添加依赖:

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

再创建 ZookeeperDataSource 并将其注册至对应的RuleManager,如:

// remoteAddress 代表 ZooKeeper 服务端的地址
// path 对应 ZK 中的数据路径
ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new ZookeeperDataSource<>(remoteAddress, path, source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {}));
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());

详细示例可以参见 sentinel-demo-zookeeper-datasource