当前位置: 首页 > news >正文

Sentinel核心源码分析(上)

文章目录

  • 前言
  • 一、客户端与Spring Boot整合
  • 二、SphU.entry
    • 2.1、构建责任链
    • 2.2、调用责任链
      • 2.2.1、NodeSelectorSlot
      • 2.2.2、ClusterBuilderSlot
      • 2.2.3、LogSlot
      • 2.2.4、StatisticSlot
      • 2.2.5、AuthoritySlot
      • 2.2.6、SystemSlot
      • 2.2.7、FlowSlot
        • 2.2.7.1、selectNodeByRequesterAndStrategy
        • 2.2.7.2、canPass
      • 2.2.8、DegradeSlot
  • 总结


前言

  Sentinel作为Spring cloud alibaba中流控的组件,在微服务架构中也有广泛的应用。其核心源码主要体现在客户端。客户端在启动时,和Nacos类似,也会将自己的信息注册到服务端。而服务端的页面上配置各种规则时,实际上也是将信息发送到了客户端。
在这里插入图片描述
  我们最常使用的@SentinelResource注解:
在这里插入图片描述
  底层也是基于AOP + 责任链模式实现的。**Sentinel的难点不在于处理流程,而在于限流的算法。**本篇仅介绍Sentinel责任链的核心流程。


一、客户端与Spring Boot整合

  在Spring Boot项目中,如果需要引入Sentinel,通常需要在pom文件中加入:

        <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>

  该组件也是利用了Spring Boot的自动配置:
在这里插入图片描述
  其中的SentinelAutoConfiguration是核心:
在这里插入图片描述
  在SentinelAutoConfiguration中,会注册SentinelResourceAspect Bean:
在这里插入图片描述
  SentinelResourceAspect实际上是一个切面,匹配了所有加入了@SentinelResource注解的方法:
在这里插入图片描述
  invokeResourceWithSentinel是一个环绕通知。。在执行目标方法之前,首先会得到目标方法对象,以及处理注解中的一些信息,然后调用SphU.entry方法。该方法是Sentinel流程的核心。
在这里插入图片描述
  点击进去,会调用到entry方法:
在这里插入图片描述
  Env在实例化之前,会触发static中的逻辑:
在这里插入图片描述
  在doInit方法中,又会通过SPI机制,加载InitFunc中的类:
在这里插入图片描述
在这里插入图片描述
  其中的HeartbeatSenderInitFunc是定期向服务端发送心跳的:
在这里插入图片描述
在这里插入图片描述
  CommandCenterInitFunc,是将客户端各种接收规则的接口信息,暴露给服务端:
在这里插入图片描述
  上面的逻辑,包括后续构建,执行责任链,是在切面中,并非是在应用启动时执行的,而是在执行加入了@SentinelResource注解的方法时才会去执行!

二、SphU.entry

  SphU.entry方法内部主要做了两件事:

  • 构建责任链。
  • 按照顺序依次调用责任链。

在这里插入图片描述

2.1、构建责任链

  在进入lookProcessChain方法后,首先通过双检锁模式,判断当前加入了@SentinelResource注解的方法,是否已经为其构建过责任链,如果没有,才会执行newSlotChain方法。也就是说,是每一个加入了注解的方法,都有一个对应的责任链,并且只在应用启动后该方法第一次被调用时初始化。
在这里插入图片描述
  最终调用的是DefaultSlotChainBuilderbuild方法:
在这里插入图片描述
  在该方法中,主要做了两件事:
在这里插入图片描述

  通过SPI机制,加载ProcessorSlots文件中的类(责任链中的具体组成类)。

在这里插入图片描述
  真正地去构建责任链:在执行ProcessorSlotChain chain = new DefaultProcessorSlotChain();这一段代码时,实际上是构造了:
在这里插入图片描述
  构造出的是下图的数据结构,end是指向first的引用:
在这里插入图片描述
  在构造完成后,就会利用chain.addLast((AbstractLinkedProcessorSlot<?>) slot);方法,向上图的数据结构中插入具体的责任链类了:
在这里插入图片描述
  首先将end的next指针指向NodeSelectorSlot,因为end是指向指向first的引用,实际上first的next指针也指向了NodeSelectorSlot:
在这里插入图片描述
  然后将end指向NodeSelectorSlot:
