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

摘要: 这是围绕 Sentinel 的使用场景、技术对比和实现、开发者实践等维度推出的系列文章的第四篇。 第一篇回顾:Dubbo 的流量防卫兵 | Sentinel如何通过限流实现服务的高可用性 - 传送门 第二篇回顾:RocketMQ 的保险丝| Sentinel 如何通过匀速请求和冷启动来保障服务的稳定性 - 传送门 第三篇回顾:技术选型:Sentinel vs Hystrix - 传送门 Sentinel 是阿里中间件团队研发的面向分布式服务架构的轻量级高可用流量控制组件,于今年7月正式开源。

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

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

Sentinel 项目地址:

https://github.com/alibaba/Sentinel

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

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

改造推送逻辑,支持向规则数据源进行推送
改造监控逻辑,支持监控数据持久化
动态规则数据源
Sentinel 的动态规则数据源用于从中读取及写入规则。从 0.2.0 版本开始,Sentinel 将动态规则数据源分为两种类型:读数据源(ReadableDataSource)和写数据源(WritableDataSource):

读数据源仅负责监听或轮询读取远程存储的变更。
写数据源仅负责将规则变更写入到规则源中。
其中读数据源常见的实现方式有:

pull 模式:客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件 等。这样做的方式是简单,缺点是可能无法及时获取变更,拉取过于频繁也可能会有性能问题。
push 模式:规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。
在实际的场景中,不同的存储类型对应的数据源类型也不同。对于 push 模式的数据源,一般不支持写入;而 pull 模式的数据源则是可写的。

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

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

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

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

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

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

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

save 与 saveAll:存储对应的监控数据
queryByAppAndResourceBetween:查询某段时间内的某个应用的某个资源的监控数据
listResourcesOfApp:查询某个应用下的所有资源
其中默认的监控数据类型为 MetricEntity,包含应用名称、时间戳、资源名称、异常数、请求通过数、请求 block 数、平均响应时间等信息。

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

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

权限控制:生产环境下的权限控制是非常重要的,理论上只有 AppOps 或管理员才有权限去修改对应应用的规则。Sentinel 控制台不提供权限控制功能,需要开发者自行进行改造。
同时也可以到 Awesome Sentinel 去参考社区用户的一些扩展和解决方案,也欢迎大家将一些比较好的扩展实现添加进来。

原文链接

本文为云栖社区原创内容,未经允许不得转载。

原文地址:http://blog.51cto.com/13952056/2287640

时间: 2024-10-31 07:19:36

你只差这两步 | 将Sentinel 控制台应用于生产环境的相关文章

应对IBM V7000磁盘故障,你只差这一步!

一.IBM V7000简要: 第一个IBM自主研发的中端存储2.0产品,架构上突破传统,吸收了DS和IBM横向扩展架构XIV的精华. 第一次集"EasyTier自动分层""虚拟化""精简调配"三大存储效率于一身的磁盘阵列,使IBM Storwize V7000当之无愧的成为更加看重存储效率的中端存储市场上的杀手级产品. 第一次把DS8000的RAID技术和自动分层.SVC虚拟化架构以及XIV的赏心悦目的管理界面等高端存储上的技术用在中端存储上,拥

用Python实现一个端口扫描,只需简单几步就好

一.常见端口扫描的原理 0.秘密扫描 秘密扫描是一种不被审计工具所检测的扫描技术. 它通常用于在通过普通的防火墙或路由器的筛选(filtering)时隐藏自己. 秘密扫描能躲避IDS.防火墙.包过滤器和日志审计,从而获取目标端口的开放或关闭的信息.由于没有包含TCP 3次握手协议的任何部分,所以无法被记录下来,比半连接扫描更为隐蔽. 但是这种扫描的缺点是扫描结果的不可靠性会增加,而且扫描主机也需要自己构造IP包.现有的秘密扫描有TCP FIN扫描.TCP ACK扫描.NULL扫描.XMAS扫描和

快速体验 Sentinel 集群限流功能,只需简单几步

? Pic by Alibaba Tech on Facebook 集群限流 可以限制某个资源调用在集群内的总 QPS,并且可以解决单机流量不均导致总的流控效果不佳的问题,是保障服务稳定性的利器. Sentinel 从 1.4.0 版本开始提供集群流控特性,但使用 Sentinel 集群限流需要对一系列的动态数据源进行相关配置,并且需要对开源控制台进行一些改造,有一定的使用成本.为了大家更好地理解集群流控并快速地使用,我们提供了云上版本的 Sentinel 集群限流控制台示例.只需要简单的几步即

