【Spring Cloud Alibaba】限流--Sentinel

文章目录

  • 概述
  • 一、Sentinel 是啥?
  • 二、Sentinel 的生态环境
  • 三、Sentinel 核心概念
    • 3.1、资源
    • 3.2、规则
  • 四、Sentinel 限流
    • 4.1、单机限流
      • 4.1.1、引入依赖
      • 4.1.2、定义限流规则
      • 4.1.3、定义限流资源
      • 4.1.4、运行结果
    • 4.2、控制台限流
      • 4.2.1、客户端接入控制台
      • 4.2.2、引入依赖
      • 4.2.3、定义资源
      • 4.2.4、运行结果
      • 4.2.5、限流配置
    • 4.3、集群限流
      • 4.3.1、阿里云AHAS
      • 4.3.2、开启阿里云AHAS 服务
      • 4.3.3、集群流控规则配置
      • 4.3.4、Server 角色转换
  • 五、Sentinel 熔断
    • 5.1、熔断降级
    • 5.2、熔断策略
  • 总结

概述

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Sentinel具有如下特性:

  • 丰富的应用场景:承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀,可以实时熔断下游不可用应用;
  • 完备的实时监控:同时提供实时的监控功能。可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况;
  • 广泛的开源生态:提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合;
  • 完善的 SPI 扩展点:提供简单易用、完善的 SPI 扩展点。您可以通过实现扩展点,快速的定制逻辑。

你来说说什么是限流? 限流的整体概述中,描述了限流是什么,限流方式和限流的实现。给大伙细细讲解一下 Sentinel

一、Sentinel 是啥?

分布式系统的流量防卫兵如图

在这里插入图片描述

二、Sentinel 的生态环境

随着 Alibaba 的 Java 生态建设,包括 Spring Cloud Alibaba,Rocket,Nacos等多项开源技术的贡献,目前Sentinel 对分布式的各种应用场景都有了良好的支持和适配,这也是为什么我们选择 Sentinel 学习的原因之一(学习成本低,应用场景多)

在这里插入图片描述

三、Sentinel 核心概念

3.1、资源

资源 是 Sentinel 中的核心概念之一。最常用的资源是我们代码中的 Java 方法,一段代码,或者一个接口。

Java方法:

@SentinelResource("HelloWorld")
public void helloWorld() {
    // 资源中的逻辑
    System.out.println("hello world");
}

一段代码:

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

一个接口:

@RestController
public class TestController {
    @GetMapping("/test")
    public String test(){
        return "test";
    }
}

配合控制台使用:

在这里插入图片描述

3.2、规则

Sentinel 中的规则 提供给用户,针对不同的场景而制定不同的保护动作,规则的类型包括:

  • 流量控制规则
  • 熔断降级规则
  • 系统保护规则
  • 来源访问控制规则
  • 热点参数规则

本文主要会讲解 流量,熔断 和系统保护这三个规则。

定义规则:

private static void initFlowRules(){
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        //绑定资源
        rule.setResource("HelloWorld");
        //限流阈值类型
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        //数量级别
        rule.setCount(20);
        //添加到本地内存
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }

限流规则重要属性说明:
在这里插入图片描述

四、Sentinel 限流

4.1、单机限流

4.1.1、引入依赖

在上一篇文章中,有提到过 RateLimiter 实现的单机限流, 这里介绍一下,使用 Sentinel 实现的单机限流

//项目中引入 sentinel-core 依赖
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.1</version>
</dependency>

4.1.2、定义限流规则

定义保护规则:

private static void initFlowRules(){
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        //绑定资源
        rule.setResource("HelloWorld");
        //限流阈值类型
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        //数量级别
        rule.setCount(20);
        //添加到本地内存
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }

4.1.3、定义限流资源

根据上面描述的 资源划分, 我们这里主要将 代码块 定义为资源。

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

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

4.1.4、运行结果

Demo 运行之后,我们可以在日志 ~/logs/csp/${appName}-metrics.log.xxx 里看到下面的输出:
在这里插入图片描述

➜  csp cat com-jaycekon-sentinel-demo-FlowRuleDemo-metrics.log.2021-07-03

|--timestamp-|------date time----|-resource-|p |block|s |e|rt
1625294582000|2021-07-03 14:43:02|HelloWorld|20|1720|20|0|2|0|0|0
1625294583000|2021-07-03 14:43:03|HelloWorld|20|5072|20|0|0|0|0|0
1625294584000|2021-07-03 14:43:04|HelloWorld|20|6925|20|0|0|0|0|0
  • p 代表通过的请求
  • block 代表被阻止的请求
  • s 代表成功执行完成的请求个数
  • e 代表用户自定义的异常
  • rt 代表平均响应时长