在这里插入图片描述
  以此类推,最终构建出的责任链是:
在这里插入图片描述
图片来源:图灵学院

2.2、调用责任链

  这里我们重点关注FlowSlot和DegradeSlot,它们是sentinel核心功能-限流熔断降级的体现。

2.2.1、NodeSelectorSlot

  首先调用的是NodeSelectorSlot,它的作用是构建资源调用的统计节点,用于记录调用链路信息,并且将资源关联到相应的 DefaultNode。
在这里插入图片描述
  fireEntry就是在满足条件的情况下,继续调用后续的责任链。

2.2.2、ClusterBuilderSlot

  ClusterBuilderSlotNodeSelectorSlot是类似的,它的作用是构建统计节点的聚合关系。但是NodeSelectorSlot 是按调用链统计,ClusterBuilderSlot 是按资源维度统计。
在这里插入图片描述

2.2.3、LogSlot

  LogSlot的作用,是在后续的责任链调用过程中出现异常时,进行日志的记录,体现在它的try…catch中:
在这里插入图片描述

2.2.4、StatisticSlot

  StatisticSlot是先将请求放行到后续的责任链,在后续的责任链调用完成后,再去进行统计资源的调用情况的操作。例如记录 QPS(每秒请求数)、RT(响应时间)、线程数、异常数等。
在这里插入图片描述
  包括抛出了各种异常之后的记录,这些记录都是执行降级、限流等控制的基础数据来源。
在这里插入图片描述

2.2.5、AuthoritySlot

  AuthoritySlot是进行授权规则的检查,例如黑白名单:
在这里插入图片描述


  简单回顾一下黑白名单的使用,首先需要在sentinel控制台的授权规则选项卡进行配置:
在这里插入图片描述
  这里的资源名,是http请求的路径,而流控应用,可以是特定的ip,也可以是请求路径:

@Component
public class IPLimiter implements RequestOriginParser {/***	获取当前服务实例的ip*/@Overridepublic String parseOrigin(HttpServletRequest httpServletRequest) {return httpServletRequest.getRemoteAddr();}
}

  在checkBlackWhiteAuthority方法中,首先会获取所有设置的规则,然后根据当前的资源名,获取该资源对应的所有规则
在这里插入图片描述
  然后进行检查:
在这里插入图片描述
  这里的黑白名单体现在RuleConstant这个常量类中:
在这里插入图片描述
  判断逻辑有点绕:

  • 如果规则中的IP或路径,和请求中的匹配,contain会为true,反之为false。
  • 在黑名单的判定中,如果contain为true,则返回false,代表请求不通过。因为黑名单就是要对能和规则匹配上的请求进行拦截。
  • 在白名单的判断中,如果contain为false,则返回false,代表请求不通过。因为contain为false,代表请求和规则匹配不上,也就是不在白名单中。

在这里插入图片描述

2.2.6、SystemSlot

  SystemSlot是对系统规则进行控制,包括系统整体的 QPS,平均响应时间(RT),当前系统的并发线程数等。
在这里插入图片描述
在这里插入图片描述

2.2.7、FlowSlot

  FlowSlot是 Sentinel 的核心功能之一,用于流量控制(限流)规则判断。
在这里插入图片描述
  同样会获取到控制台设置的所有规则,然后逐个进行匹配:
在这里插入图片描述
  最终调用到的是passLocalCheck,其中也有两个关键方法:
在这里插入图片描述

2.2.7.1、selectNodeByRequesterAndStrategy

  selectNodeByRequesterAndStrategy用于在执行限流时 选择哪个节点(Node)来做统计和判断。不同的来源(origin)和限流策略(strategy)决定了限流数据统计的维度。首先会获取到流控模式,也就是控制台设置的:
在这里插入图片描述

  • 匹配指定 origin 的限流
    • 如果是直接模式,就利用context.getOriginNode(); 调用方自己的统计节点限流。
    • 如果是其他策略,利用selectReferenceNode再次匹配:

在这里插入图片描述

  • 如果来源是default
    • 直接限流时,使用当前资源的全局统计节点
    • 非直接限流,使用关联资源的统计节点。
  • 如果来源是other
    • 直接限流时,使用当前资源的全局统计节点
    • 非直接限流,使用关联资源的统计节点。
