Sentinel(十五)之在生产环境中使用 Sentinel

转载自  在生产环境中使用 Sentinel

引言

Sentinel 目前已可用于生产环境,除了阿里巴巴以外,也有很多企业在生产环境中广泛使用 Sentinel。

生产环境的 Sentinel Dashboard 需要具备下面几个特性:

  • 规则管理及推送,集中管理和推送规则。sentinel-core 提供 API 和扩展接口来接收信息。开发者需要根据自己的环境,选取一个可靠的推送规则方式;同时,规则最好在控制台中集中管理。
  • 监控,支持可靠、快速的实时监控和历史监控数据查询。sentinel-core 记录秒级的资源运行情况,并且提供 API 来拉取资源运行信息。当机器大于一台以上的时候,可以通过 Dashboard 来拉取,聚合,并且存储这些信息。这个时候,Dashboard 需要有一个存储媒介,来存储历史运行情况。
  • 权限控制,区分用户角色,来进行操作。生产环境下的权限控制是非常重要的,理论上只有管理员等高级用户才有权限去修改应用的规则。

由于开发者有各自不一样的环境和需求,我们会对“规则管理和推送”,“监控”这两个方面给出建议以及最佳实践;对于权限控制,由于每个开发者的环境都不一样,我们在最佳实践中仅仅使用了简单的认证。开发者可以依循自己的需求,结合实际生产环境,选择最适合自己的方式。

同时我们也在云上提供 企业级的 Sentinel 控制台 (AHAS Sentinel),欢迎大家体验。

规则管理及推送

一般来说,规则的推送有下面三种模式:

推送模式说明优点缺点
原始模式API 将规则推送至客户端并直接更新到内存中,扩展写数据源(WritableDataSource简单,无任何依赖不保证一致性;规则保存在内存中,重启即消失。严重不建议用于生产环境
Pull 模式扩展写数据源(WritableDataSource), 客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件 等简单,无任何依赖;规则持久化不保证一致性;实时性不保证,拉取过于频繁也可能会有性能问题。
Push 模式扩展读数据源(ReadableDataSource),规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。生产环境下一般采用 push 模式的数据源。规则持久化;一致性;快速引入第三方依赖

原始模式

如果不做任何修改,Dashboard 的推送规则方式是通过 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 模式的数据源。对于 push 模式的数据源,如远程配置中心(ZooKeeper, Nacos, Apollo等等),推送的操作不应由 Sentinel 客户端进行,而应该经控制台统一进行管理,直接进行推送,数据源仅负责获取配置中心推送的配置并更新到本地。因此推送规则正确做法应该是 配置中心控制台/Sentinel 控制台 → 配置中心 → Sentinel 数据源 → Sentinel,而不是经 Sentinel 数据源推送至配置中心。这样的流程就非常清晰了:

Remote push rules to config center

我们提供了 ZooKeeper, Apollo, Nacos 等的动态数据源实现。以 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 1.4.0 开始,Sentinel 控制台提供 DynamicRulePublisher 和 DynamicRuleProvider 接口用于实现应用维度的规则推送和拉取,并提供了相关的示例。Sentinel 提供应用维度规则推送的示例页面(/v2/flow),用户改造控制台对接配置中心后可直接通过 v2 页面推送规则至配置中心。改造详情可参考 应用维度规则推送示例。

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

监控

Sentinel 会记录资源访问的秒级数据(若没有访问则不进行记录)并保存在本地日志中,具体格式请见 秒级监控日志文档。Sentinel 控制台可以通过 Sentinel 客户端预留的 HTTP API 从秒级监控日志中拉取监控数据,并进行聚合。

目前 Sentinel 控制台中监控数据聚合后直接存在内存中,未进行持久化,且仅保留最近 5 分钟的监控数据。若需要监控数据持久化的功能,可以自行扩展实现 MetricsRepository 接口(0.2.0 版本),然后注册成 Spring Bean 并在相应位置通过 @Qualifier注解指定对应的 bean name 即可。MetricsRepository 接口定义了以下功能:

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

其中默认的监控数据类型为 MetricEntity,包含应用名称、时间戳、资源名称、异常数、请求通过数、请求拒绝数、平均响应时间等信息。对于监控数据的存储,用户需要根据自己的存储精度,来考虑如何存储这些监控数据。为了更好地支撑大规模的集群,生产环境通常需要部署多个控制台实例,通常需要仔细设计下监控分片拉取和写入策略。

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

最佳实践

我们提供了一个云上版本的控制台。通过这个版本,开发者可以看到一个完整的生产环境的控制台的功能全集。它主要包括:

  • 可靠的实时监控和历史监控数据查询:该控制台将会示范 Sentinel 的监控能做成什么样子,包括实时监控、集群热力图等,请参考“监控”以及“簇点链路”模块。
  • 动态规则管理/推送:该控制台将会示范如何做一个合理的 push 结构的实现,请参考“规则”模块。
  • 机器列表:如何利用 Sentinel 上报的机器信息进行管理,请参考“机器列表”模块。
  • 全自动托管的集群流控与 Service Mesh 流控能力

详情请参考 AHAS Sentinel 控制台文档来参考如何在生产环境中使用控制台。

同类组件功能对比

 SentinelHystrixresilience4j
隔离策略信号量隔离(并发控制)线程池隔离/信号量隔离信号量隔离
熔断降级策略基于慢调用比例、异常比例、异常数基于异常比例基于异常比例、响应时间
实时统计实现滑动窗口(LeapArray)滑动窗口(基于 RxJava)Ring Bit Buffer
动态规则配置支持近十种动态数据源支持多种数据源有限支持
扩展性多个扩展点插件的形式接口的形式
基于注解的支持支持支持支持
单机限流基于 QPS,支持基于调用关系的限流有限的支持Rate Limiter
集群流控支持不支持不支持
流量整形支持预热模式与匀速排队控制效果不支持简单的 Rate Limiter 模式
系统自适应保护支持不支持不支持
热点识别/防护支持不支持不支持
多语言支持Java/Go/C++JavaJava
Service Mesh 支持支持 Envoy/Istio不支持不支持
控制台提供开箱即用的控制台,可配置规则、实时监控、机器发现等简单的监控查看不提供控制台,可对接其它监控系统

其它

Awesome Sentinel 里记录非常多的社区用户的一些扩展和解决方案,也欢迎大家将一些比较好的扩展实现添加进来。

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

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

相关文章

P3934-Nephren Ruq Insania【欧拉定理,树状数组】

正题 题目链接:https://www.luogu.org/problemnew/show/P3934 题目大意 长度为nnn的序列aaa 1lrw:1\ l\ r\ w:1 l r w:让l∼rl\sim rl∼r这个区间增加www。2lrp:2\ l\ r\ p:2 l r p:求alal1al2...%pa_l^{a_{l1}^{a_{l2}^{...}}}\% palal1al2...​​​%p直到ara_rar​ 解题思路…

Entity Framework Core 懒加载

众所周知在EF 6 及以前的版本中&#xff0c;是支持懒加载&#xff08;Lazy Loading&#xff09;的&#xff0c;可惜在EF Core 并不支持&#xff0c;必须使用Include方法来支持导航属性的数据加载。不过现在EF Core的开发团队打算恢复对这一功能的支持&#xff08;目前还未发布&…

Sentinel(十六)之AHAS Sentinel 控制台

转载自 AHAS Sentinel 控制台 AHAS Sentinel 是 Sentinel 的阿里云上版本&#xff0c;提供企业级的高可用防护服务&#xff0c;包括&#xff1a; 可靠的实时监控和历史秒级监控数据查询&#xff0c;包含 QPS、RT、load、CPU 使用率等指标&#xff0c;支持按照调用类型分类&a…

和各路巨佬の随机挑战3总结

第三次挑战\huge \texttt{\color{purple}第\color{blue}三\color{green}次\color{block}挑\color{red}战}第三次挑战 规则 随机挑取一蓝一紫一黑来做&#xff0c;拥有两次换题机会&#xff0c;若黑题是暂未学过的算法可以拥有无限次换题机会。 van♂van♂van♂成记录 过程 晚…

浅析Entity Framework Core2.0的日志记录与动态查询条件

一、 Entity Framework Core2.0的日志记录早在Entity Framework Core1.0 ,我们就使用相关的ILoggerProvider ILogger 这些基础接口类.来实现过日志记录.在Entity Framework Core2.0 估计是为了配合ASP.NET Core的日志.所以对这些接口进行了更进一步的包装,也弃用了一些接口和类…

Sentinel(十七)之启动配置项

转载自 启动配置项 配置方式 Sentinel 提供如下的配置方式&#xff1a; JVM -D 参数方式properties 文件方式&#xff08;1.7.0 版本开始支持&#xff09; 其中&#xff0c;project.name 参数只能通过 JVM -D 参数方式配置&#xff08;since 1.8.0 取消该限制&#xff09;&…

jzoj3337-[NOI2013模拟]wyl8899的TLE【字符串hash,二分】

正题 题目大意 两个字符串A,BA,BA,B。可以修改AAA中的一个字符使得AAA中的1∼k1\sim k1∼k是BBB的子串&#xff0c;求kkk的最大值。 解题思路 先将AAA和BBB字符串hashhashhash&#xff0c;然后枚举BBB作为子串的起始位置&#xff0c;然后二分出不修改字符的第一个不相等处xxx…

Actor-ES框架:Ray--事件(Event)编写说明

Event作用&#xff1a;存储事件数据。IEventBaseK&#xff1a;是Actor的StateId的类型&#xff0c;可以是long、可以是string&#xff0c;Ray一般使用OGuid生成的字符串作为主键。编写Event继承IEventBase接口&#xff0c;Base部分如下&#xff1a; public string Id {…

Sentinel(十八)之注解支持

转载自 注解支持 Sentinel 提供了 SentinelResource 注解用于定义资源&#xff0c;并提供了 AspectJ 的扩展用于自动定义资源、处理 BlockException等。使用 Sentinel Annotation AspectJ Extension 的时候需要引入以下依赖&#xff1a; <dependency><groupId>c…

jzoj3338-[NOI2013模拟]法法塔的奖励【权值线段树,线段树合并】

正题 题目大意 一棵树&#xff0c;对于每个点&#xff0c;求从任何一个在该点的子树为头&#xff0c;以该点为结尾的序列必须选择这个点的最长不降子序列。 解题思路 首先我们使用权值线段树计算答案每个点(l,r,w)(l,r,w)(l,r,w)表示以l∼rl\sim rl∼r为结尾最长的不降升子序…

设计模式之策略模式在地铁票价系统中的应用

引言设计模式是面向对象编程的一个非常精彩的部分。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性&#xff0c;它能帮助我们将应用组织成容易了解&#xff0c;容易维护&#xff0c;具有弹性的架构。本文通过一个简单的案例来讲述策略模式在地铁票价系…

jzoj3339-[NOI2013模拟]wyl8899和法法塔的游戏【博弈论,暴力】

正题 题目大意 有nnn堆石子&#xff0c;每次选择一个区间博弈&#xff0c;先手必须先取最右边的石子堆。 每次询问(r,a,b)(r,a,b)(r,a,b)表示在a∼ba\sim ba∼b中选择一个数lll。要求使用l∼rl\sim rl∼r这个区间的石子进行博弈&#xff0c;然后若先手必胜输出最右边的石子需…

Sentinel(十九)之主流框架的适配

转载自 主流框架的适配 注&#xff1a;适配模块仅提供相应适配功能&#xff0c;若希望接入 Sentinel 控制台&#xff0c;请务必参考 Sentinel 控制台文档。 云原生微服务体系 Spring Cloud Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。Sentinel 与 Spring …

利用OCR文字识别+百度算法搜索,玩转冲顶大会、百万英雄、芝士超人等答题赢奖金游戏

【先上一张效果图】&#xff1a;一、原理&#xff1a;其实原理很简单&#xff1a;1.手机投屏到电脑&#xff1b;2.截取投屏画面的题目部分&#xff0c;进行识别&#xff0c;得到题目和三个答案&#xff1b;3.将答案按照一定的算法&#xff0c;进行搜索&#xff0c;得出推荐答案…

Sentinel(二十)之Envoy RLS Token Server

转载自 Envoy RLS Token Server Sentinel 提供了一个 Envoy Global Rate Limiting gRPC Service 的实现 sentinel-cluster-server-envoy-rls&#xff0c;借助集群限流 token server 来为 Envoy 服务网格提供集群流量控制的能力。 Note: You can refer to here for the Englis…

欢乐纪中某A组赛【2019.7.9】

前言 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 我好菜我好菜我好菜我好菜我好菜 心态大崩 ZYCdalaoZYCdalaoZYCdalao去AKBAK\ BAK B组了所以应该是我垫…

g4e基础篇#5 创建分支和保存代码

使用版本控制系统最常见的工作流程就是修改代码&#xff0c;保存代码&#xff0c;共享代码。Git提供了一个简单的3步工作流&#xff0c;让你方便的完成这些操作。1. 新建工作分支2. 提交更改3. 推送分支到中心存储库与团队成员共享Git 工作流按照以上3步操作&#xff0c;我们就…

P3952-时间复杂度【模拟】

正题 题目链接:https://www.luogu.org/problemnew/show/P3952 题目大意 比较复杂就直接给截图了 解题思路 开一个栈来维护序列&#xff0c;因为它保证合法的程序中一个变量不会相互嵌套所以就拿变量的字母当做每个循环的下标即可。然后对于输入的x,yx,yx,y有五种情况 xN,yN…

Sentinel(二十一)之Sentinel Dashboard控制台日志路径设置

一、sentinel-dashboard配置文件 配置文件内容&#xff1a;Sentinel/sentinel-dashboard/src/main/resources/application.properties #spring settings spring.http.encoding.forcetrue spring.http.encoding.charsetUTF-8 spring.http.encoding.enabledtrue#cookie name se…

一步步部署基于Windows系统的Jenkins持续集成环境

如题&#xff1a;本文将介绍如何在Windows环境下运用Jenkins部署持续集成环境。之所以写本文&#xff0c;是因为在最近工作当中&#xff0c;学习使用Jenkins时&#xff0c;确实遇到了一些问题&#xff0c;而大多数教程文档都是基于Mac或是Linux平台。为此很是头疼&#xff0c;经…