Sentinel 的单机限流 ,和 RateLimiter 有什么区别呢?

在这里插入图片描述

4.2、控制台限流

4.2.1、客户端接入控制台

Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能。

下载Jar 包(21M),或者下载源码(4M) 后自行进行编译(不建议,编译花的时间比直接下载jar包还要久)

https://github.com/alibaba/Sentinel/releases

编译后,启动命令

java -Dserver.port=8000 -Dcsp.sentinel.dashboard.server=localhost:8000 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar

进入控制台

在这里插入图片描述

4.2.2、引入依赖

客户端需要引入 Transport 模块来与 Sentinel 控制台进行通信。您可以通过 pom.xml 引入 JAR 包

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
    <version>1.8.1</version>
</dependency>

//重要的依赖,还是提前先写上吧,避免小伙伴找不到了
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-web-servlet</artifactId>
    <version>1.8.1</version>
</dependency>

对应的适配依赖有

  • 云原生微服务体系
  • Web 适配
  • RPC 适配
  • HTTP client 适配
  • Reactive 适配
  • Reactive 适配
  • Apache RocketMQ

好家伙,基本上所有业务场景都覆盖到了! 由于我的Demo 项目是基于 SpringBoot ,然后想看看 云原生微服务体系下的视频,好家伙,要用 SpringCloud , 想要了解的,可以参考: 《Spring-Cloud-Sentinel》

4.2.3、定义资源

@SpringBootApplication
@Configuration
@RestController
public class SpringBootSentinelApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootSentinelApplication.class, args);
    }

    @Bean
    public FilterRegistrationBean sentinelFilterRegistration() {
        FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new CommonFilter());
        registration.addUrlPatterns("/*");
        registration.setName("sentinelFilter");
        registration.setOrder(1);

        return registration;
    }

    @RequestMapping("/index")
    public String index(){
        return "hello index";
    }

}

