![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
sentinel源码解析
sentinel源码解析
qian_348840260
这个作者很懒,什么都没留下…
展开
-
21. SqSentinel使用陷阱
SqSentinel基于Spring AOP使用注解@SqSentinelResource的方式对请求进行限流和降级处理, 使用方式可参见SqSentinel接入指南, 在使用过程中需慎入如下陷阱。陷阱1: Spring AOP仅对Spring管理的bean进行增强操作。NewOrderArrivalHallRunnable是内部类,非ApplicationContext管理的类,因此即使使用@SqSentinelResource注解,限流降级功能也不会生效。eclipse 警告fallbackE...原创 2020-12-24 16:12:56 · 193 阅读 · 0 评论 -
20. 首汽sentinel简介
一、sentinel简介Sentinel是一个具有流量控制、熔断降级、系统负载保护等多个维度保护服务稳定性的开源框架二、使用sentinel 的目的通过使用Sentinel, 当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联故障。当异常发生时,非核心链路走降级策略,降低一定的用户体验来,保证系统的稳定性..三、使用方式步骤一: 升级组件版本到1.1.5或者以上 1原创 2020-09-19 13:30:12 · 139 阅读 · 0 评论 -
19. Sentinel 主流框架适配
使用 Sentinel 需要用 try-catch-finally 将需要保护的资源(方法或者代码块)包装起来,在目标方法或者代码块执行之前,调用 ContextUtil#enter 方法以及 SphU#entry 方法,在抛出异常时,如果非 BlockException 异常需要调用 Tracer#trace 记录异常,修改异常指标数据,在 finally 中需要调用 Entry#exit 方法,以及 ContextUtil#exit 方法。为了节省这些步骤,Sentinel 提供了对主流框架的适配,转载 2020-09-19 13:15:42 · 418 阅读 · 0 评论 -
18. Sentinel 动态数据源:规则动态配置
经过前面的学习,我们知道,为资源配置各种规则可使用 Sentinel 提供的各种规则对应的 loadRules API,但这种以编码的方式配置规则很难实现动态修改。但基于 Sentinel 提供的各种规则对应的 loadRules API,我们可以自己实现规则的动态更新,而这一功能几乎在每个需要使用 Sentinel 的微服务项目中都需要实现一遍。Sentinel 也考虑到了这点,所以提供了动态数据源接口,并且提供了多种动态数据源的实现,尽管我们可能不会用到。动态数据源作为扩展功能放在 sentinel转载 2020-09-19 13:13:16 · 1699 阅读 · 0 评论 -
17. Sentinel 集群限流的实现
Sentinel不仅仅支持单机限流,也支持集群限流。Sentinel 支持两种模式启动集群限流服务端,分别是嵌入模式、独立模式。嵌入模式(Embedded)集群限流服务端作为应用的内置服务同应用一起启动,与应用在同一个进程,可动态的挑选其中一个节点作为集群限流服务端,独立模式(Alone)集群限流服务端作为一个独立的应用部署集群限流 每一次qps请求都需要与集群限流服务器通讯,无疑增了性能的损耗(Sentinel作了很多优化,据说性能接近于redis)。因此生产环境不建...原创 2020-09-19 13:08:49 · 667 阅读 · 0 评论 -
16. 自定义 ProcessorSlot 实现开关降级
开关降级在我们公司的电商项目中是每个微服务都必须支持的一项功能,主要用于活动期间、每日流量高峰期间、主播带货期间关闭一些无关紧要功能,降低数据库的压力。开关降级实现起来很简单,例如,我们可以使用 Spring AOP 或者动态代理模式拦截目标方法的执行,在方法执行之前,先根据 key 从 Redis 读取 value,如果 value 是 true,则不执行目标方法,直接响应服务降级。这种方式付出的性能损耗就只有一次 redis 的 get 操作,如果不想每个请求都读 Redis 缓存,也可以通过动态配转载 2020-09-19 12:39:16 · 372 阅读 · 0 评论 -
15. ParamFlowSlot 热点参数限流
热点参数限流并非在 Sentinel 的 core 模块中实现的,而是在扩展模块中实现的。主要是根据同一资源不同的参数进行限流。之前的限流策略都是针对资源维度的,热点参数限流则将维度细化到资源的某个参数上。热点参数限流统计指标及获取指标的方式与FlowSlot等不同,使用ParamMapBucket来统计数据,使用HotParameterLeapArray来实现滑动窗口。...原创 2020-09-19 11:58:35 · 906 阅读 · 0 评论 -
14. AuthoritySlot 来源访问控制
AuthoritySlot 来源访问控制,也称为黑白名单控制。根据配置中的limitApp,对不同的origin进行限制,如果是白名单的则不做限流,如果黑名单的禁止访问。其实更像一种对访问来源系统的授权操作。源码很简单,代码风格同FlowSlot....原创 2020-09-19 11:24:27 · 380 阅读 · 0 评论 -
13. SystemSlot 自适应限流
系统自适应限流规则配置系统自适应限流规则针对所有流量类型为 IN 的资源生效,因此不需要配置规则的资源名称。SystemRule 定义的字段如下:public class SystemRule extends AbstractRule { private double highestSystemLoad = -1; private double highestCpuUsage = -1; private double qps = -1; private long a原创 2020-09-19 11:14:38 · 267 阅读 · 0 评论 -
12. DegradeSlot 熔断降级
熔断降级是Sentinel生产环境使用范围最广的一种降级手段。前文讲的限流降级其实并不常用。QPS增加分为正常增加和异常增加,在流量为王的互联网时代,QPS正常增加一般都通过横向扩展机器,而不是硬性拒绝访问来处理,避免影响用户体验。而QPS异常增加,比如说受到攻击等,则往往在四七层进行拦截(lvs或者nginx)。熔断规则可配置的属性public class DegradeRule extends AbstractRule { // 可配置字段 private double cou原创 2020-09-19 11:02:50 · 780 阅读 · 0 评论 -
11. DefaultController&RateLimiterController
DefaultControllerDefaultController 是默认使用的流量效果控制器,直接拒绝超出阈值的请求。当 QPS 超过限流规则配置的阈值,新的请求就会被立即拒绝,抛出 FlowException。适用于对系统处理能力明确知道的情况下,比如通过压测确定阈值。实际上我们很难测出这个阈值,因为一个服务可能部署在硬件配置不同的服务器上,并且随时都可能调整部署计划。public class DefaultController implements TrafficShapingContro原创 2020-09-18 18:22:46 · 700 阅读 · 0 评论 -
10. FlowSlot 限流处理器
Sentinel 实现限流降级、熔断降级、黑白名单限流降级、系统自适应限流降级以及热点参数限流降级都是由 ProcessorSlot、Checker、Rule、RuleManager 组合完成。ProcessorSlot 作为调用链路的切入点,负责调用 Checker 检查当前请求是否可以放行;Checker 则根据资源名称从 RuleManager 中拿到为该资源配置的 Rule(规则),取 ClusterNode 统计的实时指标数据与规则对比,如果达到规则的阈值则抛出 Block 异常,抛出 Block原创 2020-09-18 16:12:38 · 356 阅读 · 0 评论 -
9. StatisticSlot 资源指标数据统计
StatisticSlot 是实现资源各项指标数据统计的 ProcessorSlot,它与 NodeSelectorSlot、ClusterBuilderSlot 组成了资源指标数据统计流水线,分工明确。首先 NodeSelectorSlot 为资源创建 DefaultNode,将 DefaultNode 向下传递,ClusterBuilderSlot 负责给资源的 DefaultNode 加工,添加 ClusterNode 这个零部件,再将 DefaultNode 向下传递给 StatisticSlo原创 2020-09-18 15:23:47 · 338 阅读 · 0 评论 -
8. ClusterBuilderSlot
在一个资源的 ProcessorSlotChain 中,NodeSelectorSlot 负责为资源创建 DefaultNode,这个 DefaultNode 仅限同名的 Context 使用。所以一个资源可能会存在多个 DefaultNode,那么想要获取一个资源的总的 QPS 就必须要遍历这些 DefaultNode。为了性能考虑,Sentinel 会为每个资源创建一个全局唯一的 ClusterNode,用于统计资源的全局并行占用线程数、QPS、异常总数等指标数据。ClusterBuilderSlo原创 2020-09-18 14:14:11 · 205 阅读 · 0 评论 -
7. NodeSelectorSlot
NodeSelectorSlot 负责为资源的首次访问创建 DefaultNode,以及维护 Context.curNode 和调用树。NodeSelectorSlot 被放在 ProcessorSlotChain 链表的第一个位置,这是因为后续的 ProcessorSlot 都需要依赖这个 ProcessorSlot。NodeSelectorSlot 源码如下:public class NodeSelectorSlot extends AbstractLinkedProcessorSlot<原创 2020-09-18 10:53:23 · 716 阅读 · 0 评论 -
6. ProcessorSlotChain-sentinel中的责任链模式
Sentinel 的整体工具流程就是使用责任链模式将所有的 ProcessorSlot 按照一定的顺序串成一个单向链表。实现将 ProcessorSlot 串成一个单向链表的是 ProcessorSlotChain,这个 ProcessorSlotChain 是由 SlotChainBuilder 构造的。SlotChainProviderpublic final class SlotChainProvider { private static volatile SlotChainBui原创 2020-09-17 17:36:04 · 455 阅读 · 0 评论 -
5. Hello World及整体工作流程
Sentinel 的基本使用ContextUtil.enter("上下文名称,例如:sentinel_spring_web_context");Entry entry = null;try { entry = SphU.entry("资源名称,例如:/rpc/openfein/demo", EntryType.IN (或者 EntryType.OUT)); // 执行业务方法 return doBusiness();} catch (Exception ...原创 2020-09-17 11:35:59 · 266 阅读 · 0 评论 -
4. Sentinel常见名词
ResourceWrapperpublic abstract class ResourceWrapper { protected final String name; protected final EntryType entryType; protected final int resourceType; public ResourceWrapper(String name, EntryType entryType, int resourceType) {原创 2020-09-17 10:52:36 · 202 阅读 · 0 评论 -
3. 滑动窗口实现
滑动窗口类关系图(泛型和接口属性被置换为实体类)滑动窗口核心类: 1. MetricBucket类最底层的存储结构,统计了一个窗口时间内的各项指标数据,这些指标数据包括请求总数、成功总数、异常总数、总耗时、最小耗时、最大耗时等,而一个 Bucket 可以是记录一秒内的数据,也可以是 10 毫秒内的数据,这个时间长度称为窗口时间public class ...原创 2020-09-16 18:00:15 · 715 阅读 · 0 评论 -
2. hystrix & Sentinel
市面上常用两个降级框架大PK hystrix & Sentinel原创 2020-09-16 11:44:12 · 289 阅读 · 0 评论 -
1. 为什么需求服务降级
背景:系统A调用系统B1. B因io,load,deadlock等原因出现长时间卡顿或stw,会导致对外提供服务的能力下降,rt时间过长。2. A接口调用B超时失败,往往会发生重试,重试+正常qps,导致对B系统的调用量增加,B系统雪上加霜,恢复更慢。3. A调用B的线程会被更长时间占用(接口调用10ms,超时1s失败,重试3次,最坏情况接口耗时4s),A的性能受用影响,有可能级联影响到调用A的服务。形成一种链式的雪崩。生产例子:理论: redis使用单线程,单机处理能力qps ..原创 2020-09-16 11:36:14 · 299 阅读 · 0 评论