Sentinel基本概念
Sentinel是阿里开源的一款高性能的限流框架。这里将对Sentinel的使用和实现进行介绍。
这里先介绍下Sentinel中涉及到的基本概念,包括使用上或者实现上。主要是笔者在阅读文档和源码时经常会接触到的对象。
Resource
资源是整个Sentinel最基本的一个概念。可以是一段代码,一个http请求,一个微服务,总而言之,他是Sentinel需要保证的实体。大部分情况下,我们可以使用方法签名,URL或者是服务名称来作为资源的名称。它在Sentinel中的体现是:ResourceWrapper,他有两个子类:
StringResourceWrapper 使用string来标识一个资源
MethodResouceWrapper 使用一个函数签名来标识一个资源
Node
节点是用来存储统计数据的基本数据单元,Node本身只是一个接口,它有多个实现:
StatisticNode 唯一的直接实现类,实现了流量统计的基本方法,在StatisticSlot中使用
ClusterNode 继承自StatisticNode,对于某一个资源的全局统计
DefaultNode 继承自StatisticNode,对于某一个资源在相应上下文中的实现,保存了一个指向ClusterNode的引用。另外还保存了子节点列表,当在同一个context下多次调用SphU.entry不同资源时会创建子节点
EntranceNode 继承自DefaultNode,代表一个调用的根节点,一个Context会对应到一个EntranceNode
Context
上下文是用来保存当前调用的元数据,存储在ThreadLocal中,它包含了几个信息:
EntranceNode 整个调用树的根节点,即入口
Entry 当前的调用点
Node 关联到当前调用点的统计信息
Origin 通常用来标识调用方,这在我们需要按照调用方来区分流控策略的时候会非常有用
每当我们调用SphU.entry()或者 SphO.entry()获取访问资源许可的时候都需要当前线程处在某个context中,如果我们没有显式调用ContextUtil.enter(),默认会使用Default context。如果我们在一个上下文中多次调用SphU.entry()来获取多个资源,一个调用树就会被创建出来
NullContext
超过系统能够创建的最大会话数则返回NullContext,后续不对该会话做过滤校验,直接放过。
Entry
每次SphU.entry()调用都会返回一个Entry,Entry保持了所有关于当前资源调用的信息:
createTime 这个资源调用的创建时间
currentNode SphU.entry请求进入的资源在当前上下文中的统计数据Node
originNode SphU.entry请求进入的资源对于特定origin调用方的统计数据node
Entry的实现类为CtEntry,它其中除了上述信息之外,还保存了额外的信息:
parent 调用树链条中上一个entry
child 调用树链条中的下一个entry
chain 当前调用资源所使用的限流工作责任链,包括各个Slot
context 当前调用点所属的上下文
EntryType
EntryType 说的是这次请求的流量类型,共有两种类型:IN 和 OUT 。
IN:是指进入我们系统的入口流量,比如 http 请求或者是其他的 rpc 之类的请求。
OUT:是指我们系统调用其他第三方服务的出口流量。
入口、出口流量只有在配置了系统规则时才有效。
设置Type 为 IN 是为了统计整个系统的流量水平,防止系统被打垮,用以自我保护的一种方式。
设置Type 为 OUT 一方面是为了保护第三方系统,比如我们系统依赖了一个生成订单号的接口,而这个接口是核心服务,如果我们的服务是非核心应用的话需要对他进行限流保护;另一方面也可以保护自己的系统,假设我们的服务是核心应用,而依赖的第三方应用老是超时,那这时可以通过设置依赖的服务的 rt 来进行降级,这样就不至于让第三方服务把我们的系统拖垮。
Slot
Entry 创建的时候,同时也会创建一系列功能插槽(slot chain),这些插槽有不同的职责,例如:
NodeSelectorSlot 负责收集资源的路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级;
ClusterBuilderSlot 则用于存储资源的统计信息以及调用者信息,例如该资源的 RT, QPS,thread count 等等,这些信息将用作为多维度限流,降级的依据;
LogSlot 用于打印日志
StatisticSlot 则用于记录、统计不同纬度的 runtime 指标监控信息;
SystemSlot 则通过系统的状态,例如 load1 等,来控制总的入口流量;
AuthoritySlot 则根据配置的黑白名单和调用来源信息,来做黑白名单控制;
FlowSlot 则用于根据预设的限流规则以及前面 slot 统计的状态,来进行流量控制;
DegradeSlot 则通过统计信息以及预设的规则,来做熔断降级;
Slot只绑定在CtEntry上
ProcessorSlotChain
功能槽处理链,entry进入一个槽可以添加自己的动作,之后后fire动作会entry下一个槽,exit同理
注意,实现上相同资源共享一个ProcessorSlotChain ,可以跨Context
LimitApp
流控规则中的 limitApp 字段用于根据调用来源进行流量控制。该字段的值有以下三种选项,分别对应不同的场景:
default:表示不区分调用者,来自任何调用者的请求都将进行限流统计。如果这个资源名的调用总和超过了这条规则定义的阈值,则触发限流。
{some_origin_name}:表示针对特定的调用者,只有来自这个调用者的请求才会进行流量控制。例如 NodeA 配置了一条针对调用者caller1的规则,那么当且仅当来自 caller1 对 NodeA 的请求才会触发流量控制。
other:表示针对除 {some_origin_name} 以外的其余调用方的流量进行流量控制。例如,资源NodeA配置了一条针对调用者 caller1 的限流规则,同时又配置了一条调用者为 other 的规则,那么任意来自非 caller1 对 NodeA 的调用,都不能超过 other 这条规则定义的阈值。
同一个资源名可以配置多条规则,规则的生效顺序为:{some_origin_name} > other > default
介绍完了上面的基本概念,下面给出Sentinel的基本用法:
List<FlowRule> rules = new ArrayList<FlowRule>();
FlowRule rule1 = new FlowRule();
rule1.setResource(KEY);
// set limit qps to 20
rule1.setCount(20);
rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule1.setLimitApp("default");
rules.add(rule1);
Entry entry = null;
try {
entry = SphU.entry(KEY);
// token acquired, means pass,do biz logic
} catch (BlockException e1) {
//block,handle block logic
} catch (Exception e2) {
// biz exception,handle biz exception logic
} finally {
if (entry != null) {
entry.exit();
}
}
如上,为sentinel的基本用法:
先设定好规则,在进入需要受保护的资源前,尝试获取token,若成功获取token,则可以执行相关逻辑,否则抛出异常进行处理,最后释放所获得的token 。