2.2.7.2、canPass

  在拿到上一步推断出的节点后,会调用canPass方法,这里的canPass也有不同的实现:
在这里插入图片描述
  对应控制台中的:
在这里插入图片描述
  这里涉及到滑动窗口,令牌桶,漏桶算法,会在后续进行说明。 Sentinel的难点不在于流程,而是算法。

2.2.8、DegradeSlot

  DegradeSlot的作用是熔断降级控制。也是 Sentinel 的核心功能之一:在这里插入图片描述
  在tryPass方法中,会对逐条规则进行校验,如果此时的断路器处于打开状态,
在这里插入图片描述
  并且超过了熔断时间,会修改状态为半开
在这里插入图片描述

  熔断降级中有一个重要的概念,也就是断路器。在Sentinel 1.8 版本之后,断路器有三种状态,都记录在CircuitBreaker的内部State枚举类中:在这里插入图片描述
  在这里简单的说一下三种状态的转换:

  1. 正常情况下,断路器处于关闭状态,所有请求正常通过。
  2. 当请求触发了降级条件(如异常比例过高、RT过大) 后,断路器会进入打开状态,在接下来的熔断时长内(如 10 秒),所有请求都被拒绝(降级)。
  3. 当熔断时长结束后,下一个请求到达时,断路器进入半开状态:
    • 如果该请求再次触发降级条件,断路器重新回到打开状态。
    • 如果该请求通过且正常,断路器会恢复为关闭状态。

Closed → [触发降级条件] → Open → [熔断时长结束,下一请求] → Half-Open
↑ ↓
└────── [探测失败] ←──── [探测成功] ←──────────────┘

总结

  本篇介绍了Sentinel 实现控制台功能,在服务端的实现原理:通过AOP + 责任链模式实现。并且在调用目标方法时,为每一个请求都创建一份责任链,放入缓存,依次调用。
  后面几个责任链的实现,在规则校验不通过时,都会抛出异常,而真正处理的逻辑,在StatisticSlot的catch中,以及SentinelResourceAspect#invokeResourceWithSentinelentry.exit中,包括处理断路器的状态。

下一篇:Sentinel核心源码分析(下)

相关文章:

Sentinel核心源码分析(上)

文章目录 前言一、客户端与Spring Boot整合二、SphU.entry2.1、构建责任链2.2、调用责任链2.2.1、NodeSelectorSlot2.2.2、ClusterBuilderSlot2.2.3、LogSlot2.2.4、StatisticSlot2.2.5、AuthoritySlot2.2.6、SystemSlot2.2.7、FlowSlot2.2.7.1、selectNodeByRequesterAndStrat…...

TCPIP详解 卷1协议 一 概述

相关概念 协议族&#xff1a;一系列相关协议的集合称为一个协议族体系结构&#xff1a;指定一个协议族中的各种协议之间的相互关系并划分需要完成的任务的设计&#xff0c;称为协议族的体系结构。分组交换&#xff1a;数据被分割为固定或可变长度的分组 &#xff0c;每个分组包…...

条件生成对抗网络(Conditional GAN, CGAN)原理及实现(pytorch版)

CGAN 原理及实现 一、CGAN 原理1.1 基本概念1.2 与传统GAN的区别1.3 目标函数1.4 损失函数1.5 条件信息的融合方式1.6 与其他GAN变体的对比1.7 CGAN的应用1.8 改进与变体二、CGAN 实现2.1 导包2.2 数据加载和处理2.3 构建生成器2.4 构建判别器2.5 训练和保存模型2.6 绘制训练损…...

类与对象(上)

【本节目标】 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 5.类的作用域 6.类的实例化 7.类的对象大小的计算 8.类成员函数的this指针 1.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;…...

MySQL基础 [三] - 数据类型

目录 数据类型分类 ​编辑 数值类型 tinyint bit 浮点类型 float decimal 字符串类型 char varchar varchar和char的比较和选择 日期和时间类型 enum和set enum类型 set类型 enum和set的类型查找 数据类型分类 数值类型 tinyint TINYINT[(M)] [UNSIGNED]是 …...

1.1 测试计划阶段:如何制定高效的测试策略