从投资小白到理财高手 只差三步

投资理财原本被认为是有钱人的事,不过随着观念的改变,理财也"飞入寻常百姓家".理财的收益让人心动,它的风险却让人畏惧,对于理财小白们来说,理财让人又爱又惧.那么,作为投资小白,怎么成为理财高手呢?一起来听听妙资财富理财师是怎么说吧! 财富体检 妙资财富理财师建议,在投资理财之前,先得寻找专业的理财机构做一次"家庭财富体检",而非急匆勿选择某某理财产品.许多人常常意识不到家庭财富体验的重要性.什么是家庭财富体检呢?对个人的财务状况进行全面的梳理和摸底,了解个人全部资产

只需两步快速获取微信小程序源码

只需两步快速获取微信小程序源码 第一次在掘金这样高大上的社区写文章,忐忑地敲下我获取小程序源码过程中的经验分享. 最近在学习微信小程序开发,半个月学习下来,很想实战一下踩踩坑,于是就仿写了某个小程序的前端实现,过程一言难尽,差不多两周时间过去了,发现小程序的坑远比想象的要多的多!!在实际练手中,完全是黑盒的,纯靠推测,部分效果在各种尝试后能能做出大致的实现,但是有些细节,实在不知道如何去实现.这种时候,真的很想一窥源码,查看究竟,看看大厂的前端大神们是如何规避了小程序的一些比较奇葩的坑. 于是就

只需两步!Eclipse+Maven快速构建第一个Spring Boot项目

随着使用Spring进行开发的个人和企业越来越多,Spring从一个单一简洁的框架变成了一个大而全的开源软件,最直观的变化就是Spring需要引入的配置也越来越多.配置繁琐,容易出错,让人无比头疼,简化Spring配置简直可以说是民心所向. Spring Boot是由Pivotal团队提供的一个基于Java的全新的开源框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.如今,Spring Boot逐渐成为快

挑子学习笔记:两步聚类算法(TwoStep Cluster Algorithm)——改进的BIRCH算法

转载请标明出处:http://www.cnblogs.com/tiaozistudy/p/twostep_cluster_algorithm.html 两步聚类算法是在SPSS Modeler中使用的一种聚类算法,是BIRCH层次聚类算法的改进版本.可以应用于混合属性数据集的聚类,同时加入了自动确定最佳簇数量的机制,使得方法更加实用.本文在学习文献[1]和“IBM SPSS Modeler 15 Algorithms Guide”的基础上,融入了自己的理解,更详尽地叙述两步聚类算法的流程和细节.

两步轻松解决ASP.NETWebAPI跨域问题77757bf

青挎⒔ 痖沱收政 议狙娶 同为白衣的大魔头洛阳也没有看到种神通有出手的迹象倒是瞥见种檀这龟儿子眼神促狭 欣美盗 硎嚅楱侣 贫幔跑的 淫舛タ翦 夸恋漆 颀瘭铝捏 眺望而去云层厚重层层铺叠直直下坠好似就要压在了城中极有九天之云下垂的气 旱門欄膳九綻盜庸妓磐約路了灰沼 ㄑ陋马聚 碧玉质地的纤细长竿在一群杀气腾腾的武将中也毫不怯场在沙盘上画了一个大圈朗声 厮鲣毡 :"谁都知道那位老凉王嫡长子早年世子殿下当得很混帐纨绔混帐了十来年恶名昭彰 樨挟燠舒 终于步上山顶陈锡亮遥望北方苦涩道:"

我们与上帝的距离只差一台量子计算机

我们与上帝的距离只差一台量子计算机 上帝啊上帝,你能不能创造出一块自己搬不起来的石头?上帝笑而不语,默默的掏出了一台量子计算机. 扎克伯格君是科技圈的大拿(之一),作为Facebook帝国的帝王,上个科技新闻的头版头条再自然不过,然而最近我们却发现,他似乎还有意攻占除了科技频道之外的所有新闻版块. 上周他用捐巨款的方式占领了社会新闻的高地,而这一次,他又用另一张看似漫不经心的照片引爆了朋友圈? ▲“你以为我是在炫父爱,其实我是在秀智商” 孩子还未满一个月,小扎就已经在给她讲量子物理了!!!某种程