Sentinel源码阅读

news2024/11/29 22:48:33

基础介绍

Sentinel 的使用可以分为两个部分:

核心库(Java 客户端):不依赖任何框架/库,能够运行于 Java 8 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持(见 主流框架适配)。

提供核心库功能,可以在本地单机运行,只依赖JDK,适用于无分布式需求

控制台(Dashboard):Dashboard 主要负责管理推送规则、监控、管理机器信息等。

适用于分布式需求的情况

源码分析

环境准备

1. 引入 Sentinel 依赖

如果您的应用使用了 Maven,则在 pom.xml 文件中加入以下代码即可:

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.6</version>
</dependency>

2. 定义资源

资源 是 Sentinel 中的核心概念之一。最常用的资源是我们代码中的 Java 方法。 当然,您也可以更灵活的定义你的资源,例如,把需要控制流量的代码用 Sentinel API SphU.entry(“HelloWorld”) 和 entry.exit() 包围起来即可。在下面的例子中,我们将 System.out.println(“hello world”); 作为资源(被保护的逻辑),用 API 包装起来。参考代码如下:

public static void main(String[] args) {
    // 配置规则.
    initFlowRules();

    while (true) {
        // 1.5.0 版本开始可以直接利用 try-with-resources 特性
        try (Entry entry = SphU.entry("HelloWorld")) {
            // 被保护的逻辑
            System.out.println("hello world");
	} catch (BlockException ex) {
            // 处理被流控的逻辑
	    System.out.println("blocked!");
	}
    }
}

3. 定义规则

接下来,通过流控规则来指定允许该资源通过的请求次数,例如下面的代码定义了资源 HelloWorld 每秒最多只能通过 20 个请求。

private static void initFlowRules(){
    List<FlowRule> rules = new ArrayList<>();
    FlowRule rule = new FlowRule();
    rule.setResource("HelloWorld");
    rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
    // Set limit QPS to 20.
    rule.setCount(20);
    rules.add(rule);
    FlowRuleManager.loadRules(rules);
}

完成上面 3 步,Sentinel 就能够正常工作了。更多的信息可以参考使用文档。

流程分析

1. FlowRuleManager

不做限流等实际操作,主要管理限流资源规则;

  1. 注册限流规则变化监听-DynamicSentinelProperty
  2. 启动每秒(默认每秒)记录限流日志-ScheduledExecutorService MetricTimerListener
  3. 规则转换为Map,后去获取
定时记录日志

com.alibaba.csp.sentinel.node.metric.MetricTimerListener
在这里插入图片描述

2. SphU

用于记录统计数据和执行资源规则检查的API入口:

  1. 同步限流
  2. 异步限流
  3. 优先进入

在这里插入图片描述

2.1 主流程

  1. com.alibaba.csp.sentinel.Env: 初始化Sph实现类,初始化限流进入推出回调
  2. com.alibaba.csp.sentinel.CtSph#lookProcessChain 构建资源独立执行链,同资源共享
  3. com.alibaba.csp.sentinel.context.ContextUtil#trueEnter 构建上下文对象(独立,存储于ThreadLocal),独立使用
  4. 执行链:com.alibaba.csp.sentinel.slots.nodeselector.NodeSelectorSlot#entry 创建默认node(DefaultNode);
  5. 执行链:com.alibaba.csp.sentinel.slots.clusterbuilder.ClusterBuilderSlot#entry 创建ClusterNode
  6. 执行链:com.alibaba.csp.sentinel.slots.logger.LogSlot#entry 异常捕获后续操作,并输入日志
  7. 执行链:com.alibaba.csp.sentinel.slots.statistic.StatisticSlot#entry 后置统计线程数请求数等纤细信息
  8. 执行链-流控:com.alibaba.csp.sentinel.slots.block.authority.AuthoritySlot#entry 认证规则,根据请求来源做请求限制
  9. 执行链-流控:com.alibaba.csp.sentinel.slots.system.SystemSlot#entry 系统级别的限制规则 包括入站流量,平均CPU use、RT、QPS和线程数等
  10. 执行链-流控:com.alibaba.csp.sentinel.slots.block.flow.FlowSlot#entry 流控限制
  11. 执行链-流控: com.alibaba.csp.sentinel.slots.block.degrade.DegradeSlot#entry 性能检测决定是否进行降级

流控先关都已抛出指定异常决定是否结束执行链

在这里插入图片描述

Node

主要用于标识资源(可细分标识)统计资源数据(QPS等各类数据);
DefaultNode: 默认同资源可能多种统计,可区分同资源下的更加细分;
ClusterNode: 同资源共享统计数据;

Node父类(StatisticNode)中包含Qps等数据的计算,那可以基本判断出限流算法也在这里实现
在这里插入图片描述

StatisticNode

作为统计数据决定限流的核心类,主要包括以下三种实时统计指标:

  1. 秒级度量(rollingCounterInSecond)
  2. 分钟级别的度量(rollingCounterInMinute)
  3. 线程数

使用滑动窗口实时记录和统计资源统计情况。ArrayMetric背后的滑动窗口基础设施是LeapArray。

