Sentinel 的一些小扩展
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助您保障微服务的稳定性。
今天给大家介绍一些在使用过程中会遇到的一些问题。
SentinelResource 埋点监控
@SentinelResource 可以作用于方法上的熔断降级保护,跟 Hystrix 的@HystrixCommand 注解作用是一样的。
做监控的目的是为了在业务方法触发了熔断降级规则后,在对应的监控视图中可以看到这个操作触发了对应的规则。
@SentinelResource 的工作依赖于 SentinelResourceAspect 这个切面,需要监控的话对 SentinelResourceAspect 这个类进行改造就可以了。
流控熔断预警
在流量突然上升的时候,也就意味着随时都可能迎来请求量的高峰,就会触发限流。我们也需要有一定的监控手段来提前告警,这种场景可以扩展 Slot 来实现提前告警的方案,具体方式可以查询这篇文章:https://mp.weixin.qq.com/s/qhep2f9HgK7sZFcdKMAMVg
RestFul API 处理
在 Sentinel 中,以资源的概念来进行对应的限流熔断操作。如果你们的 API 是 RestFul 风格,就会出现同一个接口变成 N 个资源的情况。
可以用@SentinelResource 为每个接口固定好资源名,这样比较繁琐。所以需要对这类的 API 进行格式化,变成一个资源。相关实现参考:https://blog.csdn.net/luanlouis/article/details/91633042还挺全的。
核心原理就是重写 UrlCleaner 的实现逻辑,利用正则进行匹配处理。
这类操作不仅仅是在 Sentinel 中会遇到,在其他的框架中也经常会遇到这种情况。比如在 Cat 中也会有类似场景,对 API 进行监控,如果不处理同样会出现 N 个监控项。
Origin 来源限制
如果需要对某个调用方进行限流,我们可以利用 Origin 方式来实现。建议做成动态配置方式,比如支持 IP, 支持请求头中的参数等方式进行限制。
内部服务之间调用还可以将本服务的应用名存放在请求头中传递过去,这样就可以在 Sentinel 中基于 Origin 来实现内部服务调用的流量控制。

热点参数动态流控
对于热点参数的流控,也可以做成动态配置的方式。
比如当前是商品 ID 为热点参数,后面是订单 ID 为热点参数。
比如当前是商品接口,后面是订单接口。
可以从 url 参数中获取热点参数,可以从 header 中获取热点参数,可以从 path 路径中获取热点参数。
增加一个配置信息,然后扩展 Sentinel 的 Filter 进行限流控制,根据配置获取对应的热点参数进行限流。

限流规则持久化
限流规则持久化是肯定要做的,默认规则是存储在内存中,这样一起动规则就丢失了,所以必须持久化。
持久化分为两种,首先是客户端,客户端持久化意思是说客户端需要加载对应的规则,这些规则会从一个地方进行获取,比如我们用 Apollo 配置中心来存储的话,客户端在启动时就会从 Apollo 中去拉取对应的规则信息。
对应的操作步骤和详细介绍可以查看下面这篇文章,虽然写了很久了,但是总体思路什么的都没变化。
Sentinel Client: 整合 Apollo 规则持久化:https://mp.weixin.qq.com/s/K9JtdGoLD1XALq5D67slPQ
然后是服务端也就是控制台的持久化,我们可以在控制台进行规则的添加和编辑,然后会把对应的配置信息推送给所有的客户端,这样规则就生效了。
同样存储重启即丢失的情况,所以控制台也需要进行持久化规则。如果客户端对接了 Apollo,那么控制也需要对接 Apollo 将规则信息存储到 Apollo 中,这样整个流程就连起来了。
可以参考这篇文章:阿里 Sentinel 控制台:-整合 Apollo 规则持久化:https://mp.weixin.qq.com/s/deigVXhEd9HycuLLm-oJzA
监控数据持久化

