sentinel原理分析及源码剖析

news2024/10/7 7:27:49

sentinel功能

sentinel功能可参考官网
可以从sentinel的dashboard中了解到sentinel的核心功能包括

流控规则

  • 阈值类型:QPS、并发线程数
  • 流控模式:直接,关联,链路
  • 流控效果:快速失败(滑动时间窗算法DefaultController),Warm Up(令牌桶算法WarmUpController),排队等待(漏桶算法RateLimiterController)
    熔断规则

熔断规则

熔断策略分为3种:

  • 慢调用比例(ResponseTimeCircuitBreaker):设置相关资源在1秒内最大响应时间为100ms、比例阈值为0.5、最小请求数为5,熔断时长5s的规则。案例:测试接口睡眠100ms,1秒内发出10个请求。断路器的开关状态:初始状态为关闭,因为每个请求进来都会成为慢调用,所以比例阈值肯定超过0.5,当第5个请求进来以后,大于最小请求数,回调方法onRequestComplete()将断路器的状态从关闭状态设置为打开状态;当第6个请求进来以后,由于熔断时间为5s,所以会被限流直接调用handleBlockException处理方法。过了5s后,其他请求来了,那么断路器试探性的将开关从打开状态置为半开状态。当又有其他请求进来后,执行回调方法onRequestComplete()时,判断本次请求响应时间是否大于最大允许响应时间,是则将开关设置为打开状态,否则设置为关闭状态

  • 异常比例(ExceptionCircuitBreaker)

  • 异常数(ExceptionCircuitBreaker)

热点规则

何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:

  • 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
  • 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制

系统规则

  • LOAD(BBR algorithm) 系统负载,从操作系统复制
  • RT 平均响应时间,从滑动时间窗算法中统计
  • 线程数
  • 入口 QPS 滑动时间窗算法中统计
  • CPU 使用率 从操作系统得来

授权规则

  • 白名单
  • 黑名单

集群流控

原理

核心架构

  • 责任链模式
    sentinel核心架构就是围绕责任链的设计模式展开的,非常好理解。下图摘自官网,sentinel默认有8个插槽,他们分工明确,有各自的责任。

在这里插入图片描述

  • 源码流程

在这里插入图片描述

  • 限流算法

a 滑动事件窗
原理是将某段时间分为若干个时间段,通过控制每个时间段的请求数来进行限流,比如qps控制在100以内,可以将1秒分为5个200ms,当时间窗内所有请求数超过100个时其他请求将被限流。如图
在这里插入图片描述

伪代码:

public class SlidingTimeWindow {

    private Long counter = 0l;

    //时间窗
    private LinkedList<Long> list = new LinkedList<>();

