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

这是围绕 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 控制台推送规则的过程非常简单:

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

| pull 模式的数据源

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

public class FileDataSourceInit implements InitFunc {@Overridepublic 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 为例,我们可以按照如下步骤进行改造(假设推送维度为应用维度):

  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 接口定义了以下功能:

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

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

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

其它

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

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

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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/520921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

eclipse分级,分级列表显示 - bieshixuan的个人博客 - OSCHINA - 中文开源技术交流社区...

这是个效果图设计思想是&#xff0c;使用左右两个tableview分别展示NSArray * _allArr;NSMutableArray * _rightArr;UITableView * _leftTableView;UITableView * _rightTableView;初始化_arr [{"全部":[ "棉花", "小麦", "水稻", &q…

分布式消息规范 OpenMessaging 1.0.0-preview 发布

OpenMessaging 是由阿里巴巴牵头发起&#xff0c;由 Yahoo、滴滴、Streamlio、微众银行、Datapipeline 等公司共同发起创建的分布式消息规范&#xff0c;其目标在于打造厂商中立&#xff0c;面向 Cloud Native &#xff0c;同时对流计算以及大数据生态友好的下一代分布式消息标…

腾讯云重磅发布系列自研产品,自研服务器星星海为云而生

今日在腾讯全球数字生态大会成都峰会上&#xff0c;腾讯云重磅发布系列自研产品&#xff0c;包括腾讯自研第四代数据中心T-block产品家族、第一款真正为云而生的自研服务器“星星海”等基础产品&#xff0c;结合现场发布的弹性容器服务、无服务器等自研产品&#xff0c;腾讯云正…

wsimport将wsdl生成java 调用时碰到的一个问题Could not initialize Service

在一个采用了XFire作为WebService框架Web项目中&#xff0c;添加由JDK1.6 wsimport命令生成的一个WebService客户端调用&#xff0c;在客户端调用时出现了如下问题 log4j:WARN No appenders could be found for logger (org.codehaus.xfire.jaxws.Provider). log4j:WARN Pleas…

服务化改造实践(二)| Dubbo + Kubernetes

“没有最好的技术&#xff0c;只有最合适的技术。”我想这句话也同样适用于微服务领域&#xff0c;没有最好的服务框架&#xff0c;只有最适合自己的服务改造。在Dubbo的未来规划中&#xff0c;除了保持自身技术上的领先性&#xff0c;关注性能&#xff0c;大流量&#xff0c;大…

电子技术基础数字部分第六版_大部分数字图书馆技术特点与应用分析

数字图书馆是一个开放式的硬件和软件的集成平台&#xff0c;通过对技术和产品的集成&#xff0c;把当前大量的各种文献载体数字化&#xff0c;将它们组织起来在网上服务。从理论上讲&#xff0c;数字图书馆是一种引入管理和应用数字化技术的方法&#xff0c;它的主要特点有&…

腾讯云与智慧产业总裁汤道生:产业互联网是一场“持久战”

“产业互联网是一场‘持久战’&#xff0c;腾讯希望和合作伙伴一起参与转型&#xff0c;让每一个产业都变身为智慧产业&#xff0c;实现数字化、网络化和智能化。”10月29日&#xff0c;在腾讯全球数字生态大会成都峰会上&#xff0c;腾讯公司高级执行副总裁、云与智慧产业事业…

NLP领域中更有效的迁移学习方法

在深度学习领域&#xff0c;迁移学习&#xff08;transfer learning&#xff09;是应用比较广的方法之一。该方法允许我们构建模型时候不光能够借鉴一些其它科研人员的设计的模型&#xff0c;还可以借用类似结构的模型参数&#xff0c;有些类似于站在巨人的肩膀上进行深入开发。…

使用wsimport将wsdl生成java

使用管理员打开cmd wsimport -encoding utf-8 -keep -s D:\temp -p com.lamcy.webService -verbose http://服务地址?wsdl -encoding : 指定编码格式 -keep&#xff1a;是否生成java源文件 -d&#xff1a;指定.class文件的输出目录 -s&#xff1a;指定.java文件的输出目录…

使用python创建自己的第一个神经网络模型吧!

神经网络&#xff08;NN&#xff09;&#xff0c;也被称为人工神经网络&#xff08;ANN&#xff09;&#xff0c;是机器学习领域中学习算法的子集&#xff0c;大体上借鉴了生物神经网络的概念。目前&#xff0c;神经网络在计算机视觉、自然语言处理等领域应用广泛。德国资深机器…

百度现场面试:JVM+算法+Redis+数据库!(三面)| CSDN博文精选

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 中琦2513转自 &#xff5c; CSDN博客责编 | 阿秃百度一面&#xff08;现场&#xff09;自我介绍Java中的多态为什么要同时重写hashcode和equalsHashmap的原理Hashmap如何变线程安全&#xff0c;每种方式的优缺点垃圾回收机制…

语义分割概念及应用介绍

近年来&#xff0c;以深度学习为中心的机器学习技术引起了人们的关注。比如自动驾驶汽车已经逐渐成为可能&#xff0c;但在整个深度学习过程&#xff0c;需要算法识别和学习作为原始数据提供的图像&#xff0c;在这一过程中&#xff0c;应用到了语义分割技术。下面让我们来看看…

(需求实战_终章_08)SSM集成RabbitMQ 订阅模式 关键代码讲解、开发、测试

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200208221057640.png?x-oss-processimage/watermark,type_Z 首先&#xff0c;confirm确认机制和return确认机制都是相对于生产者而言的&#xff0c; 生产者发送消息一般会有消息发送成功和消息发送失败两种场景。 生产者…

新零售基础设施 看阿里巴巴如何打“地基”

经过两年探索&#xff0c;“新零售”从星星之火已发展到现在的燎原之势&#xff0c;许多原有的传统模式正在被打破&#xff0c;先进的智能技术和数据正在给传统的零售赋予更多的能力&#xff0c;带来更大的想象空间。 在2018年杭州云栖大会的电商平台专场中&#xff0c;阿里巴…

华为自研5G关键芯片PA:明年量产不再依赖美国;1999元!苹果发布AirPods Pro ;腾讯云勇推自研服务器“星星海”……...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周两次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go小米CC9 Pro概念图&#xff0…

Work@Alibaba 阿里巴巴的企业应用构建之路

作为一个拥有数万名员工的企业&#xff0c;阿里巴巴的企业信息化是怎么做的&#xff1f; 在上周的云栖大会上&#xff0c;来自阿里巴巴信息平台的资深技术专家叶建辉为大家揭开了谜底。 阿里员工是怎么工作的? 可以通过阿里巴巴这三个案例了解&#xff1a; 人脸门禁。今年云…

windows server 2019 服务器搭建的方法步骤(图文)

一、windows server 2019 安装 Vmware 下安装 windows server 2019 。 二、服务器配置 1、 先启用远程功能 右键点击【此电脑】–【属性】&#xff0c;进入“【控制面板\系统和安全\系统】”&#xff0c;点击-【远程设置】 计算机找不到就使用【winE】快捷键 2、在“远程…

传统企业装上“智慧大脑” 看阿里巴巴如何实践AI赋能

“我们找了8位专业律师&#xff0c;和我们的AI机器人做了一个对比&#xff0c;我们的召回率与8位律师相当&#xff0c;但我们的准确率更高些”。 在不久前刚结束的杭州云栖大会上&#xff0c;来自阿里巴巴信息平台事业部的资深算法专家李波&#xff0c;正在向观众展示阿里巴巴…

如何交付机器学习项目:一份机器学习工程开发流程指南

随着机器学习&#xff08;ML&#xff09;成为每个行业的重要组成部分&#xff0c;对机器学习工程师&#xff08;MLE&#xff09;的需求急剧增长。MLE需要将机器学习技能与软件工程专业知识相结合&#xff0c;为特定应用程序找到高性能的模型&#xff0c;并应对出现的实施挑战—…