测试计划阶段&#xff1a;如何制定高效的测试策略 摘要 本文详细介绍了软件测试流程中的测试计划阶段&#xff0c;包括测试策略制定、资源规划、进度安排和风险管理等内容。通过本文&#xff0c;读者可以系统性地了解如何制定有效的测试计划&#xff0c;确保测试工作有序进行…...

Spring 概念

Spring 是一个功能强大、灵活且广泛使用的 Java 企业级开发框架&#xff0c;它诞生于 2003 年&#xff0c;由 Rod Johnson 创建&#xff0c;初衷是简化 Java EE 的开发过程。 一、Spring 是什么&#xff1f; 简单来说&#xff1a; Spring 是一个轻量级的 Java 开发框架&#…...

animals_classification动物分类

数据获取 深度学习训练中第一个是获取数据集&#xff0c;数据集的质量很重要&#xff0c;我们这里做的是动物分类&#xff0c;大致会选择几个动物&#xff0c;来做一个简单的多分类问题&#xff0c;数据获取的方法&#xff0c;鼠鼠我这里选择使用爬虫的方式来对数据进行爬取&a…...

15.QT窗口:主窗口、浮动窗口、对话框

0. 概述 Qt窗口是通过 QMainWindow类 来实现的。 QMainWindow 是一个为用户提供主窗口程序的类&#xff0c;继承自QWidget类&#xff0c;并且提供了一个预定义的布局。QMainWindow包含一个菜单栏&#xff08;menu bar&#xff09;、多个工具栏&#xff08;tool bars&#xff…...

nginx中地理位置访问控制模块geo

1.安装 GeoIP2 模块 Ubuntu/Debian 系统&#xff1a; sudo apt-get update sudo apt-get install nginx-module-geoip2 sudo apt-get install libnginx-mod-http-geoip2CentOS/RHEL 系统&#xff1a; sudo yum install nginx-module-geoip22.下载 GeoIP2 数据库 下载 GeoIP2 …...

基于SpringBoot酒店管理系统设计和实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...

蓝桥杯嵌入式第十四届模拟二

一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹,code中添加fun.c、fun.h、headfile.h文件,去资源包中把lc…...

【前端】Node.js一本通

近两天更新完毕&#xff0c;建议关注收藏点赞。 目录 复习Node.js概述使用fs文件系统模块path路径模块http模块模块化 复习 为什么JS可以在浏览器中执行 原理&#xff1a;待执行的JS代码->JS解析引擎 不同的浏览器使用不同的 JavaScript 解析引擎&#xff1a;其中&#xf…...

Groovy

一&#xff1a;了解 1:groovy保留字 2: 标识符 二&#xff1a;数据类型 1:字符串(1) 1: java.lang.string 定义的字符串是不能改变的 2: groovy.lang.GString 定义的字符串的值是不能改变的 2: 总结 三&#xff1a;数值类型 1: Groovy的数值型包括整数型&#xff08;integer)…...

【并发编程 | 第七篇】深入学习线程池(一)

什么是线程池&#xff1f; 线程池是用来管理和复用线程的⼯具&#xff0c;它可以减少线程的创建和销毁开销。 在 Java 中&#xff0c;ThreadPoolExecutor 是线程池的核⼼实现&#xff0c;它通过核⼼线程数、最⼤线程数、任务队列和拒绝策略来 控制线程的创建和执⾏。 举个栗…...

C++ 获取一整行(一行)字符串并转换为数字

代码很简单&#xff0c;主要是自己总是忘记&#xff0c;记录一下&#xff1a; #include <iostream> #include <cstdlib> #include <cstring>#include <string> #include <vector> #include <sstream>using namespace std;void print_int_…...

初探:简道云平台架构及原理

一、系统架构概述 简道云作为一款低代码开发平台&#xff0c;其架构设计以模块化和云端协同为核心&#xff0c;主要分为以下层次&#xff1a; 1. 前端层 可视化界面&#xff1a;基于Web的拖拽式表单设计器&#xff0c;支持动态渲染&#xff08;React/Vue框架&#xff09;。多…...

鸿蒙Arkts开发飞机大战小游戏,包含无敌模式,自动射弹,暂停和继续

飞机大战可以把飞机改成图片&#xff0c;目前包含无敌模式&#xff0c;自动射弹&#xff0c;暂停和继续的功能 代码如下&#xff1a; // 定义位置类 class GamePosition {x: numbery: numberconstructor(x: number, y: number) {this.x xthis.y y} }Entry Component struct…...