    public static void main(String[] args) throws InterruptedException {
        SlidingTimeWindow timeWindow = new SlidingTimeWindow();
        new Thread(() -> {
            try {
                timeWindow.doCheck();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
        
        while (true) {
            timeWindow.counter++;
            Thread.sleep(new Random().nextInt(18));
        }

    }

    public void doCheck() throws InterruptedException {
        while (true) {
            list.addLast(counter);
            if (list.size() > 10) {
                list.removeFirst();
            }
            if (list.peekLast().longValue() - list.peekFirst().longValue() > 100) {
                System.out.println("限流了");
            } else {
                System.out.println("通过了");
            }
            Thread.sleep(100l);
        }
    }
}
b 漏桶

漏桶限流算法的原理,有一个装水的桶,不控制进水的速度,而是控制出水的速度,当桶满了以后还有进水则进行限流。
伪代码:

**
 * 漏桶算法:控制系统QPS为100
 * 1、系统的峰值表示桶的阈值:300,超过300直接拒绝
 * 210ms一个请求出去,桶的水滴数-1
 * 3*/
public class LeakyBucket2 {

    public long timeStamp = System.currentTimeMillis();  // 当前时间
    public long capacity = 150; // 桶的容量
    public long rate = 100; // 水漏出的速度(每秒系统能处理的请求数)
    public long water; // 当前水量(当前累积请求数)

    public static void main(String[] args) {
        LeakyBucket2 bucket = new LeakyBucket2();
        while (true) {
            bucket.limit();
            try {
                if (bucket.water >= bucket.capacity) {
                    Thread.sleep(1000l);
                } else {
                    Thread.sleep(50l);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public boolean limit() {
        long now = System.currentTimeMillis();
        //0.050 * 100=5
        water = Math.max(0, water - ((now - timeStamp) / 1000) * rate); // 先执行漏水,计算剩余水量
        timeStamp = now;
        if ((water + 1) < capacity) {
            // 尝试加水,并且水还未满
            water += 1;
            return true;
        } else {
            // 水满,拒绝加水
            System.out.println("限流");
            return false;
        }
    }
}
c 令牌桶

令牌桶限流算法是通过匀速向令牌桶里放入令牌,当令牌桶满了以后,令牌直接丢弃;当请求进来时先去令牌桶获取令牌,如果能获取到令牌则请求通过,否则限流。
伪代码:

public class TokenBucket2 {

    long start = System.currentTimeMillis();

    long tokens;  //token的数量

    long rate = 10;  //放入token的速率

    long capacity = 20;  //桶的容量

    public static void main(String[] args) {
        TokenBucket2 bucket = new TokenBucket2();
        while (true) {
            try {
                Thread.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            bucket.check();
        }
    }

    public void check() {
        long now = System.currentTimeMillis();
        //先按一定速率加令牌,
        tokens = Math.min(capacity, tokens + (now - start)*rate);
        start = now;
        if (tokens < 1) {
            System.out.println("限流");
        } else {
            tokens =- 1;
            System.out.println("通过");
        }
    }
}

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

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

相关文章

分享Python采集99个焦点图,总有一款适合您

分享Python采集99个焦点图&#xff0c;总有一款适合您 Python采集的99个焦点图下载链接&#xff1a;https://pan.baidu.com/s/1887LXr2ovCAw-Bp7PuM66g?pwdbyx4 提取码&#xff1a;byx4 原创Jquery焦点图片切换效果 自定义大小&#xff0c;使用方 jquery立体式缩略图焦点图…

Linux系统之编译安装python3

Linux系统之编译安装python3 一、python3介绍1. python3简介2. python3特点 二、检查本地环境1. 检查本地操作系统版本2. 检查内核版本3. 检查当前python版本 三、安装前准备工作四、下载python最新版本源码包1. 访问python官网2. 创建下载目录3. 下载python源码包4. 解压pytho…

Git业务实践记录

您好&#xff0c;如果喜欢我的文章&#xff0c;可以关注我的公众号「量子前端」&#xff0c;将不定期关注推送前端好文~ 场景描述 最近在开发一个新的功能&#xff0c;和往常一样先建了一个分支进行开发&#xff0c;开发到周期60%的时候&#xff0c;后端临时通知需要将大功能…

思维导图到底有多少种?

思维导图是一种非常实用的工具&#xff0c;它可以帮助我们更好地组织和表达我们的思想。在日常生活和工作中&#xff0c;我们可以使用各种不同类型的思维导图来解决不同的问题。下面&#xff0c;我将介绍一些常见的思维导图类型以及如何使用ProcessOn思维导图软件制作思维导图。…

前端学习--Vue(5)

一、动态组件 动态切换组件的显示与隐藏 1.1 <component>组件 <!-- component是vue内置的标签占位符 is中规定标签名 --><component :is"comName"></component> 动态组件在被展示的时候被创建&#xff0c;隐藏的时候被销毁 如果想要组件…

Day1:Windows消息循环机制

先区分几个概念 系统&#xff1a;特指Windwos操作系统 应用程序&#xff1a;指一个程序&#xff0c;比如QQ&#xff0c;微信等 窗口&#xff1a;每个应用程序都 可以拥有窗口&#xff0c;而且可以有多个&#xff0c;但一般会有一个主窗口。 消息&#xff1a;window系统定义…

【系统集成项目管理工程师】计算题专题二

七、进度网络计算题 1、单代号网络图 六标时图 正推取大&#xff08;红色&#xff09;&#xff1b;反推取小&#xff08;绿色&#xff09; 关键路径&#xff1a;ACDE&#xff08;关键路径下的活动总浮动时间都是 0&#xff09; 浮动时间&#xff08;总时长&#xff09;&…

《Spring Guides系列学习》guide31 - guide34 及中期简单回顾

要想全面快速学习Spring的内容&#xff0c;最好的方法肯定是先去Spring官网去查阅文档&#xff0c;在Spring官网中找到了适合新手了解的官网Guides&#xff0c;一共68篇&#xff0c;打算全部过一遍&#xff0c;能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gu…

Scrum敏捷迭代规划和执行

Sprint Backlog看板 迭代工作的开展是围绕Sprint Backlog展开的&#xff0c;在Leangoo中&#xff0c;我们需要为每个迭代创建一个Sprint Backlog看板。Sprint Backlog&#xff08;迭代&#xff09;看板&#xff0c;用于管理当前Sprint的需求和开发任务&#xff0c;可视化展示每…

Cesium教程(七):加载自定义影像数据

GIS开发中经常需要调用本地或供应方发布的影像数据,加载独立的场景,此时可以借助GeoServer发 布自定义影像数据。 geoserver下载地址:geoserver下载 1、geoserver安装 1.1 安装方式1(推荐) 要求已安装tomcat:下载 Web Archive 版本的GeoServer,下载完毕解压,目 录如…

【JavaSE】Java基础语法(十九):接口新特性

文章目录 1. 接口组成更新概述2. 接口中默认方法3. 接口中静态方法4. 接口中私有方法 1. 接口组成更新概述 常量&#xff1a;接口可以定义全局常量&#xff0c;使用关键字public static final修饰。 抽象方法&#xff1a;接口中可以定义抽象方法&#xff0c;使用关键字public…

零基础如何入门网络安全?2023年专业学习路线看这篇就够了

前景 很多零基础朋友开始将网络安全作为发展的大方向&#xff0c;的确&#xff0c;现如今网络安全已经成为了一个新的就业风口&#xff0c;不仅大学里开设相关学科&#xff0c;连市场上也开始大量招人。 那么网络安全到底前景如何&#xff1f;大致从市场规模、政策扶持、就业…

汽车以太网通道和相关组件的测试

随着车载网络的发展&#xff0c;已经出现了CAN、LIN、FlexRay、MOST等成熟的协议&#xff0c;而基于LVDS/USB技术的链路传输模式也得到了广泛的应用。然而&#xff0c;面对不断提高的摄像头、显示器和不同传感器系统共享的更复杂信息分辨率&#xff0c;就需要更高的传输速度。 …

企业内容管理入门指南:从概念到实践,提升协作效率和质量

在现代企业管理中&#xff0c;存在一种容易被忽视但又极为重要的管理理念——企业内容管理。由于“企业内容”这一概念过于抽象&#xff0c;大家对它可能还比较模糊。所以&#xff0c;今天我们来聊聊企业内容管理。 在开始之前&#xff0c;对企业内容做一个简明的介绍&#x…

API对接是什么意思,技术分享

在计算机科学中&#xff0c;应用程序接口&#xff08;API&#xff09;是一种程序编程接口&#xff0c;定义了应用程序之间或应用程序和操作系统之间的通信方式。API对接就是在不同的应用程序之间实现数据交换和信息传输的过程。当两个不同的应用程序需要共享数据时&#xff0c;…

黄河千年清一回与人类健康

黄河千年清一回奏响一曲曲让人类走进幸福新时代的壮丽凯歌。疫情之后的首届全世界健康产业发展大会 5 月28 日上午 9 时在中国首都北京召开 The Yellow River has played a magnificent song of triumph in the millennium, ushering humanity into a new era of happiness. T…

常见通信名词的解释

在通信接口的介绍中&#xff0c;难免见到全双工/半双工/单工、同步/异步等这些名词。今天就专门来介绍一下这些名词。 1. 什么是全双工/半双工/单工 数据通信中&#xff0c;数据在线路上的传送方式可以分为单工通信、半双工通信和全双工通信三种。 单工通信&#xff1a;是指…

关于原生feign发起请求时,参数注解的相关问题

先说结论&#xff1a; POST请求必须指定请求头&#xff0c;body参数用RequestBody或者Param&#xff08;需要一个一个写&#xff09;。 GET请求&#xff0c;传参只能用QueryMap&#xff0c;后边变量是Map形式&#xff0c;哪怕是一个参数也必须放到map里边。如果是路径变量&…

MySql基础学习(1)

MySql基础学习 一、数据库1.1 什么是数据库1.2 MySql的启动与停止1.3 MySql数据模型 二、SQL2.1 SQL通用语法2.2 SQL分类2.2.1 数据类型2.2.2 DDL使用方法2.2.3 、表操作-修改&删除DDL总结 2.3 DML2.3.1 DML添加数据2.3.2 DML---修改数据2.3.3 DML---删除数据DML总结 2.4 D…

【C++从入门到放弃】vector深度剖析及模拟实现

&#x1f9d1;‍&#x1f4bb;作者&#xff1a; 情话0.0 &#x1f4dd;专栏&#xff1a;《C从入门到放弃》 &#x1f466;个人简介&#xff1a;一名双非编程菜鸟&#xff0c;在这里分享自己的编程学习笔记&#xff0c;欢迎大家的指正与点赞&#xff0c;谢谢&#xff01; vecto…