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 ...
随机推荐
- 踩坑 Pycharm 2020.1.1 安装/ JetBrains破解/ anacode配置
引言 网上的办法试了很多,通常不能解决问题,还会引发一些负效应,选取了一个试了两天终于成功的方案记录一下备用. Pycharm安装 https://www.jetbrains.com/pycharm/ ...
- 多测师讲解接口测试 —jmeter接数据库(004)_高级讲师肖sir
1.连接数据库jar包 2. 3. jdbc:mysql://192.168.153.131:3306/baoan?zeroDateTimeBehavior=convertToNull&all ...
- 发布MeteoInfo 1.2.4
在JLaTeXMath库(http://forge.scilab.org/index.php/p/jlatexmath/)的支持下,实现了利用LaTeX语法显示特殊符号和数学公式的功能.需要在字符串首 ...
- 算出cron表达式接下来几次执行时间
目录 1.使用cron库 2.总结 1.使用cron库 需要使用的go库:[点击跳转]. 具体使用方法可以参照例子使用,下面主要实现计算接下来几次cron表达式执行时间. package main i ...
- shell脚本获取随机数
$RANDOM系统变量 在bash中,支持$RANDOM系统变量,范围是 [0, 32767] #!/bin/bash set -e randN() { local N=$1 echo $(($RAN ...
- Vue3 来了,Vue3 开源商城项目重构计划正式启动!
我打算用 Vue3 写一个商城项目,目前已经开始着手开发,测试完成后正式开源到 GitHub,让大家也可以用现成的 Vue3 大型商城项目源码来练练手. Vue 3.0 来了,我们该做些什么? Vue ...
- 技术债! 怎样简洁高效的实现多个 Enum 自由转换
一:背景 1. 讲故事 前段时间和同事负责一个项目的两个业务模块,可能大家缺少沟通,导致本该定义一个 Enum 的地方结果我俩各自定义了一个,导致后面这两个 Enum 进行对接就烦了,为了方便理解,也 ...
- JDK源码阅读-------自学笔记(二十四)(java.util.LinkedList 再探 自定义讲解)
一.实现get方法 1.一般思维实现思路 1).将对象的值放入一个中间变量中. 2).遍历索引值,将中间量的下一个元素赋值给中间量. 3).返回中间量中的元素值. 4).示意图 get(2),传入角标 ...
- linux 查看nginx的安装路径等信息
做个随笔,记录一下. 想查看nginx的配置文件,但不知道nginx是安装在哪个目录下? ps -ef | grep nginx Linux在启动一个进程时,系统会在/proc下创建一个以PID命名的 ...
- 在VirtualBox中调整Raspbian分辨率
参考自一路阳光随行发表的virtualBox设置虚拟机分辨率大小中ubuntu虚拟机分辨率的设置方法. 启动Raspbian虚拟机,点击 窗口主菜单里的设备->安装增强功能.系统后会自动挂载增强 ...