你只差这两步 | 将Sentinel 控制台应用于生产环境

简介:

knchmfsv

这是围绕 Sentinel 的使用场景、技术对比和实现、开发者实践等维度推出的系列文章的第四篇。

  • 第一篇回顾:

Dubbo 的流量防卫兵 | Sentinel如何通过限流实现服务的高可用性 - 传送门

  • 第二篇回顾:

RocketMQ 的保险丝| Sentinel 如何通过匀速请求和冷启动来保障服务的稳定性 - 传送门

  • 第三篇回顾:

技术选型:Sentinel vs Hystrix - 传送门

Sentinel 是阿里中间件团队研发的面向分布式服务架构的轻量级高可用流量控制组件,于今年7月正式开源。Sentinel 主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户提升服务的稳定性。

Sentinel 项目地址:

https://github.com/alibaba/Sentinel

Sentinel 控制台作为 Sentinel 的一大利器,提供了多个维度的监控和规则配置功能。Sentinel 客户端目前已可用于生产环境,但若希望在生产环境中使用 Sentinel 控制台还需要进行一些改造。本文将介绍如何对 Sentinel 控制台进行改造以便在生产环境中使用。

在生产环境中使用 Sentinel 控制台只需要两步改造:

  1. 改造推送逻辑,支持向规则数据源进行推送
  2. 改造监控逻辑,支持监控数据持久化

动态规则数据源

Sentinel 的动态规则数据源用于从中读取及写入规则。从 0.2.0 版本开始,Sentinel 将动态规则数据源分为两种类型:读数据源(ReadableDataSource)和写数据源(WritableDataSource):

  • 读数据源仅负责监听或轮询读取远程存储的变更。
  • 写数据源仅负责将规则变更写入到规则源中。

其中读数据源常见的实现方式有:

  • pull 模式:客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件 等。这样做的方式是简单,缺点是可能无法及时获取变更,拉取过于频繁也可能会有性能问题。
  • push 模式:规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。

在实际的场景中,不同的存储类型对应的数据源类型也不同。对于 push 模式的数据源,一般不支持写入;而 pull 模式的数据源则是可写的。

下面我们分别来分析一下它们结合 Sentinel 控制台的使用场景,以及相应的需要改造的点。

| 原始情况

若应用未注册任何数据源,直接从 Sentinel 控制台推送规则的过程非常简单:

Original push rules from Sentinel Dashboard

Sentinel 控制台通过 API 将规则推送至客户端并直接更新到内存中。这种情况下应用重启规则就会消失,仅用于简单测试,不能用于生产环境。一般在生产环境中,我们需要在应用端配置规则数据源。

| pull 模式的数据源

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

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 控制台推送规则。以本地文件数据源为例,推送过程如下图所示:

Push rules from Sentinel Dashboard to local file

首先 Sentinel 控制台通过 API 将规则推送至客户端并更新到内存中,接着注册的写数据源会将新的规则保存到本地的文件中。使用 pull 模式的数据源时一般不需要对 Sentinel 控制台进行改造。

| push 模式的数据源

对于 push 模式的数据源(如远程配置中心),推送的操作不应由 Sentinel 数据源进行,而应该经控制台进行推送,数据源仅负责获取配置中心推送的配置并更新到本地。

假设写入的操作也由数据源进行,那么 Sentinel 客户端收到控制台推送的规则后,将新的规则更新到内存中,同时将规则推送至远程的配置中心。此时,数据源监听到配置中心推送过来的新规则,又一次更新到内存中。也就是说应用在本地更新完规则并推送到远程后,又要接收变更并更新一次,这样显然是不合理的。因此推送规则正确做法应该是 配置中心控制台/Sentinel 控制台 → 配置中心 → Sentinel 数据源 → Sentinel,而不是经 Sentinel 数据源推送至配置中心。这样的流程就非常清晰了:

Remote push rules to config center

注意由于不同的生产环境可能使用不同的数据源,从 Sentinel 控制台推送至配置中心的实现需要用户自行改造。以 ZooKeeper 为例,我们可以按照如下步骤进行改造(假设推送维度为应用维度):

  1. 实现一个公共的 ZooKeeper 客户端用于推送规则,在 Sentinel 控制台配置项中需要指定 ZooKeeper 的地址,启动时即创建 ZooKeeper Client。
  2. 我们需要针对每个应用(appName),每种规则设置不同的 path(可随时修改);或者约定大于配置(如 path 的模式统一为 /sentinel_rules/{appName}/{ruleType},e.g. sentinel_rules/appA/flowRule)。
  3. 规则配置页需要进行相应的改造,直接针对应用维度进行规则配置;修改同个应用多个资源的规则时可以批量进行推送,也可以分别推送。Sentinel 控制台将规则缓存在内存中(如 InMemFlowRuleStore),可以对其进行改造使其支持应用维度的规则缓存(key 为 appName),每次添加/修改/删除规则都先更新内存中的规则缓存,然后需要推送的时候从规则缓存中获取全量规则,然后通过上面实现的 Client 将规则推送到 ZooKeeper 即可。
  4. 应用客户端需要注册对应的读数据源以监听变更,可以参考 相关文档