滑动窗口

滑动窗口实时记录和统计资源统计情况。ArrayMetric背后的滑动窗口基础设施是LeapArray。

与滑动窗口的先关是: 令牌、漏桶等
下文是几个来自源码中的案例介绍

案例一
当第一个请求进入时,Sentinel将创建一个指定时间跨度的新窗口桶来存储运行的静态信息,例如总响应时间(rt),进入请求(QPS),块请求(bq)等。时间跨度由样本数量定义。

 	0      100ms
    +-------+--Sliding Windows
   	    ^
   	    |
   	  request

Sentinel使用有效桶的静态信息来决定请求是否可以通过。例如,如果一个规则定义只能通过100个请求,它将对有效桶中的所有qps求和,并将其与rule中定义的阈值进行比较。
案例二
连续的请求

   0    100ms    200ms    300ms
    +-------+-------+-------+-----Sliding Windows
                        ^
                        |
                     request

案例三
请求不断到来,之前的桶将失效

    0    100ms    200ms	  800ms	   900ms  1000ms    1300ms
    +-------+-------+ ...... +-------+-------+ ...... +-------+-----Sliding Windows
                                                        ^
                                                        |
                                                      request

滑动窗口应该变成:

   300ms     800ms  900ms  1000ms  1300ms
    + ...... +-------+ ...... +-------+-----Sliding Windows
                                                        ^
                                                        |
                                                      request

其实不难理解: 如一秒内不能超过20个请求, 新的请求进来(1.23秒)计算的范围应该是当前往前0.23到.1.23,而不是固定的0到1,1到2,且窗口只能往前,不能因为并发后退;

具体实现
在这里插入图片描述
对于具体的滑动实现还是读者自己去看吧
在这里插入图片描述

2、3点特性

同资源可以进入同一个执行链,但上下文的资源可以不同,以达到区分的效果;
context: 决定了node的创建,对于默认情况下该node只有一个用于统计信息,而在集群下,context决定了产生不同的node,用于区分集群下同资源的统计;

Spi(服务提供者接口模式)在基础服务中被基础使用
在这里插入图片描述

Double Check + 写时复制 被该项目大量使用

对于读多写少且写时都在锁内的map,使用该方法可以提升性能(需要加volatile)
在这里插入图片描述

使用LongAdder而非AtomicLong

在不要求增长保持连续性,而是作为统计,该类跟适合。使用数组中cas,减少锁竞争
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/344627.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电子纸墨水屏的现实应用场景

电子纸挺好个东西&#xff0c;大家都把注意力集中在商超场景 其实还有更多有趣的场景方案可用&#xff0c;价值也不小&#xff0c;比如&#xff1a; 一、仓库场景 通过亮灯拣选&#xff0c;提高仓库作业效率 二、仓库循环使用标签 做NFC类发卡式应用&#xff0c;替代传统纸…

Python中ArcPy将多张栅格图像分割为多个网格小块的方法

本文介绍基于Python中的ArcPy模块&#xff0c;依据渔网的矢量数据文件或通过手动划分小方格的方法&#xff0c;批量将大量栅格图像分割为多个矩形小栅格的方法。 首先明确一下我们的需求。现有同一区域内的多张栅格遥感影像&#xff0c;我们希望对于每一景栅格遥感影像而言&…

QML- 信号和事件系统

QML- 信号和事件系统一、概述二、信号事件处理系统使用1. 用信号处理器接收信号2. 信号处理程序3. 使用Connections 类型4. 附加信号处理程序三、向自定义QML类型添加信号四、将信号连接到方法和信号1. 信号与信号的连接一、概述 应用程序和用户界面组件需要相互通信。例如&am…

数据迁移——技术选型

日常我们在开发中&#xff0c;随着业务需求的变更&#xff0c;重构系统是很常见的事情。重构系统常见的一个场景是变更底层数据模型与存储结构。这种情况下就要对数据进行迁移&#xff0c;从而使业务能正常支行。 背景如下&#xff1a;老系统中使用了mongo数据库&#xff0c;由…

webpack 的热更新是如何做到的?原理是什么?

Hot Module Replacement&#xff0c;简称 HMR&#xff0c;在不需要刷新整个页面的同时更新模块&#xff0c;能够提升开发的效率和体验。热更新时只会局部刷新页面上发生了变化的模块&#xff0c;同时可以保留当前页面的状态&#xff0c;比如复选框的选中状态等。 在 webpack 中…

Maxwell工作流程详解

要介绍maxwell的工作原理&#xff0c;首先需要讲一下mysql主从复制的原理 mysql主从复制原理&#xff1a; 如上图&#xff0c;左边是master主节点&#xff0c;右边是slave从节点 工作流程&#xff1a; 1.往主节点mysql的数据库中写入数据&#xff0c;产生数据变化&#xff0c…

让ChatGPT介绍一下ChatGPT