使用`sklearn`中的逻辑回归模型进行股票的情感分析,以及按日期统计积极和消极评论数量的功能

以下是完成上述任务的Python代码&#xff0c;可在Jupyter Notebook中运行。此代码包含了使用sklearn中的逻辑回归模型进行情感分析&#xff0c;以及按日期统计积极和消极评论数量的功能。 import pandas as pd from sklearn.feature_extraction.text import TfidfVectorizer f…...

简洁的 PlantUML 入门教程

评论中太多朋友在问&#xff0c;我的文章中图例如何完成的。 我一直用plantUML,也推荐大家用&#xff0c;下面给出一个简洁的PlantUML教程。 &#x1f331; 什么是 PlantUML&#xff1f; PlantUML 是一个用纯文本语言画图的工具&#xff0c;支持流程图、时序图、用例图、类图、…...

Python 面向对象 - 依赖倒置原则 (DIP)

1. 核心概念 依赖倒置原则(Dependency Inversion Principle, DIP) 是SOLID原则中的"D"&#xff0c;包含两个关键点&#xff1a; 高层模块不应依赖低层模块&#xff0c;二者都应依赖抽象抽象不应依赖细节&#xff0c;细节应依赖抽象 2. 使用场景 典型应用场景 系…...

自动化框架及其设计搭建浅谈(二)--分层自动化测试

目录 测试金字塔模型 分层自动化测试的模型 分层自动化测试的最佳实践 自动化分层测试的误区 自动化框架的设计与自动化分层 自动化测试的设计建议 分层自动化测试&#xff0c;顾名思义&#xff0c;就是分层的自动化测试&#xff0c;那么自动化测试为什么要分层呢&#x…...

ResNet改进(19):基于PyTorch的ResNet改进方案详解:Mish激活+SPP模块+MixUp数据增强

1. 前言 ResNet作为深度学习领域里程碑式的网络架构,在图像分类等计算机视觉任务中表现出色。然而,随着研究的深入和技术的发展,原始的ResNet架构仍有改进空间。本文将详细介绍一种基于PyTorch的ResNet改进方案,该方案融合了Mish激活函数、SPP模块和MixUp数据增强等先进技…...

设计模式简述(九)命令模式

命令模式 描述基本使用使用 描述 命令模式是一种体现高内聚的行为模式。 将整个请求封装成一个命令对象&#xff0c;由这个命令对象完成所需业务调用。 命令对象封装了该命令需要的所有逻辑&#xff0c;不需要调用方关注内部细节。 基本使用 定义抽象命令&#xff08;所有命…...

Codecademy—— 交互式编程学习的乐园

一、网站概述 Codecademy 是一家美国在线学习编程知识的网站&#xff0c;它为编程学习者提供了一种全新的学习方式。在如今众多的编程学习平台中&#xff0c;Codecademy 凭借其独特的优势脱颖而出&#xff0c;吸引了全球数百万用户。其目标是帮助更多人轻松学习编程&#xff0…...

分布式数据库HBase

1.概述 1.1从BigTable 说起 BigTable是一个分布式存储系统&#xff0c;BigTable起初用于解决典型的互联网搜索问题。 BigTable是一个分布式存储系统利用谷歌提出的MapReduce分布式并行计算模型来处理海量数据使用谷歌分布式文件系统GFS作为底层数据存储采用Chubby提供协同服…...

Linux进程地址空间(12)

文章目录 前言一、进程空间地址基本概念代码分析 二、如何理解地址空间三、进一步理解页表和写实拷贝对虚拟地址的进一步深入fork() 的两个返回值&#xff1f; 总结 前言 融会贯通&#xff01;   本篇会让你再次对计算机世界里面的大智慧感到汗颜&#xff01; 本篇研究环境基…...

鸿蒙开发04界面渲染

文章目录 前言一、条件渲染1.1 if/else1.2 属性控制1.3 可见性 二、循环渲染三、滚动渲染3.1 下拉刷新3.2 上拉加载 前言 在声明式描述语句中开发者除了使用系统组件外&#xff0c;还可以使用渲染控制语句来辅助UI的构建&#xff0c;这些渲染控制语句包括控制组件是否显示的条…...