Sentinel 控制台的实时监控数据,默认仅存储 5 分钟以内的数据。如果需要持久化,需要实现框架提供的相关接口进行改造。
5 分钟确实很短,最起码要存储最近 3 天的数据,这样方便查看流量的趋势。
关于相关实现大家可以去看文档,比较简单,主要就是实现 MetricsRepository,将监控的数据存储到对应的数据库中。
相关改造源码可以参考:https://github.com/yinjihuan/kitty/tree/master/kitty-distributed/kitty-distributed-sentinel
关于作者:尹吉欢,简单的技术爱好者,《Spring Cloud 微服务-全栈技术与案例解析》, 《Spring Cloud 微服务 入门 实战与进阶》作者, 公众号猿天地发起人。
我整理了一份很全的学习资料,感兴趣的可以微信搜索「猿天地」,回复关键字 「学习资料」获取我整理好了的 Spring Cloud,Spring Cloud Alibaba,Sharding-JDBC 分库分表,任务调度框架 XXL-JOB,MongoDB,爬虫等相关资料。
Sentinel 的一些小扩展的更多相关文章
- 小扩展大用处,自己扩展一个ForeachRead吧
是否用过IList的扩展方法 Foreach,而郁闷IEnumerable没有这个扩展?(没用过??用用吧,真的很方便,可以少好几行呢!!) 是否为了有一个索引而不得不用 for 而不能用 forea ...
- Nlog、Log4Net 的一个小扩展(增加自定义LEVEL)
因公司ELK监控分析日志的需要,需要区分进程运行状态日志以及错误日志,以便能够根据日志级别(level)进行不同策略的预警,而现有的Nlog.Log4Net都没有Process这样的level,故针对 ...
- jquery的一个小扩展,读取URL里的参数
/* *扩展jquery的功能: *读取url中参数的功能,方法的参数是要获取的URL里键; *使用前要先导入jquery.js文件. * */ (function ($) { $.getUrlPar ...
- dapper的一个小扩展以支持dataset
废话不多,直接上方法 public static DataSet ExecuteDataSet(this IDbConnection cnn, IDbDataAdapter adapter, stri ...
- Java基础知识强化80:Math类random()方法的小扩展(控制产生目的数字的概率)
1. Math.random()方法: Math.random()出现的数据是0.0<= x < 1.0之间,随机出现一个数据Math.random()>0.1概率是0.9 那么如下 ...
- null的小扩展
注意:JavaScript有6种数据类型,其中是五种基本数据类型,分别是:Undefined.Null.Boolean.Number 和String,还有一种复杂的数据类型Object 使用typeo ...
- KMP小扩展,找出子串在主串中出现的所有位置
KMP算法能够高效地匹配字符串,找出子串(T串)在主串(S串)中出现的首个位置的原算法网上已经有很多优秀的博文进行详细讲解,这里就不多赘述. 这篇博文主要是对KMP原算法稍作改动,使其能够在主串中把所 ...
- CentOS7下使用Sentinel实现Redis集群高可用
Sentinel是Redis官方提供的一种高可用方案(除了Sentinel,Redis Cluster是另一种方案),它可以自动监控Redis master/slave的运行状态,如果发现master ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
随机推荐
- 【从零开始撸一个App】Kotlin
工欲善其事必先利其器.像我们从零开始撸一个App的话,选择最合适的语言是首要任务.如果你跟我一样对Java蹒跚的步态和僵硬的语法颇感无奈,那么Kotlin在很大程度上不会令你失望.虽然为了符合JVM规 ...
- 正式班D5
2020.10.10星期六 正式班D5 一.上节课复习 1.硬盘分类 1.机械磁盘 io时间=平均寻道时间+平均延迟时间 buffer:写缓冲区 cache:都缓存 2.固态硬盘 ...
- ansible-基础和安装
什么是ansible ansible是python中的一套模块,系统中的一套自动化工具,可以用来作系统管理.自动化命令.等任务. ansible优势 (1) ansible是python中的一套完整的 ...
- vue打包之后在本地运行,express搭建服务器,nginx 本地服务器运行
一.使用http-server 1.安装http-server npm install -g http-server 2.通过命令进入到dist文件夹 3.运行http-server 以上在浏览器输入 ...
- webpack5文档解析(上)
webpack5 声明:所有的文章demo都在我的仓库里 webpack5 起步 概念 webpack是用于编译JavaScript模块. 一个文件依赖另一个文件,包括静态资源(图片/css等),都会 ...
- HTTP协议和APACHE
HTTP服务 超文本传输协议. 互联网上应用最广的一种服务. 是一种应用层协议. Internet 互联网表示把各个网连起来 ARPAnet军网 TCP/IP协议 开放的协议 互联互通 Interne ...
- SQL DELETE语句如何让表使用别名的方法
DELETE 别名 FROM 表名称 别名 WHERE 列名称 = 值
- linux环境下protobuf安装
1. 到GitHub下载源码,执行解压命令后,进入解压后的目录 2. 执行./autogen,生成configure 3. 执行./configure --prefix=/usr/local/,pro ...
- Spring boot ConditionalOnClass原理解析
Spring boot如何自动加载 对于Springboot的ConditionalOnClass注解一直非常好奇,原因是我们的jar包里面可能没有对应的class,而使用ConditionalOnC ...
- D. Rescue Nibel! 解析(思維、組合、離散化、差分)
Codeforce 1420 D. Rescue Nibel! 解析(思維.組合.離散化.差分) 今天我們來看看CF1420D 題目連結 題目 給你\(n\)個區間,求有幾種方法使得\(k\)個區間的 ...