随着微服务的流行,服务和服务之间的稳定性变得越来越重要。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 的一些小扩展的更多相关文章

  1. 小扩展大用处,自己扩展一个ForeachRead吧

    是否用过IList的扩展方法 Foreach,而郁闷IEnumerable没有这个扩展?(没用过??用用吧,真的很方便,可以少好几行呢!!) 是否为了有一个索引而不得不用 for 而不能用 forea ...

  2. Nlog、Log4Net 的一个小扩展(增加自定义LEVEL)

    因公司ELK监控分析日志的需要,需要区分进程运行状态日志以及错误日志,以便能够根据日志级别(level)进行不同策略的预警,而现有的Nlog.Log4Net都没有Process这样的level,故针对 ...

  3. jquery的一个小扩展,读取URL里的参数

    /* *扩展jquery的功能: *读取url中参数的功能,方法的参数是要获取的URL里键; *使用前要先导入jquery.js文件. * */ (function ($) { $.getUrlPar ...

  4. dapper的一个小扩展以支持dataset

    废话不多,直接上方法 public static DataSet ExecuteDataSet(this IDbConnection cnn, IDbDataAdapter adapter, stri ...

  5. Java基础知识强化80:Math类random()方法的小扩展(控制产生目的数字的概率)

    1. Math.random()方法: Math.random()出现的数据是0.0<= x < 1.0之间,随机出现一个数据Math.random()>0.1概率是0.9 那么如下 ...

  6. null的小扩展

    注意:JavaScript有6种数据类型,其中是五种基本数据类型,分别是:Undefined.Null.Boolean.Number 和String,还有一种复杂的数据类型Object 使用typeo ...

  7. KMP小扩展,找出子串在主串中出现的所有位置

    KMP算法能够高效地匹配字符串,找出子串(T串)在主串(S串)中出现的首个位置的原算法网上已经有很多优秀的博文进行详细讲解,这里就不多赘述. 这篇博文主要是对KMP原算法稍作改动,使其能够在主串中把所 ...

  8. CentOS7下使用Sentinel实现Redis集群高可用

    Sentinel是Redis官方提供的一种高可用方案(除了Sentinel,Redis Cluster是另一种方案),它可以自动监控Redis master/slave的运行状态,如果发现master ...

  9. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

随机推荐

  1. JMeter实战(一) 体系结构

    此为开篇,介绍JMeter的组成结构,阅读后对JMeter形成整体认知和初步印象. 为了便于后续讲解,先明确下2个术语. 元件:如HTTP请求.事务控制器.响应断言,就是一个元件. 组件:如逻辑控制器 ...

  2. Windows 编程基础

    1 Windows应用程序的分类 1.1 控制台程序 DOS程序,本身没有窗口,通过WINDOWS下的DOS窗口执行. 1.2 窗口程序 拥有自己的窗口,通过窗口可以和用户进行交互.(比如:记事本,画 ...

  3. Python+Appium自动化测试(12)-通过坐标定位元素

    在使用appium做app自动化测试的过程中,可能会遇到元素的属性值不是唯一的情况,导致不能通过find_element_bi_xx()方法定位元素,这个时候我们就可以通过坐标来定位元素. 1,通过绝 ...

  4. 多测师讲解自动化测试 _RF数据库操作(上)_高级讲师肖sir

    一.安装库 1.查看数据库是否按安装 1.1 DatabaseLibrary pip3 install mysqlclient-2.0.1-cp37-cp37m-win_amd64.whl dos  ...

  5. 网络io控制器

    网络io控制器 网络io控制器 ZLAN6842,ZLAN6844是8路远程网络IO控制器.含有8路DI.8路DO,8路AI输入.其中DI支持干节点和湿节点,带光耦隔离:DO为继电器输出,具有5A 2 ...

  6. Jetson AGX Xavier部署ORB_SLAM2(ROS)

    1. 修改CMakeLists.txt Examples/ROS/ORB_SLAM2下的CMakeLists.txt 原 set(LIBS ${OpenCV_LIBS} ${EIGEN3_LIBS} ...

  7. c++ 获取文件创建时间、修改时间、访问时间、文件内容长度

    int GetFileInfo(string& strPath, int& iCreateTime, int& iModifyTime, int& iAccessTim ...

  8. Prometheus入门教程(三):Grafana 图表配置快速入门

    文章首发于[陈树义]公众号,点击跳转到原文:https://mp.weixin.qq.com/s/sA0nYevO8yz6QLRz03qJSw 前面我们使用 Prometheus + Grafana ...

  9. c++ 遍历目录下文件、文件夹

    BOOL GetDirFiles(const char* pszDir, char* pszFileType, std::vector<std::string>& vtFileLi ...

  10. Deepin v15.11驱动安装问题

    最近想用Linux跑深度学习,试了好几个发行版,最终选择了Deepin v15.11,但由于配置比较新,它不能兼容很多驱动,还得自己装,以下是我失败N次后得到的经验: 电脑配置 配置如下: 型号:DE ...