CANoe CAPL——Ethernet CAPL函数

CANoe CAPL——CAN CAPL函数 事件过程&#xff08;Event Procedures&#xff09; 函数名简要描述on ethernetErrorPacket收到错误的以太网数据包时调用。on ethernetMacsecStatus当物理端口的以太网 MACsec 连接状态变化时调用。on ethernetPacket接收到以太网数据包后调用。…...

语法: setup_lcd (mode, prescale, [segments]);

SETUP_LCD( ) 语法: setup_lcd (mode, prescale, [segments]); 参数: mode可能是来自devices.h头文件如下常数: LCD_DISABLED, LCD_STATIC, LCD_MUX12, LCD_MUX13, LCD_MUX14 下面的参数:STOP_ON_SLEEP, USE_TIMER_1可同上面的LCD_DISABLED, LCD_STATIC, LCD_MUX12, LCD…...

微前端随笔

✨ single-spa&#xff1a; js-entry 通过es-module 或 umd 动态插入 js 脚本 &#xff0c;在主应用中发送请求&#xff0c;来获取子应用的包&#xff0c; 该子应用的包 singleSpa.registerApplication({name: app1,app: () > import(http://localhost:8080/app1.js),active…...

实操(不可重入函数、volatile、SIGCHLD、线程)Linux

1 不可重入函数 为什么会导致节点丢失内存泄露&#xff1f;main函数在执行insert&#xff0c;但是没执行完就被信号中断了&#xff0c;又进了这个函数里&#xff0c;所以这个insert函数在不同的执行流中&#xff0c;同一个函数被重复进入&#xff0c;如果没有问题&#xff0c;…...

如何在Linux系统上通过命令调用AI大模型?

如何在Linux系统上通过命令调用AI大模型&#xff1f; 文章目录 如何在Linux系统上通过命令调用AI大模型&#xff1f;一、准备工作二、编写API调用脚本三、配置命令行工具 使用AI命令帮我做一个文档总结提问技术问题编写简单的shell脚本帮我写一个docker-compose 在这个AI技术飞…...

数据分析-Excel-学习笔记Day1

Day1 复现报表聚合函数&#xff1a;日期联动快速定位区域SUMIF函数SUMIFS函数环比、同比计算IFERROR函数混合引用单元格格式总结汇报 拿到一个Excel表格&#xff0c;首先要看这个表格的构成&#xff08;包含了哪些数据&#xff09;&#xff0c;几行几列&#xff0c;每一列的名称…...

负载均衡是什么,Kubernetes如何自动实现负载均衡

负载均衡是什么&#xff1f; 负载均衡&#xff08;Load Balancing&#xff09; 是一种网络技术&#xff0c;用于将网络流量&#xff08;如 HTTP 请求、TCP 连接等&#xff09;分发到多个服务器或服务实例上&#xff0c;以避免单个服务器过载&#xff0c;提高系统的可用性、可扩…...

洞察 Linux 进程管理

一、进程和线程的概念 1.进程 &#xff08;1&#xff09;概念 进程是程序在操作系统中的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位。进程是程序的执行实例&#xff0c;拥有独立的资源&#xff08;如内存、文件描述符等&#xff09;。每个进程在创建时会被…...

http协议版本的区别 -- 2和3

目录 http2和http3的区别 传输层协议 QUIC协议 介绍 连接建立与握手 建立安全连接的过程 RTT 建连为什么需要两个过程 原因 解决 QUIC协议的1-RTT 建连 必要性 连接过程 第一次握手(Client Hello) 版本号 key_share 其他 第二次握手 介绍 Server Hello 身…...

Vue2-实现elementUI的select全选功能

文章目录 使用 Element UI 的全选功能自定义选项来模拟全选 在使用 Element UI 的 el-select组件时&#xff0c;实现“全选”功能&#xff0c;通常有两种方式&#xff1a;一种是使用内置的全选功能&#xff0c;另一种是通过自定义选项来模拟全选。 使用 Element UI 的全选功能…...

Spring Boot 与 TDengine 的深度集成实践(四)

优化与扩展 批量插入数据 在实际应用中&#xff0c;当需要插入大量数据时&#xff0c;逐条插入会导致性能低下&#xff0c;因为每次插入都需要建立数据库连接、解析 SQL 语句等操作&#xff0c;这些操作会带来额外的开销 。为了提高数据插入效率&#xff0c;我们可以采用批量…...