监控数据持久化

Sentinel 会记录资源访问的秒级数据(若没有访问则不进行记录)并保存在本地日志中,具体格式请见 秒级监控日志文档。Sentinel 控制台通过 Sentinel 客户端预留的 API 从秒级监控日志中拉取监控数据,并进行聚合。目前 Sentinel 控制台中监控数据聚合后直接存在内存中,未进行持久化,且仅保留最近 5 分钟的监控数据。若需要监控数据持久化的功能,可以自行扩展实现 MetricsRepository 接口(0.2.0 版本),然后注册成 Spring Bean 并在相应位置通过 @Qualifier 注解指定对应的 bean name 即可。MetricsRepository 接口定义了以下功能:

  • savesaveAll:存储对应的监控数据
  • queryByAppAndResourceBetween:查询某段时间内的某个应用的某个资源的监控数据
  • listResourcesOfApp:查询某个应用下的所有资源

其中默认的监控数据类型为 MetricEntity,包含应用名称、时间戳、资源名称、异常数、请求通过数、请求 block 数、平均响应时间等信息。

同时用户可以自行进行扩展,适配 Grafana 等可视化平台,以便将监控数据更好地进行可视化。

其它

在生产环境中使用 Sentinel 控制台还需要考虑以下问题:

  • 权限控制:生产环境下的权限控制是非常重要的,理论上只有 AppOps 或管理员才有权限去修改对应应用的规则。Sentinel 控制台不提供权限控制功能,需要开发者自行进行改造。

同时也可以到 Awesome Sentinel 去参考社区用户的一些扩展和解决方案,也欢迎大家将一些比较好的扩展实现添加进来。

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
7月前
|
运维 监控 安全
深入探讨Sentinel:应对现代应用的流量管理神器
在现代应用开发中,流量管理和监控变得愈发重要。随着用户规模的增长以及应用的不断演进,如何保证应用的稳定性、性能和安全性成为了一项关键挑战。Sentinel,作为一款强大的流量管理工具,已经在众多互联网巨头和开源社区中得到广泛应用。本文将深入探讨Sentinel,介绍它的核心概念、功能和用途,以及为什么它是现代应用不可或缺的一部分。
|
9月前
phpstorm插件应用:Test RESTful WEB Service 控制台接口调试工具
phpstorm插件应用:Test RESTful WEB Service 控制台接口调试工具
117 0
|
运维 Kubernetes Linux
【Kubernetes】 Dashboard 控制台web部署应用
相比kubectl命令和yaml文件配置部署,图形化部署更简单,但是作为k8s运维,还是需要掌握yaml编写配置
835 0
【Kubernetes】 Dashboard 控制台web部署应用
|
28天前
|
Web App开发 缓存 运维
应用研发平台EMAS产品常见问题之emas控制台访问非常慢如何解决
应用研发平台EMAS(Enterprise Mobile Application Service)是阿里云提供的一个全栈移动应用开发平台,集成了应用开发、测试、部署、监控和运营服务;本合集旨在总结EMAS产品在应用开发和运维过程中的常见问题及解决方案,助力开发者和企业高效解决技术难题,加速移动应用的上线和稳定运行。
|
5月前
|
存储 监控 API
微服务轮子项目(18) -Alibaba Sentinel限流熔断(生产应用)
微服务轮子项目(18) -Alibaba Sentinel限流熔断(生产应用)
61 0
|
6月前
|
监控 Java API
sentinel 控制台用法
sentinel 控制台用法
54 0
|
Sentinel
通俗易懂的阿里Sentinel源码分析:如何向控制台发送心跳包?
// 在Env类的静态代码块中, // 触发了一系列初始化操作, // 其中就包括发送心跳包的初始化。 // 如果Env类一直没有被用到, // 那么不会触发该初始操作。 // 这也印证了官方的“确保客户端有访问量, // 才开始向控制台发送心跳包”的说法, // 因为有访问量就会用到Env类。
385 0
|
存储 监控 前端开发
【深入浅出Sentinel原理及实战】「基础实战专题」零基础探索分析Sentinel控制台开发指南(3)
【深入浅出Sentinel原理及实战】「基础实战专题」零基础探索分析Sentinel控制台开发指南(3)
174 0
【深入浅出Sentinel原理及实战】「基础实战专题」零基础探索分析Sentinel控制台开发指南(3)
.Net Core控制台应用程序使用定时器
.Net Core控制台应用程序使用定时器
274 0
.Net Core控制台应用程序使用定时器
|
SQL 移动开发 监控
Sentinel控制台规则配置
Sentinel控制台规则配置
Sentinel控制台规则配置

热门文章

最新文章