SpringCloudAlibaba之Sentinel-规则管理及推送模式(pull&push)(上)

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
简介: SpringCloudAlibaba之Sentinel-规则管理及推送模式(pull&push)

1 拉(pull)模式

1.1 架构设计


该模式的数据源(如本地文件、RDBMS 等)一般可写入。使用时需在客户端注册数据源:将对应读数据源注册至对应的 RuleManager,将写数据源注册至 transportWritableDataSourceRegistry 中。

以本地文件数据源为例:

public class FileDataSourceInit implements InitFunc {
    @Override
    public void init() throws Exception {
        String flowRulePath = "xxx";
        ReadableDataSource<String, List<FlowRule>> ds = new FileRefreshableDataSource<>(
            flowRulePath, source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {})
        );
        // 将可读数据源注册至 FlowRuleManager.
        FlowRuleManager.register2Property(ds.getProperty());
        WritableDataSource<List<FlowRule>> wds = new FileWritableDataSource<>(flowRulePath, this::encodeJson);
        // 将可写数据源注册至 transport 模块的 WritableDataSourceRegistry 中.
        // 这样收到控制台推送的规则时,Sentinel 会先更新到内存,然后将规则写入到文件中.
        WritableDataSourceRegistry.registerFlowDataSource(wds);
    }
    private <T> String encodeJson(T t) {
        return JSON.toJSONString(t);
    }
}

本地文件数据源会定时轮询文件的变更,读取规则。这样我们既可以在应用本地直接修改文件来更新规则,也可以通过 Sentinel 控制台推送规则。以本地文件数据源为例,推送过程如下图所示:

image.png


1.2 执行流程


  • FileRefreshableDataSource 定时从指定文件中读取规则JSON文件【上图:本地文件】,如果发现文件发生变化,就更新规则缓存。
  • FileWritableDataSource 接收控制台规则推送,并根据配置,修改规则JSON文件【图中的本地文件】。


1.3 代码实战

1.3.1 添加依赖

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

1.3.2 Java代码

image.png


1.3.3 配置

在项目的 resources/META-INF/services 目录下创建文件

命名为:com.alibaba.csp.sentinel.init.InitFunc


image.png


1.4 优缺点分析


  • 优点

简单

不会引入新的依赖

  • 缺点,无法保证监控数据的一致性:

由于规则是用 FileRefreshableDataSource 定时更新,所以规则更新会有延迟。如果FileRefreshableDataSource定时时间过大,可能长时间延迟;如果FileRefreshableDataSource过小,又会影响性能

规则存储在本地文件,如果有一天需要迁移微服务,那么需要把规则文件一起迁移,否则规则会丢失。


2 推(Push)模式    


2.1 架构设计

生产环境下更常用 push 模式的数据源

对于 push 模式的数据源,如远程配置中心(ZooKeeper, Nacos, Apollo等),推送操作不应由 Sentinel 客户端进行,而应该经控制台统一管理,直接推送。

数据源仅负责获取配置中心推送的配置并更新到本地。因此推送规则正确做法应该是

配置中心控制台/Sentinel 控制台 → 配置中心 → Sentinel 数据源 → Sentinel

而非经 Sentinel 数据源推至配置中心。

所以可得如下设计:

image.png

image.png


ZooKeeper 为例,若使用第三方配置中心作为配置管理,需做如下事项:


实现一个公共的 ZooKeeper 客户端用于推送规则,在 Sentinel 控制台配置项中需要指定 ZooKeeper 的地址,启动时即创建 ZooKeeper Client


针对每个应用(appName),每种规则设置不同的 path(可随时修改);或者约定大于配置(如 path 的模式统一为 /sentinel_rules/{appName}/{ruleType},e.g. sentinel_rules/appA/flowRule)


规则配置页需要进行相应的改造,直接针对应用维度进行规则配置;修改同个应用多个资源的规则时可以批量进行推送,也可以分别推送。Sentinel 控制台将规则缓存在内存中(如 InMemFlowRuleStore),可以对其进行改造使其支持应用维度的规则缓存(key 为 appName),每次添加/修改/删除规则都先更新内存中的规则缓存,然后需要推送的时候从规则缓存中获取全量规则,然后通过上面实现的 Client 将规则推送到 ZooKeeper 即可


应用客户端需要注册对应的读数据源以监听变更

从 Sentinel 1.4.0 开始,Sentinel 控制台提供 DynamicRulePublisher 和 DynamicRuleProvider 接口用于实现应用维度的规则推送和拉取,并提供了相关的示例。Sentinel 提供应用维度规则推送的示例页面(/v2/flow),用户改造控制台对接配置中心后可直接通过 v2 页面推送规则至配置中心。


部署多个控制台实例时,通常需要将规则存至 DB 中,规则变更后同步向配置中心推送规则。

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
7月前
|
监控 API 开发者
Sentinel之道:流控模式解析与深度探讨
Sentinel之道:流控模式解析与深度探讨
180 0
|
SpringCloudAlibaba 监控 Dubbo
SpringCloudAliBaba篇 之 Sentinel:图解分布式系统的流量防卫兵(上)
SpringCloudAliBaba篇 之 Sentinel:图解分布式系统的流量防卫兵
556 0
|
6月前
|
运维 监控 NoSQL
Redis Sentinel哨兵模式部署
Redis Sentinel哨兵模式部署
122 2
|
5月前
|
监控 算法 Java
高并发架构设计三大利器:缓存、限流和降级问题之配置Sentinel的流量控制规则问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之配置Sentinel的流量控制规则问题如何解决
|
7月前
|
监控 Java 数据安全/隐私保护
Sentinel黑白名单授权规则解读
Sentinel黑白名单授权规则解读
|
6月前
|
SpringCloudAlibaba Java 开发者
SpringCloudAlibaba之Sentinel简单使用
高频率刷新,可以看到hello world、fallback、block handler都会出现。
62 0
|
7月前
|
SpringCloudAlibaba Rust 监控
SpringCloudAlibaba:5.1Sentinel的基本使用
SpringCloudAlibaba:5.1Sentinel的基本使用
120 0
|
缓存 SpringCloudAlibaba Linux
SpringCloudAliBaba篇 之 Sentinel:图解分布式系统的流量防卫兵(下)
SpringCloudAliBaba篇 之 Sentinel:图解分布式系统的流量防卫兵
114 0
|
7月前
|
监控 数据挖掘 索引
深度剖析Sentinel热点规则
深度剖析Sentinel热点规则
227 1
|
7月前
|
监控 Java API
解密Sentinel中流控规则的阀值奥秘
解密Sentinel中流控规则的阀值奥秘
67 0
解密Sentinel中流控规则的阀值奥秘
下一篇
DataWorks