个人公众号:啊驼
Sentinel基本概念的更多相关文章
- sentinel 核心概念
编者注:前段时间笔者在团队内部分享了sentinel原理设计与实现,主要讲解了sentinel基础概念和工作原理,工作原理部分大家听了基本都了解了,但是对于sentinel的几个概念及其之间的关系还有 ...
- sentinel基础概念及使用
点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. 什么是sentinel sentinel是Spring Cloud Al ...
- Redis Sentinel 高可用服务搭建
阅读目录: 关于 Redis 的概念 关于 Redis Sentinel 的概念 搭建 Redis Server(master) 搭建 Redis Server(slave) 搭建 Redis Sen ...
- Ali流量控制中间件Sentinel
原文链接: https://blog.csdn.net/u012190514/article/details/81383698 Sentinel 是什么 随着微服务的流行,服务和服务之间的稳定性变得越 ...
- 【转载】Redis Sentinel 高可用服务架构搭建
作者:田园里的蟋蟀 出处:http://www.cnblogs.com/xishuai/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接. 阅读 ...
- sentinel 滑动窗口统计机制
sentinel的滑动窗口统计机制就是根据当前时间,获取对应的时间窗口,并更新该时间窗口中的各项统计指标(pass/block/rt等),这些指标被用来进行后续判断,比如限流.降级等:随着时间的推移, ...
- sentinel 集群流控原理
为什么需要集群流控呢?假设需要将某个API的总qps限制在100,机器数可能为50,这时很自然的想到使用一个专门的server来统计总的调用量,其他实例与该server通信来判断是否可以调用,这就是基 ...
- Dubbo学习系列之十(Sentinel之限流与降级)
各位看官,先提个问题,如果让你设计一套秒杀系统,核心要点是啥???我认为有三点:缓存.限流和分离.想当年12306大面积崩溃,还有如今的微博整体宕机情况,感觉就是限流降级没做好,"用有限的资 ...
- Sentinel 快速入门
Sentinel 简介 什么是 Sentinel? 『Sentinel』是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制.熔断降级.系统负载保护等多 ...
随机推荐
- Oracle数据库之四 简单查询
四.简单查询 简单查询的主要特征就是将一张数据表之中的全部数据行进行显示,而后可以利用 SELECT 子句来控制所需要的输出列. 4.1.基础语法 范例:查询 emp 表中的数据(全部数据查询) ...
- java短信验证和注册
最近公司需要用到短信验证注册,所以申请了阿里云的短信服务.我的项目是分布式的spring boot 原理: 利用第三方发送短信 获取回执消息,然后存入缓存里面 将用户填写的验证码与缓存里面的验证码对比 ...
- .NetCore从零开始使用Skywalking分布式追踪系统
本文将从0开妈搭建两个webapi项目,使用Skywalking来追踪他们之间的调用关系及响应时间.开发环境为VisualStudio2019 1:安装Skywalking,可参考:https://w ...
- windows下 ionic 打包app --以安卓版本为例
环境安装 1.nodejs 安装版本5.7,尽量不要安装太新的版本,因为可能会出现兼容性问题,一开始本人安装的是6.+的版本,后来出现问题的,马上换回5.7的,问题就不会出现了. 安装教程网上教程很多 ...
- HTML5学习手册
目录 HTML 简介 HTML 简介 什么是 HTML? HTML 标签 HTML 文档 = 网页 基本的 HTML 标签 - 四个实例 HTML 标题 HTML 段落 HTML 链接 HTML 图像 ...
- 学习笔记(一)-PyTorch在Windows环境搭建
一.安装Anaconda 3.5 Anaconda是一个用于科学计算的Python发行版,支持Linux.Mac和Window系统,提供了包管理与环境管理的功能,可以很方便地解决Python并存.切换 ...
- Badboy - 导出脚本,用于JMeter性能测试
参考: http://leafwf.blog.51cto.com/872759/1131119 http://www.51testing.com/html/00/130600-1367743.html ...
- 复习+dfs
1.参考:https://www.cnblogs.com/ckxkexing/p/8466097.html 这道题自己写过,还写过blog,但是第二次写还是不会. (于是开坑,想做做dfs的整理.
- codeforce#483div2D-XOR-pyramid+DP
题意:求给定区间中最大的连续异或和: 思路:DP的思想,先dp求出每个区间的异或和,再dp更新成当前这个dp[i][j]和dp[i-1][j].dp[i-1][j+1]中的最大值: 这样可以保证是同一 ...
- 百度之星资格赛 调查问卷 bitset模板(直接将字符串转化成二进制数组并可以计算出十进制值)
Problem Description 度度熊为了完成毕业论文,需要收集一些数据来支撑他的论据,于是设计了一份包含 mm 个问题的调查问卷,每个问题只有 'A' 和 'B' 两种选项. 将问卷散发出去 ...