在概述中,我们有提到过,需要被保护的资源,可以是 一个代码块,一个方法或者一个接口。这里通过 Filter 的 方式,将所有请求都定义为资源 (/*), 那么我们在请求的过程就会变成这样子:

在这里插入图片描述

4.2.4、运行结果

添加启动参数

-Dserver.port=8088 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=jaycekon-sentinel

参数说明:

  • server.port : 服务启动端口
  • csp.sentinel.dashboard.server : 状态上报机器ip:端口
  • project.name : 监控项目名称

在这里插入图片描述

运行结果:

在这里插入图片描述

4.2.5、限流配置

在这里插入图片描述

流控效果

  1. 快速失败:直接失败
  2. Warm Up:预热模式,根据codeFactory的值(默认3),从阈值/codeFactory,经过预热时长,才达到设置的QPS阈值。比如设置QPS为90,设置预热为10秒,则最初的阈值为90/3=30,经过10秒后才达到90。
  3. 排队等待:比如设置阈值为10,超时时间为500毫秒,当第11个请求到的时候,不会直接报错,而是等待500毫秒,如果之后阈值还是超过10,则才会被限流。
    运行结果:

在这里插入图片描述

在这里插入图片描述

4.3、集群限流

讲了那么多,终于要到核心的 集群限流方案了, 在秒杀系统设计中,我们谈到很多场景都是以单机作为具体案例进行分析,如果我们的系统要扩容,那么如何做好限流方案。假设集群中有 10 台机器,我们给每台机器设置单机限流阈值为10 QPS,理想情况下整个集群的限流阈值就为100 QPS。不过实际情况下流量到每台机器可能会不均匀,会导致总量没有到的情况下某些机器就开始限流。因此仅靠单机维度去限制的话会无法精确地限制总体流量。而集群流控可以精确地控制整个集群的调用总量,结合单机限流兜底,可以更好地发挥流量控制的效果。

介绍一下集群限流的核心角色:

  • Token Client:集群流控客户端,用于向所属 Token Server 通信请求 token。集群限流服务端会返回给客户端结果,决定是否限流。
  • Token Server:即集群流控服务端,处理来自 Token Client 的请求,根据配置的集群规则判断是否应该发放 token(是否允许通过)。
    在嵌入模式下的结构图:

在这里插入图片描述

在独立模式下的结构图:

在这里插入图片描述

内嵌模式,即 发Token 的操作,有其中某一个实例完成,其他 Client 通过向 Server 请求,获取访问许可。

独立模式,即作为独立的 token server 进程启动,独立部署,隔离性好,但是需要额外的部署操作。

4.3.1、阿里云AHAS

在上述示例代码中,使用了本地模式的 Demo, 在集群限流的场景,这里用一下 阿里云提供的 AHAS 服务。

控制台地址: https://ahas.console.aliyun.com/index?ns=default&region=public

引入依赖:

//sentinel ahas 依赖,包括了sentinel的使用依赖
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>ahas-sentinel-client</artifactId>
    <version>1.8.8</version>
</dependency>

这里有个要注意的点, AHAS 的依赖,包含了 Sentinel ,所需要使用到的依赖,包括 sentinel-core,sentinel-web-servlet和sentinel-transport-simple-http。

否则会出现 Spi 异常 , 如果对 Spi 不太了解,建议加群提问,嘿嘿~

com.alibaba.csp.sentinel.spi.SpiLoaderException

在这里插入图片描述

在这里插入图片描述

4.3.2、开启阿里云AHAS 服务

这里有官方的开通文档,我就不赘述了,文档地址

在应用防护这里找到 Lincense ,然后添加启动参数:

-Dserver.port=8092 -Dproject.name=jaycekon-sentinel -Dahas.license=d1e21b0c8f2e4d87b5ac460b118dc58d -Dcsp.sentinel.log.use.pid=true

在这里插入图片描述

由于我们要本地启动多实例, 因此需要修改服务的多个端口:

java -Dserver.port=8090 -Dproject.name=jaycekon-sentinel -Dahas.license=d1e21b0c8f2e4d87b5ac460b118dc58d  -Dcsp.sentinel.log.use.pid=true -jar sentinel-ahas-0.0.1-SNAPSHOT.jar

java -Dserver.port=8091 -Dproject.name=jaycekon-sentinel -Dahas.license=d1e21b0c8f2e4d87b5ac460b118dc58d  -Dcsp.sentinel.log.use.pid=true -jar sentinel-ahas-0.0.1-SNAPSHOT.jar

java -Dserver.port=8092 -Dproject.name=jaycekon-sentinel -Dahas.license=d1e21b0c8f2e4d87b5ac460b118dc58d  -Dcsp.sentinel.log.use.pid=true -jar sentinel-ahas-0.0.1-SNAPSHOT.jar

产生访问流量后,可以在大盘看到机器的链接状态:

http://localhost:8092/index

在这里插入图片描述

4.3.3、集群流控规则配置

在这里插入图片描述

这里有个两个概念:

  • 集群阀值:指的是,我们集群总体能通过的访问量,可能存在分配不均的情况(能避免单机误限)。
  • 退化单机:当 Token Server 访问超时,即无法从远端获取令牌时,回退到单机限流
    测试限流, 只访问 http://localhost:8092/index
    通过手刷(手速过硬~),触碰到限流的临界值,然后整体限流跟我们预期一致。

在这里插入图片描述

退化单机

在集群流控这里,有个 Token 请求超时时间,Client 请求 Server ,然后返回数据结果。整个流程会有网络请求的耗时,在上面的测试流程中,我将超时时间调大了,每次请求都能拿到Token, 通过修改请求超时时间,触发退化 单机限流 。

在这里插入图片描述

运行结果:

在这里插入图片描述

4.3.4、Server 角色转换

在内嵌模式下,通过 HTTP API的方式,将角色转换为 Server 或 client

http://<ip>:<port>/setClusterMode?mode=<xxx>

其中 mode 为 0 代表 client,1 代表 server,-1 代表关闭。注意应用端需要引入集群限流客户端或服务端的相应依赖。

在独立模式下,我们可以直接创建对应的 ClusterTokenServer 实例并在 main 函数中通过 start 方法启动 Token Server。

五、Sentinel 熔断

在秒杀系统 的案例中,一个完整的链路可能包含了 下订单,支付 和物流对接等多个服务(实际上不止那么少)。在一个完整的链路中,各个系统通过 rpc/http的形式进行交互,在下面的链路图中,如果用户选择的 支付方式,存在延时过高,服务不稳定,或服务异常等情况,会导致整个链路没办法完成。最终的结果就是,用户明明抢到了,但是没办法支付,导致订单丢失。

在这里插入图片描述

现代微服务架构都是分布式的,由非常多的服务组成。不同服务之间相互调用,组成复杂的调用链路。以上的问题在链路调用中会产生放大的效果。复杂链路上的某一环不稳定,就可能会层层级联,最终导致整个链路都不可用。因此我们需要对不稳定的弱依赖服务调用进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩。熔断降级作为保护自身的手段,通常在客户端(调用端)进行配置。

5.1、熔断降级

添加测试代码

@RequestMapping("/myError")
    public String error(){
        if (true){
            throw new RuntimeException("sentinel run error");
        }
        return "error";
    }

在 Sentinel-Dashboard中配置降级规则

在这里插入图片描述

在这里插入图片描述

降级保护效果:

用户通过访问接口 /myError , 出现一次异常后,在接下来的10秒 ,都会走降级策略,直接返回。能够很好的保护服务端避免异常过多,占用机器资源。同时快速响应用户请求。

在这里插入图片描述

5.2、熔断策略

Sentinel 提供以下几种熔断策略:

  • 慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
  • 异常比例 (ERROR_RATIO):当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
  • 异常数 (ERROR_COUNT):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。

总结

本文主要详细讲解了一下 如何通过 Sentinel 去实际接触 限流和熔断,对于限流的底层实现,后续会有专门的源码分析篇。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于深度学习的CCPD车牌检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于CCPD数据集的高精度车牌检测系统可用于日常生活中检测与定位车牌目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的车牌目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型训练数据集…

【Spring篇】初识 Spring IoC 与 DI

目录 一. Spring 是什么 ? 二. 何为 IoC ? 三. 如何理解 Spring IoC ? 四. IoC 与 DI 五 . 总结 一. Spring 是什么 ? 我们通常所说的 Spring 指的是 Spring Framework&#xff08;Spring 框架&#xff09;&#xff0c;它是⼀个开源框架&#xff0c;有着活跃⽽ 庞⼤…

逻辑回归概述

逻辑回归介绍 1. 逻辑回归的应用场景 逻辑回归(Logistic Regression)是机器学习中的 一种分类模型 ,逻辑回归是一种分类算法,虽然名字中带有回归。由于算法的简单和高效,在实际中应用非常广泛 广告点击率是否为垃圾邮件是否患病信用卡账单是否会违约 逻辑回归就是解决二…

day14 | 100.二叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数

文章目录 一、二叉树的最大深度二、二叉树的最小深度三、完全二叉树的节点数 一、二叉树的最大深度 100.二叉树的最大深度 因为题给出的高度和深度是一样的&#xff0c;所以求得结果都能过。 class Solution { public:int getHeight(TreeNode *node){if (node nullptr)retu…

Pytest学习教程_基础知识(一)

前言 pytest是一个用于编写和执行Python单元测试的框架。它提供了丰富的功能和灵活性&#xff0c;使得编写和运行测试变得简单而高效。 pytest的一些主要特点和解释如下&#xff1a; 自动发现测试&#xff1a;pytest会自动查找以"test_"开头的文件、类和函数&#x…

腾讯 SpringBoot 高阶笔记,限时开源 48 小时,真香警告

众所周知&#xff0c;SpringBoot 最大的一个优势就是可以进行自动化配置&#xff0c;简化配置&#xff0c;不需要编写太多的 xml 配置文件&#xff1b;基于 Spring 构建&#xff0c;使开发者快速入门&#xff0c;门槛很低&#xff1b;SpringBoot 可以创建独立运行的应用而不需要…

【学习笔记】目标跟踪领域SOTA方法比较

目录 前言方法1 TraDeS:2 FairMOT:3 SMILEtrack:4 ByteTrack: 前言 常用于行人跟踪的多目标跟踪数据集包括&#xff1a;MOT 15/16/17/20、PersonPath22等… 为更好比较现有SOTA算法的检测性能&#xff0c;本博客将针对在各数据集上表现较优的算法模型进行介绍。&#xff08;表…

ip校园广播音柱特点

ip校园广播音柱特点IP校园广播音柱是一种基于IP网络技术的音频播放设备&#xff0c;广泛应用于校园、商业区、公共场所等地方。它可以通过网络将音频信号传输到不同的音柱设备&#xff0c;实现远程控制和集中管理。IP校园广播音柱具备以下特点和功能&#xff1a;1. 网络传输&am…

SSM框架 基础

1.数据库 2.工程 3.pom 4.web.xml 5.spring配置文件头部 6.实体类 7.StudentMapper接口 8. StudentMapper.xml 9.StudentService 10. StudentServiceImpl 11.StudentController 实战 查询所有 StudentMapper StudentService StudentServiceImpl StudentMapper.xml Stude…

效率与质量兼备的6个设计工具!

今天本文为大家推荐的这6个设计工具&#xff0c;将帮助设计师实现高效工作&#xff0c;同时也更好地展示自己的创作力&#xff0c;一起来看看吧&#xff01; 1、即时设计 即时设计是一款国内的设计工具&#xff0c;它为设计师提供了非常多实用的设计功能和精致的设计素材&…

TCP状态转换图

TCP状态转换图 了解TCP状态转换图可以帮助开发人员查找问题. 说明: 上图中粗线表示主动方, 虚线表示被动方, 细线部分表示一些特殊情况, 了解即可, 不必深入研究. 对于建立连接的过程客户端属于主动方, 服务端属于被动接受方(图的上半部分) 而对于关闭(图的下半部分), 服务端…

day41-Verify Account Ui(短信验证码小格子输入效果)

50 天学习 50 个项目 - HTMLCSS and JavaScript day41-Verify Account Ui&#xff08;短信验证码小格子输入效果&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name&qu…

【西安交通大学】:融合传统与创新的学府之旅

【西安交通大学】&#xff1a;融合传统与创新的学府之旅 引言历史与发展学校特色学科优势院系专业校园环境与设施学生生活与社团活动校友荣誉与成就未来发展展望总结&#x1f340;小结&#x1f340; &#x1f389;博客主页&#xff1a;小智_x0___0x_ &#x1f389;欢迎关注&…

Linux基础以及常用命令

目录 1 Linux简介1.1 不同应用领域的主流操作系统1.2 Linux系统版本1.3 Linux安装1.3.1 安装VMWare1.3.2 安装CentOS镜像1.3.3 网卡设置1.3.4 安装SSH连接工具1.3.5 Linux和Windows目录结构对比 2 Linux常用命令2.0 常用命令&#xff08;ls&#xff0c;pwd&#xff0c;cd&#…

你说你会Java手动锁,但你会这道题吗???

按照这个格式输出你会吗&#xff1f;&#xff1f;&#xff1f; 你说你不会&#xff0c;接下来认真看认真学了。 1.首先引入原子类。AtomicInteger num new AtomicInteger(0); 什么是原子类&#xff1f; 就是可以保证线程安全的原子操作的数据类型。 有什么作用&#xff1f;…

2.2 模型与材质基础

一、渲染管线与模型基础 1. 渲染管线 可编程阶段&#xff08;蓝色区域&#xff09;&#xff1a; 1顶点着色器 2几何着色器 3片元着色器 2. 模型的实现原理 UV&#xff1a;在建模软件中&#xff0c;进行UV展开&#xff0c;UV会放在一个横向为U纵向为V&#xff0c;范围&#xff0…

【Linux】深入理解缓冲区

目录 什么是缓冲区 为什么要有缓冲区 缓冲区刷新策略 缓冲区在哪里 手动设计一个用户层缓冲区 什么是缓冲区 缓冲区本质上一块内存区域&#xff0c;用来保存临时数据。缓冲区在各种计算任务中都广泛应用&#xff0c;包括输入/输出操作、网络通信、图像处理、音频处理等。 …

【前端笔记】本地运行cli项目报错ERR_OSSL_EVP_UNSUPPORTED

报错原因 Node版本>17.x&#xff0c;本地npm run 起项目后会发现终端报错&#xff0c;具体有以下2块关键信息&#xff1a; Error: error:0308010C:digital envelope routines::unsupported和 opensslErrorStack: [ error:03000086:digital envelope routines::initializa…

Python补充笔记5-模块化、文件

目录 一、模块 二、模块的导入 三、python中的包​编辑 四、常用的内容模块 五、第三方模块的安装与使用 六、编码格式的介绍 七、文件读写的原理 八、常用的文件打开模式 ​九、文件对象的常用方法 十、with语句​编辑 十一、os模块的常用函数 十二、os.path模块的常用方法​编…

TCP协议如何实现可靠传输

TCP最主要的特点 TCP是面向连接的运输层协议&#xff0c;在无连接的、不可靠的IP网络服务基础之上提供可靠交付的服务。为此&#xff0c;在IP的数据报服务基础之上&#xff0c;增加了保证可靠性的一系列措施。 TCP最主要的特点&#xff1a; TCP是面向连接的输出层协议 每一条…