2025年【山东省安全员C证】考试题及山东省安全员C证考试内容

在当今建筑行业蓬勃发展的背景下&#xff0c;安全生产已成为企业生存与发展的基石。安全员作为施工现场安全管理的直接责任人&#xff0c;其专业能力和资质认证显得尤为重要。山东省安全员C证作为衡量安全员专业水平的重要标准&#xff0c;不仅关乎个人职业发展&#xff0c;更直…...

提升Spring Boot开发效率的Idea插件:Spring Boot Helper

一、Spring Boot Helper插件介绍 Spring Boot Helper是一款专为Spring Boot开发者设计的IntelliJ IDEA插件&#xff0c;它提供了丰富的功能来简化和加速Spring Boot应用程序的开发过程。 该插件能够智能识别Spring Boot项目结构&#xff0c;提供专属的代码生成、配置辅助和运…...

【USTC 计算机网络】第三章:传输层 - 面向连接的传输:TCP

本文介绍了面向连接的传输协议&#xff1a;TCP&#xff0c;首先介绍 TCP 报文段的结构以及如何设置超时定时器&#xff0c;接着介绍 TCP 如何实现可靠数据传输以及流量控制&#xff0c;最后介绍 TCP 中最重要的三次握手与四次挥手的连接建立与关闭过程。 1. TCP 概述与段结构 …...

Linux主要开发工具之gcc、gdb与make

此系列还有两篇&#xff0c;大家想完整掌握可以阅读另外两篇 Linux文本编辑与shell程序设计-CSDN博客 Linux基础知识详解与命令大全&#xff08;超详细&#xff09;-CSDN博客 1.gcc编译系统 1.1 文件名后缀 文件名后缀 文 件 类 型 文件名后缀 文 件 类 型 .c C源…...

23种设计模式-行为型模式-观察者

文章目录 简介问题解决代码关键实现说明 总结 简介 观察者是一种行为设计模式&#xff0c; 允许你定义一种订阅通知机制&#xff0c; 可在事件发生时通知多个“观察/订阅”该对象的其他对象。 问题 假如你有两种类型的对象: 顾客和商店。顾客对某个新品非常感兴趣&#xff0…...

去中心化预测市场

去中心化预测市场 核心概念 预测市场类型&#xff1a; 类别型市场&#xff1a;二元结果&#xff08;YES/NO&#xff09;&#xff0c;例如“BTC在2024年突破10万美元&#xff1f;” 多选型市场&#xff1a;多个选项&#xff08;如总统候选人&#xff09;&#xff0c;赔付基于…...

springboot-ai接入DeepSeek

1、引入pom依赖 <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-openai</artifactId> </dependency><dependencyManagement><dependencies><dependency><groupId>o…...

【C语言】数据在内存中的储存(整形)

目录 前言&#xff1a; 预备知识 整数在内存中的储存 原码 反码 补码 总结&#xff1a; 前言&#xff1a; 在上两章中讲解了五大内存函数&#xff0c;其中memchr函数&#xff0c;这个函数考察到数据内存的存储。 接下来为大家讲解整数在内存中的储存。 预备知识 认识…...

PCL 树木树干粗提取(地基数据,TLS)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 主要的思路如下: 1、首先,使用之前的CSF算法提取点云的地面点,在提取的过程中我们可以得到一个布料结构(地面模型)。 2、在得到这个布料结构之后,我们也就可以得到整个地面模型的高度了,之后我们只需要遍历每…...

Spring 中的 IOC

&#x1f331; 一、什么是 IOC&#xff1f; &#x1f4d6; 定义&#xff08;通俗理解&#xff09;&#xff1a; IOC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09; 是一种设计思想&#xff1a;对象不再由你自己创建和管理&#xff0c;而是交给 Spring 容器…...

尚硅谷2019版Java集合和泛型

第十一章 Java集合框架 集合框架全景图 mindmaproot((Java集合))Collection单列List有序可重复ArrayListLinkedListVectorSet无序唯一HashSetLinkedHashSetTreeSetMap双列HashMapLinkedHashMapTreeMapHashtablePropertiesToolsCollectionsArrays三大核心接口对比 特性ListSe…...