申请新必应内测通过了&#xff0c;我在New Bing中使用下ChatGPT&#xff0c;让ChatGPT介绍一下ChatGPT 问题1&#xff1a;帮我生成一篇介绍chatGPT的文章&#xff0c;不少于2000字 回答&#xff1a; chatGPT是什么&#xff1f;它有什么特点和用途&#xff1f; chatGPT是一种…

IO流概述

&#x1f3e1;个人主页 &#xff1a; 守夜人st &#x1f680;系列专栏&#xff1a;Java …持续更新中敬请关注… &#x1f649;博主简介&#xff1a;软件工程专业&#xff0c;在校学生&#xff0c;写博客是为了总结回顾一些所学知识点 目录IO流概述IO 流的分类总结流的四大类字…

TCP传输文件

传输文件和传输信息的区别&#xff1a; 传输信息&#xff0c;只是一条数据&#xff0c;传输文件是多条数据传输信息传输过去一般都会显示&#xff0c;传输文件一般不会显示&#xff0c;一般只是存放在文件中传输文件需要传输&#xff0c;文件大小和文件名称&#xff08;不然不知…

C语言(字符串函数)

这章的内容记得引用<string.h>头文件 目录 1.strlen&#xff08;&#xff09; 2.strcat() 3.strncat() 4.strcmp() 5.strncmp() 6.strcpy() 7.strncpy() 8.sprintf() 8.strchr() 9.strpbrk() 10.strrchr() 11.strstr() 1.strlen&#xff08;&#xff09; 用于统计字符串的…

CentOS Stream 9尝鲜安装教程

作者&#xff1a;IT圈黎俊杰 一、下载CentOS Stream 9安装介质 在CentOS官网可以下载到CentOS Stream 9的安装介质&#xff0c;正面列出ISO介质的下载链接地址&#xff1a; https://download.cf.centos.org/9-stream/BaseOS/x86_64/iso/CentOS-Stream-9-20221019.0-x86_64-dv…

157、【动态规划】leetcode ——377. 组合总和 Ⅳ(C++版本)

题目描述 原题链接&#xff1a;377. 组合总和 Ⅳ 解题思路 一维滚动数组思路与 518. 零钱兑换 II&#xff08;二维数组一维滚动数组&#xff09; 大致相同&#xff0c;区别之处在于&#xff0c;零钱兑换解决的是组合问题&#xff08;元素在不同位置都代表同一个含义&#xff…

Java基础之IO流详解及使用方式(建议收藏)

目录前言一.初识IO流二.流的分类三.基本字节流3.1 FileOutputStream3.2 FileInputStream四.文件拷贝五.字符集六.乱码原因七.基本字符流7.1 FileReader7.2 FileWriter经典案例Demo八.高级流8.1 缓冲流8.1.1 字节缓冲流8.1.2 字符缓冲流8.2 转换流8.3 序列化流8.4 打印流8.4.1 字…

【算法】前缀和

作者&#xff1a;指针不指南吗 专栏&#xff1a;算法篇 &#x1f43e;要学会在纸上打草稿&#xff0c;这个很重要&#x1f43e; 文章目录1.什么是前缀和&#xff1f;2.怎么求前缀和&#xff1f;3.前缀和有什么用&#xff1f;4.进阶二维:矩阵和前缀和 主打一个记公式 1.什么是前…

四数之和-力扣18-java排序+双指针

一、题目描述给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#xff1a…

【C++】十分钟带你入门类和对象(上)

目录零 介绍一 面向过程和面向对象的初步认识二 类的引入三 类的定义四 类的访问限定符及封装4.1 访问限定符4.2 封装五 类的作用域六 类的实例化七 类对象模型7.1 如何计算类对象大小7.2 类对象的存储方式猜测7.3 结构体内存对齐规则八 this指针8.1 this指针的引出8.2 this指针…

leaflet 本地上传KML文件,在地图上解析显示图形(060)

第060个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中本地上传kml文件,利用解析此kml文件,在地图上显示图形。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共114行)安装加载 leaflet-kml相关AP…

Ansible中Playbook的编写

目录 一、playbook 1 简介 2 playbook语法 3 playbook示例 检测语法 列出任务 列出tag 指定执行主机 执行yaml文件 4 playbook基础 主机与用户 Tasks 列表 一、playbook 1 简介 Playbook与ad-hoc相比,是一种完全不同的运用。 playbook是一种简单的配置管理系统…

2.13日报

完成官网国际化配置 Spring boot国际化支持 当我们web项目涉及到国外部署或者国外用户使用时&#xff0c;需要展示不同语言信息&#xff0c;所以就需要国际化支持&#xff0c;下面将讲解Springboot国际化支持操作 1. 修改Springboot application.yml配置 spring: messages…

【Linux】NTP时间同步服务与NFS网络文件共享存储服务器(配置、测试)

一、NTP时间同步服务1、NTP介绍NTP服务器【Network Time Protocol&#xff08;NTP&#xff09;】是用来使计算机时间同步化的一种协议&#xff0c;它可以使计机对其服务器或时钟源&#xff08;如石英钟&#xff0c;GPS等等)做同步化&#xff0c;它可以提供高精准度的时间校正&a…