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 ...
随机推荐
- xshell的下载与使用
昨天刚刚立下每天一篇原创的宏图,今天就停电,到11:05才来电,没办法,学习也学不了了,就只有发一下学过的东西,才能维持得了立下的flag的那个样子,而且,老铁们,今天就不写什么原创博客了,今天转载, ...
- iOS使用NSTextAttachment添加图片,图片模糊
最近在忙的项目中,需要处理富文本的相关内容,产品需求并不复杂,所以想着用TextKit处理,顺便学习一下,没想到直接掉坑.在此记录一下(都是血泪史),顺便为有需要的小伙伴提供参考. // Add th ...
- golang API 请求队列
概要 实现思路 使用方法 启动队列服务 使用队列服务 概要 在调用第三方 API 的时候, 基本都有访问限速的限制条件. 第三方的 API 有多个的时候, 就不太好控制访问速度, 常常会导致 HTTP ...
- 代码上传多个git仓库,切换过remote后导致 can't update
问题描述: 因为代码上传到github和coding 切换了 git--> rmote的地址:后来update失败 问题解决: 重新配置git解决:按提示操作就好 git fetch git p ...
- linux的bootmem内存管理
内核刚开始启动的时候如果一步到位写一个很完善的内存管理系统是相当麻烦的.所以linux先建立了一个非常简单的临时内存管理系统bootmem,有了这个bootmem就可以做简单的内存分配/释放操作,在b ...
- 多测师讲解python_函数调用方法__高级讲师肖sir
(一)函数的介绍 函数:一个工具,随调随用优点:# 降低代码冗余# 增加代码的复用性,提高开发效率# 提高程序扩展性# 函数有两个阶段:定义阶段,调用阶段.# 定义时:只检查函数体内代码语法,不执行 ...
- 云服务器、euleros系统自动断开连接解决方案
我这里的云服务器,网上查的修改sshd.config文件并不有效 我提供另一种方法解决这个问题: vim /etc/profile 再最底部新增 export TMOUT=6000 #6000代表60 ...
- Django基础之Ajax
知识预览 Ajax前戏:json Ajax简介 Jquery实现的ajax JS实现的ajax Ajax前戏:json 什么是json? 定义: JSON(JavaScript Object Nota ...
- 【迷宫问题】CodeForces 1292A A NEKO's Maze Game
题目大意 vjudge链接 共两行,从(1,n)到(2,n). 每过一个时刻会有一个位置的状态变化,从能到达这个位置变成不能到达,或从不能到达变成能到达,问在每个时刻中是否能从起点到终点. 数据范围 ...
- spring boot:用zxing生成二维码,支持logo(spring boot 2.3.2)
一,zxing是什么? 1,zxing的用途 如果我们做二维码的生成和扫描,通常会用到zxing这个库, ZXing是一个开源的,用Java实现的多种格式的1D/2D条码图像处理库. zxing还可以 ...