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

Spring Cloud Stream喂饭级教程【搜集全网资料整理】

文章较长,建议收藏+关注,随时查看

Spring Cloud Stream 简介

Spring Cloud Stream 是 Spring 提供的一个框架,用于构建与共享消息系统相连接的高度可伸缩的事件驱动微服务,它建立在 Spring 已有的成熟组件和最佳实践之上,提供了灵活的编程模型,并支持持久化的发布/订阅、消费组以及消息分区等核心消息机制。简单来说,Spring Cloud Stream 屏蔽了不同消息中间件的差异,让应用开发者无需关心底层使用的是 RabbitMQ 还是 Kafka——这类似于 Spring Data 对持久层的抽象,使开发者不必关心底层使用何种数据库。
在这里插入图片描述

Spring Cloud Stream 通过 Binder(绑定器) 抽象来适配具体的消息代理,中间件的实现细节对应用代码是透明的。应用程序只需定义输入通道输出通道,并与 Spring Cloud Stream 提供的 Binder 对象交互;Binder 会负责将这些通道绑定到实际的消息中间件上。开发者因此可以专注于消息处理的业务逻辑,而无需编写针对特定消息系统的集成代码。

核心概念: Spring Cloud Stream 引入了一些关键概念来实现上述能力:

  • Binder(绑定器): 框架提供的消息适配器组件,用于连接具体的消息中间件并屏蔽不同中间件的差异 。Binder 作为中间层将应用程序的通道与消息代理绑定在一起,实现应用与消息系统细节的解耦。常见的 Binder 实现有 Kafka Binder、RabbitMQ Binder 等,对应用而言切换 Binder 如同切换数据库驱动一样方便。

  • Channel(通道): 通道是消息队列或主题的一种抽象。在消息通信系统中,通道作为消息传递的管道,负责消息的暂存和转发。应用程序通过 Channel 来发送或接收消息,而具体的通道会在 Binder 的配置下对应到消息中间件上的某个队列或话题。

  • Binding(绑定): Binding 表示通道与消息代理中实际主题/队列之间的绑定关系。通过在配置中定义 binding,Spring Cloud Stream 会将应用定义的通道连接到外部消息系统的目的地上。可以简单理解为:Binder 创建了特定通道和外部MQ的绑定 (Binding),从而将生产者消费者两端连接起来。

  • Producer(生产者): 发送消息的一方应用或组件。在 Spring Cloud Stream 中,生产者应用通常会定义一个输出通道,将消息发布到 Binder,从而发送到目标消息队列/主题上。底层 Binder 会负责将消息路由到外部中间件的对应目的地。 输出通道(Output) 即对应一个生产者。

  • Consumer(消费者): 接收并处理消息的一方应用或组件。消费者应用定义输入通道,从 Binder 获取来自消息中间件的消息。Binder 负责将外部队列/主题的消息推送到应用的输入通道上。输入通道(Input)即对应一个消费者。多个消费者还可以通过消费组共享同一主题实现负载均衡(每条消息只被同组一个实例消费),但这是深入特性,在此不展开。

上述抽象使得我们可以使用统一的方式编写消息收发逻辑,而让 Spring Cloud Stream 框架去处理与 Kafka、RabbitMQ 等消息系统的集成细节。例如,一个生产者应用可以不变地发送消息,Binder 可以在不同环境下将其绑定到 Kafka 主题或 RabbitMQ Exchange 上 ;同样地,消费者只需声明绑定即可从相应主题/队列接收消息,而不用关心使用哪个消息系统。

物联网场景下的整体架构

物联网(IoT)系统通常由众多设备产生海量数据,使用消息中间件解耦数据接入和后端处理是常见方案。下面我们以 RabbitMQ 和 Kafka 作为消息中间件,绘制了一个物联网场景下的数据流动和系统分层架构示意图。如图1所示,架构大致分为设备层、消息接入层、数据处理层以及存储和分析层:
在这里插入图片描述

图1:物联网场景下基于 Spring Cloud Stream 的消息流架构示意。各层次包括:设备数据采集层(传感器等IoT设备),消息接入层(消息中间件,如 RabbitMQ/Kafka),数据处理层(微服务集群),以及存储与分析层(数据库、大数据分析)。箭头表示数据的流动方向。

  • 设备数据采集层:这一层由各种物联网设备、传感器组成,它们负责实时采集设备状态和环境数据(如温度传感、设备运行状态等)。设备通常通过轻量级协议将数据发送到边缘网关或直接发送到消息系统的接入端点。例如,传感器可以通过 HTTP、MQTT 等协议将数据上报到服务器或网关。

  • 消息接入层(消息中间件):该层由消息队列/流处理中间件组成,如 RabbitMQ Exchange 或 Kafka Topic 等。设备发送的数据先进入消息中间件进行缓冲和分发。消息中间件充当数据接入层的核心,在物联网场景下接收海量并发的设备数据并可靠地转发。在Spring Cloud Stream架构中,Binder 会将设备数据上报的入口(比如 HTTP 接口或 MQTT 网关)与中间件的主题/队列相连接,例如将传感器上报的数据统一写入名为 raw-sensor-data 的主题 。这一层确保了数据传输的解耦和弹性缓冲,当后端处理服务暂时不可用时,消息也能暂存于中间件中等待处理。

  • 数据处理层(微服务群):后端有多个微服务实例共同构成数据处理层,它们通过 Spring Cloud Stream 从消息中间件订阅消息进行异步处理。每个微服务关注不同的业务逻辑:例如有的服务计算传感数据的滑动窗口平均值,有的服务对原始数据做清洗和入库。由于采用发布-订阅模型,多个服务可以独立消费同一数据流而互不影响——比如一个微服务计算温度平均值,另一个微服务将原始传感数据写入时序数据库/HDFS 分布式存储。借助 Spring Cloud Stream,开发者只需声明绑定(Binding)将微服务的输入通道指向相应主题即可让多个应用并行地收到同一批设备数据。例如,我们可以新添一个微服务订阅平均值流来计算最高温度排名(TopN),或另一个微服务订阅平均值流以进行故障检测和报警 。

  • 存储与分析层:数据处理后的结果以及部分原始数据会进入存储与分析层,包括数据库和大数据平台。在物联网场景中,这一层可能包含关系型数据库、时序数据库(如 InfluxDB)、分布式文件系统/数据湖(如 HDFS)以及实时分析平台等。比如,上述数据处理层中的“Ingest HDFS”服务将原始传感数据写入了 HDFS 集群进行离线存储;同时,计算出的统计结果(如平均值、TopN结果)可能被存储到时序数据库用于监控展示,或进入流式计算引擎做进一步分析。在存储与分析层,运维人员和业务系统可以对历史数据进行查询,可视化监控设备状态,或者基于大数据分析结果优化设备运营。

通过上述分层架构,物联网系统实现了从设备到云端的完整数据通路:设备产生的数据经由消息中间件汇聚,后端微服务通过 Spring Cloud Stream 高效、解耦地处理数据,再将有价值的信息存储和呈现出来。各层之间松耦合、易扩展,方便根据需要横向扩展处理节点或添加新的业务功能。

Spring Cloud Stream通信方式

Stream中的消息通信方式遵循了发布-订阅模式。

Binder:很方便的连接中间件,屏蔽差异
Channel:通道,是队列Queue的一种抽象,在消息通讯系统中就是实现存储和转发的媒介,通过Channel对队列进行配置
Source和Sink:简单的可理解为参照对象是Spring Cloud Stream自身,从Stream发布消息就是输出,接受消息就是输入。

在这里插入图片描述

基于架构的典型物联网应用场景

有了上述基础架构,我们可以灵活构建各种物联网应用功能。以下是几个典型的应用场景:

  • 设备状态监控:实时采集设备运行状态参数(如温度、电压、位置等),通过消息流传输到后端监控服务进行分析。一旦检测到异常指标,系统可以及时标记并通知相关人员。借助 Spring Cloud Stream,监控服务可以方便地订阅设备数据流,对不同类型设备的数据进行统一处理和聚合。

  • 远程控制:后端系统下发控制指令给前端设备,实现对设备的远程操控。例如运维人员在平台上触发设备重启或参数修改命令,命令通过消息中间件路由到目标设备的消息通道,设备上的客户端收到指令后执行相应操作。这种命令下发也可通过 Spring Cloud Stream 将指令作为消息发布到特定主题,由设备订阅执行,实现可靠的异步控制。

  • 报警通知:当设备数据触发预定义的告警条件时(如温度超过阈值、设备离线等),后端分析服务通过消息流产生一条告警消息。告警消息可被通知服务消费,进一步触发短信、邮件或手机推送通知相关负责人。整个过程通过消息解耦,实现了告警检测和通知渠道的独立扩展。例如故障检测微服务发现异常后,发布一条告警消息到alarm主题,由通知微服务订阅发送告警,不会影响其他数据处理流程。

  • 实时数据采集与分析:海量传感器数据经由消息中间件汇聚后,实时分析服务对数据流进行计算,如统计当前系统各设备的指标均值、最大值,或者执行复杂事件处理(CEP)检测特定模式。一系列流处理结果可进一步通过消息通道传播到实时仪表盘进行展示,或者存入数据库供后续查询。通过 Spring Cloud Stream 的分区和消费组特性,能方便地将分析负载分散到多个实例上,提升吞吐量,并确保消息在多个实例间不重复消费。

以上场景只是冰山一角,实际物联网项目中还可能包括设备日志收集、固件升级广播、边缘计算协调等更多应用。但无论哪种场景,使用消息驱动的架构都能增强系统的解耦和弹性,而 Spring Cloud Stream 正是让我们更容易地实现这样的架构利器。

手把手教学:如何使用 Spring Cloud Stream

下面我们通过一个简单示例,演示如何基于 Spring Boot 2.x 使用 Spring Cloud Stream 进行消息驱动开发。我们将以 RabbitMQ 和 Kafka 为消息中间件,分别展示项目创建、依赖引入、配置以及编写消息生产者和消费者的基本步骤。

  1. 创建 Spring Boot 项目:使用熟悉的方式创建一个 Spring Boot 2.x 项目。通过 Spring Initializr 初始化项目,勾选需要的依赖(后续我们会添加 Spring Cloud Stream 相关依赖),选择合适的 GroupId/ArtifactId。对于演示目的,可以建立两个独立的微服务项目:一个作为消息生产者,另一个作为消息消费者(当然也可以在同一项目内演示收发,但实际场景下一般会分开部署不同的服务)。

  2. 添加 Spring Cloud Stream 依赖:在新建的 Spring Boot 项目中,引入 Spring Cloud Stream 的起步依赖和所需的 Binder 实现。以 Maven 为例,在 pom.xml 中添加 RabbitMQ 和 Kafka 的 binder 依赖(根据需要可以只添加其一):

    <!-- Spring Cloud Stream 核心依赖(会通过下面的binder启动器间接引入) -->
    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-stream-rabbit</artifactId>
    </dependency>
    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-stream-kafka</artifactId>
    </dependency>
    
  3. 配置 RabbitMQ 与 Kafka:在应用的配置文件中进行消息中间件的基本连接配置,以及 Spring Cloud Stream 的绑定设置。下面分别给出 RabbitMQ 和 Kafka 的示例配置:

    RabbitMQ 配置:在 application.yml 中配置 RabbitMQ 的连接信息和 Stream Bindings,例如:

    spring:rabbitmq:host: localhostport: 5672username: guestpassword: guestcloud:stream:binders:rabbit:             # 定义名为 "rabbit" 的 Binder,对应 RabbitMQtype: rabbitenvironment:spring:rabbitmq:host: localhostport: 5672username: guestpassword: guestbindings:output:             # 输出通道绑定配置(生产者用)destination: myTopic    # 目标 Exchange/Topic 名称binder: rabbitinput:              # 输入通道绑定配置(消费者用)destination: myTopic    # 同样的目标名称,用于接收上面发送的消息binder: rabbitgroup: myGroup          # 消费组名,确保多个消费者实例共享消息
    

    上述配置指定应用使用 RabbitMQ 作为消息代理(Binder 名称为 rabbit),目标主题/Exchange 为 myTopic。生产者的输出通道和消费者的输入通道都绑定到了该目标。其中 group: myGroup 表示消费者属于名为 “myGroup” 的消费组,用于实现竞争消费(同组内多实例不会重复消费消息)。如果只有一个消费者实例或不需要消费分组,也可以不配置 group 属性。

    Kafka 配置:如果切换使用 Kafka,只需要改用 Kafka Binder 并配置 Kafka 集群地址,例如:

    spring:kafka:bootstrap-servers: localhost:9092cloud:stream:binders:kafka:              # 定义名为 "kafka" 的 Binder,对应 Kafkatype: kafkaenvironment:spring:kafka:bootstrap-servers: localhost:9092bindings:output:destination: myTopic      # 目标 Kafka topic 名称binder: kafkainput:destination: myTopicbinder: kafkagroup: myGroup
    

    可以看到,Kafka 配置主要区别在于使用 spring.kafka.bootstrap-servers 指定 Kafka 集群地址,并将 Binder 类型设为 kafka。其余的 bindings 配置含义与 RabbitMQ 类似。借助 Spring Cloud Stream,我们的应用代码无需改变,只通过配置就能切换底层消息系统。

    提示:实际项目中,可将生产者和消费者的配置拆分到不同的应用里——例如生产者应用只配置 output 部分,消费者应用只配置 input 部分,各自引用正确的 Binder。这种按角色拆分有助于避免不必要的Binder依赖。为简单起见,上述配置同时展示了输入和输出绑定。

  4. 编写消息生产者:在生产者应用中,创建一个服务用于发送消息。Spring Cloud Stream 提供了@EnableBinding注解来绑定接口或内置通道。例如,我们可以使用框架内置的 Source 接口(其定义了一个名为 output 的通道)作为绑定,将该通道连接到前面配置的 myTopic。编写代码如下:

    import org.springframework.cloud.stream.annotation.EnableBinding;
    import org.springframework.cloud.stream.messaging.Source;
    import org.springframework.messaging.MessageChannel;
    import org.springframework.messaging.support.MessageBuilder;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;@EnableBinding(Source.class)  // 绑定输出通道
    @Service
    public class MyProducer {@Autowiredprivate MessageChannel output;  // 注入输出消息通道(对应 Source.OUTPUT)public void sendMessage(String data) {// 构建并发送消息output.send(MessageBuilder.withPayload(data).build());System.out.println("发送消息: " + data);}
    }
    

    在上面的代码中,我们通过 @EnableBinding(Source.class) 激活了 Spring Cloud Stream 的输出通道绑定。框架会根据配置将 output 通道连接到消息中间件上名为 myTopic 的目的地。我们使用 MessageChannel output 来发送消息,MessageBuilder.withPayload(data).build() 用于创建消息载荷。在实际应用中,可以通过 Controller 层调用 sendMessage 方法来触发发送(例如提供一个/send的HTTP接口,接受请求后调用发送逻辑)。发送时,Binder 会确保消息进入 RabbitMQ Exchange 或 Kafka Topic 中。

  5. 编写消息消费者:在消费者应用中,编写对应的代码来接收来自 myTopic 的消息。可以使用 Spring Cloud Stream 内置的 Sink 接口(其定义了一个名为 input 的通道)来绑定输入通道。通过 @StreamListener 注解监听该通道的消息并处理:

    import org.springframework.cloud.stream.annotation.EnableBinding;
    import org.springframework.cloud.stream.messaging.Sink;
    import org.springframework.cloud.stream.annotation.StreamListener;
    import org.springframework.stereotype.Component;@EnableBinding(Sink.class)  // 绑定输入通道
    @Component
    public class MyConsumer {@StreamListener(Sink.INPUT)public void handleMessage(String message) {System.out.println("收到消息: " + message);// 在这里可以添加对消息的业务处理逻辑}
    }
    

    上述代码通过 @EnableBinding(Sink.class) 激活了输入通道绑定。框架会将 input 通道订阅到配置的 myTopic 队列/主题上。当有消息到达时,带有 @StreamListener(Sink.INPUT) 注解的方法会被触发,收到消息内容并进行处理。在我们的示例中,仅简单地打印出了消息。实际使用中可以将消息反序列化为业务对象并执行进一步逻辑。

    值得一提的是,如果多个消费者应用实例使用相同的 group 名(如前面配置了 group=myGroup),则它们构成一个消费组,同一条消息只会被组内一个实例处理。这对于横向扩展消费者以处理高吞吐消息非常有用。而不同消费组的应用对同一主题是发布订阅关系,每组都会各自收到完整的消息流。

  6. 启动并测试消息流转:准备好 RabbitMQ 或 Kafka 服务并确保应用能够连接后,我们就可以启动生产者和消费者应用进行测试。先启动消费者应用(确保其application.yml中含有正确的输入绑定配置),再启动生产者应用。触发生产者发送消息(例如调用之前提到的/send接口,或者在 CommandLineRunner 中调用 sendMessage 方法发送测试数据)。

    如果一切配置正确,生产者应用会将消息发布到 RabbitMQ/Kafka,而消费者应用随即能收到该消息。我们可以在消费者的控制台看到打印的日志。例如,假设发送了一条内容为 Hello IoT 的消息,消费者应用的输出可能类似:

    发送消息: Hello IoT   # 生产者控制台打印
    收到消息: Hello IoT   # 消费者控制台打印
    

    其中,第一行是在生产者应用中打印的发送确认,第二行是在消费者应用中打印的接收结果。通过这种方式,我们验证了使用 Spring Cloud Stream 实现的消息从生产者到中间件再到消费者的完整流转过程。

恭喜,你已经使用 Spring Cloud Stream 打通了一个简单消息驱动案例!在真实场景中,你可以根据业务需要扩展这个模型:例如,更改 destination 名称来划分不同类型消息的通道;引入自定义的消息序列化/反序列化;利用 Spring Cloud Stream 提供的其他高级特性(如动态绑定路由、分区消费等)来应对复杂需求。 由于 Spring Cloud Stream 对 RabbitMQ、Kafka 等的良好抽象,你的应用代码几乎无需因为更换消息中间件而做改动,大大提高了开发效率和系统弹性。

总结

本文介绍了 Spring Cloud Stream 在物联网分布式消息系统中的应用。从框架的核心概念(Binder、Channel、Binding、Producer、Consumer)入手,我们阐述了它如何简化消息驱动微服务的开发 。通过架构图,我们了解了在 IoT 场景下设备数据经由消息中间件到微服务处理再到存储分析的全过程。在实际应用中,Spring Cloud Stream 为典型的物联网需求(监控、控制、告警、实时分析)提供了简洁高效的解决方案。最后的教程部分则手把手演示了如何基于 Spring Boot 快速构建一个使用 RabbitMQ/Kafka 的消息收发应用。

对于有一定 Java 基础的开发者而言,Spring Cloud Stream 上手相对容易,却能大幅降低处理异步消息的样板代码,提升系统的可扩展性和健壮性。当你的微服务需要与消息中间件打交道时,不妨尝试引入 Spring Cloud Stream,用更少的代码拥抱更灵活的架构设计!

参考资料: Spring Cloud Stream 官方文档 、CSDN 博客等。

相关文章:

Spring Cloud Stream喂饭级教程【搜集全网资料整理】

文章较长&#xff0c;建议收藏关注&#xff0c;随时查看 Spring Cloud Stream 简介 Spring Cloud Stream 是 Spring 提供的一个框架&#xff0c;用于构建与共享消息系统相连接的高度可伸缩的事件驱动微服务&#xff0c;它建立在 Spring 已有的成熟组件和最佳实践之上&#xff…...

prometheus手动添加k8s集群外的node-exporter监控

1、部署node-exporter 1&#xff09;helm方式部署 rootiZj6c72dzbei17o2cuksmeZ:~# helm repo add prometheus-community https://prometheus-community.github.io/helm-charts "prometheus-community" has been added to your repositories rootiZj6c72dzbei17o2cu…...

Linux(Centos版本)中安装Docker

文章目录 Linux&#xff08;Centos版本&#xff09;中安装Docker整体流程 Linux&#xff08;Centos版本&#xff09;中安装Docker整体流程 进入root权限进行安装&#xff1a; 下面开始安装Docker: 1、安装docker的yum管理工具&#xff1a;记得将yum仓库更改为国内的镜像源&…...

C语言-- 深入理解指针(4)

C语言-- 深入理解指针&#xff08;4&#xff09; 一、回调函数二、冒泡排序三、qsort函数3.1 使用qsort函数排序整型数据3.2 使用qsort函数排序double数据3.3 使用qsort来排序结构体数据 四、模仿qsort库函数实现通用的冒泡排序4.1 通用冒泡排序函数排序整型数据4.2 通用冒泡排…...

牟乃夏《ArcGIS Engine地理信息系统开发教程》学习笔记3-地图基本操作与实战案例

目录 一、开发环境与框架搭建 二、地图数据加载与文档管理 1. 加载地图文档&#xff08;MXD&#xff09; 2. 动态添加数据源 三、地图浏览与交互操作 1. 基础导航功能 2. 书签管理 3. 量测功能 四、要素选择与属性查询 1. 属性查询 2. 空间查询 五、视图同步与鹰眼…...

Spark Streaming实时数据处理实战:从DStream基础到自定义数据源集成

park-Streaming概述 Spark-Streaming是什么 Spark Streaming 用于流式数据的处理。Spark Streaming 支持的数据输入源很多&#xff0c;例如&#xff1a;Kafka、Flume、Twitter等&#xff0c;以及和简单的 TCP 套接字等等。数据输入后可以用 Spark 的高度抽象原语如&#xff1a;…...

微软GraphRAG的安装和在RAG中的使用体会

文章目录 0. 简介&#xff08;1&#xff09;**技术原理**&#xff08;2&#xff09;**优势**&#xff08;3&#xff09;**开源与演进** 1. 下载graphrag.git2.安装 poetry3.初始化项目&#xff1a;建立cases目录4. 修改.env5.修改settings.yaml,将两处 api_base改成中转站地址:…...

Python学习记录7——集合set()的使用指南

文章目录 引言一、集合特性二、创建方式三、元素操作1、添加元素&#xff08;1&#xff09;add(element)&#xff08;2&#xff09;update(iterables) 2、删除元素&#xff08;1&#xff09;remove(element)&#xff08;2&#xff09;discard(element)&#xff08;3&#xff09…...

apkpure 谷歌插件 下载的apk包

谷歌插件市场搜索 apkpure 然后直接搜索下载就行了 想看apk包中的静态资源&#xff0c;直接改apk 为zip后缀解压就行了 apple的ipa包也是相同的道理...

Android四大核心组件

目录 一、为什么需要四大组件&#xff1f; 二、Activity&#xff1a;看得见的界面 核心功能 生命周期图解 代码示例 三、Service&#xff1a;看不见的劳动者 两大类型 生命周期对比 注意陷阱 四、BroadcastReceiver&#xff1a;消息传递专员 两种注册方式 广播类型 …...

WSL2里手动安装Docker 遇坑

在 WSL2 里手动安装 Docker Engine 时遇坑&#xff1a;systemctl 和 service 命令在默认的 WSL2 Ubuntu 中 无法使用&#xff0c;因为 WSL2 没有 systemd。怎么办&#xff1f; 自己操作让 Docker Engine&#xff08;dockerd&#xff09;直接跑起来&#xff0c;挂到 /var/run/do…...

【ROS2】ROS开发环境配置——vscode和git

古月21讲-ROS2/1.系统架构/1.5_ROS2开发环境配置/ ROS机器人开发肯定离不开代码编写&#xff0c;课程中会给大家提供大量示例源码&#xff0c;这些代码如何查看、编写、编译 安Linux中安装装git sudo apt install git下载教程源码 《ROS2入门21讲》课程源码的下载方式&#x…...

django.db.models.query_utils.DeferredAttribute object

在 Django 中&#xff0c;当你看到 django.db.models.query_utils.DeferredAttribute 对象时&#xff0c;通常是因为你在查询时使用了 only() 或 defer() 方法来延迟加载某些字段。这两个方法允许你控制数据库查询中的字段加载方式&#xff0c;从而优化查询性能。 only() 方法…...

Linux内核中的编译时安全防护:以网络协议栈控制块校验为例

引言:内存安全的无声守卫者 在操作系统内核开发中,内存溢出引发的错误往往具有极高的隐蔽性和破坏性。Linux内核作为承载全球数十亿设备的基石,其网络协议栈的设计尤其注重内存安全性。本文通过分析一段看似简单的内核代码,揭示Linux如何通过编译时静态检查(Compile-Time…...

第11章 安全网络架构和组件(一)

11.1 OSI 模型 协议可通过网络在计算机之间进行通信。 协议是一组规则和限制&#xff0c;用于定义数据如何通过网络介质&#xff08;如双绞线、无线传输等&#xff09;进行传输。 国际标准化组织(ISO)在20世纪70年代晚期开发了开放系统互连(OSI)参考模型。 11.1.1 OSI模型的…...

Git常用命令简明教程

本教程整合并优化了Git核心命令&#xff0c;涵盖初始化、配置、文件操作、分支管理、远程仓库操作及常见场景&#xff0c;适合快速入门和日常参考。命令按使用流程分组&#xff0c;简洁明了&#xff0c;包含注意事项和最佳实践。 1. 初始化与配置 初始化Git仓库并设置基本配置…...

在 Ubuntu 24.04 系统上安装和管理 Nginx

1、安装Nginx 在Ubuntu 24.04系统上安装Nginx&#xff0c;可以按照下面的步骤进行&#xff1a; 1.1、 更新系统软件包列表 在安装新软件之前&#xff0c;需要先更新系统的软件包列表&#xff0c;确保获取到最新的软件包信息。打开终端&#xff0c;执行以下命令&#xff1a; …...

数据结构——二叉树和堆(万字,最详细)

目录 1.树 1.1 树的概念与结构 1.2 树相关的术语 1.3 树的表示法 2.二叉树 2.1 概念与结构 2.2 特殊的二叉树 2.2.1 满二叉树 2.2.2 完全二叉树 2.3 二叉树存储结构 2.3.1 顺序结构 2.3.2 实现顺序结构二叉树 2.3.2.1 堆的概念与结构 2.3.2. 2 堆的插入与删除数据…...

IdeaVim 配置与使用指南

一、什么是 IdeaVim&#xff1f; IdeaVim 是 JetBrains 系列 IDE&#xff08;如 IntelliJ IDEA, WebStorm, PyCharm 等&#xff09;中的一个插件&#xff0c;让你在 IDE 里使用 Vim 的按键习惯&#xff0c;大大提升效率。 安装方法&#xff1a; 在 IDE 中打开 设置(Settings) →…...

前端浏览器窗口交互完全指南:从基础操作到高级控制

浏览器窗口交互是前端开发中构建复杂Web应用的核心能力&#xff0c;本文深入探讨23种关键交互技术&#xff0c;涵盖从传统API到最新的W3C提案&#xff0c;助您掌握跨窗口、跨标签页的完整控制方案。 一、基础窗口操作体系 1.1 窗口创建与控制 // 新窗口创建&#xff08;现代浏…...

考研系列-计算机组成原理第五章、中央处理器

一、CPU的功能及结构 1.运算器的基本结构 2.控制器结构...

python+flask+flask-sockerio,部署后sockerio通信异常

前言 用python开发了一个flask web服务&#xff0c;前端用html&#xff0c;前后端通过socketio通信&#xff0c;开发环境&#xff0c;windowsminicondavscode&#xff0c;开发完成后本地运行没有问题&#xff0c;然后就开始部署&#xff0c;噩梦就开始了。 问题描述 程序是部…...

深度解析:TextRenderManager——Cocos Creator艺术字体渲染核心类

一、类概述 TextRenderManager 是 Cocos Creator 中实现动态艺术字体渲染的核心单例类。它通过整合资源加载、缓存管理、异步队列和自动布局等功能&#xff0c;支持普通字符模式和图集模式两种渲染方案&#xff0c;适用于游戏中的动态文本&#xff08;如聊天内容、排行榜&…...

同样开源的自动化工作流工具n8n和Dify对比

n8n和Dify作为两大主流工具&#xff0c;分别专注于通用自动化和AI应用开发领域&#xff0c;选择哪个更“好用”需结合具体需求、团队能力及业务场景综合判断。以下是核心维度的对比分析&#xff1a; 一、核心定位与适用场景 维度n8nDify核心定位开源全场景自动化工具&#xff…...

设计模式每日硬核训练 Day 16:责任链模式(Chain of Responsibility Pattern)完整讲解与实战应用

&#x1f504; 回顾 Day 15&#xff1a;享元模式小结 在 Day 15 中&#xff0c;我们学习了享元模式&#xff08;Flyweight Pattern&#xff09;&#xff1a; 通过共享对象&#xff0c;分离内部状态与外部状态&#xff0c;大量减少内存开销。适用于字符渲染、游戏场景、图标缓…...

基于边缘人工智能的AI无人机-更高效更安全的飞行任务执行

基于边缘人工智能的AI无人机-更高效更安全的飞行任务执行 人工智能有可能改变人们的生活和工作方式。人工智能和无人机是近年来发展迅速的两项技术。当这两种技术结合在一起时&#xff0c;它们会创造出许多以前不可能的应用。基于人工智能的无人机旨在独立执行任务&#xff0c;…...

30、不是说字符串是不可变的吗,string s=“abc“;s=“123“不就是变了吗?

一、核心概念澄清&#xff1a;不可变性的真实含义 1、不可变性的定义 字符串不可变性指对象内容不可修改&#xff0c;而非变量不可修改。 类比&#xff1a; 不可变字符串 装在密封信封里的信纸&#xff08;内容不可更改&#xff09;变量赋值 更换信封的指向&#xff08;从…...

线上查询车辆出险记录:快速掌握事故情况!

在如今汽车成为人们日常不可或缺的交通工具之际&#xff0c;车辆出险记录成为了许多车主关注的焦点之一。为了帮助车主们快速了解车辆出险、理赔、事故记录&#xff0c;现在有了一种便捷的方式&#xff0c;那就是通过API接口在线查询。本文将介绍如何利用API接口&#xff0c;通…...

Python爬虫课程实验指导书

1.1Requests类库的认知 1.1.1 认识请求类库 Requests是用Python语言编写&#xff0c;基于&#xff0c;采用Apache2 Licensed开源协议的。它比urllib更加方便&#xff0c;可以节约我们大量的工作&#xff0c;完全满足HTTP测试需求。urllibHTTP库 Requests官网地址&#xff1a;ht…...

streamlit实现非原生的按钮触发效果 + flask实现带信息的按钮触发

目录 简介不携带信息的触发隐藏指定st.button(label, key)触发button的html代码汇总 携带信息的触发为什么需要携带信息前端JavaScript修改flask处理总代码 简介 由于streamlit可以同时在实现前后端结合&#xff0c;非常方便&#xff0c;但是这也造成了user难以方便的对页面的…...

机器学习基础——Seaborn使用

1.使用tips数据集,创建一个展示不同时间段(午餐/晚餐)账单总额分布的箱线图 import matplotlib.pyplot as plt import numpy as np import pandas as pd import seaborn as snstips pd.read_csv(./tips.csv)sns.boxplot(data tips,x time,y total_bill, )plt.show() 2.使用…...

Godot开发2D冒险游戏——第三节:游戏地图绘制

一、初步构建游戏地图 在游戏场景当中添加一个新的子节点&#xff1a;TileMapLayer 这一层称为瓦片地图层 根据提示&#xff0c;下一步显然是添加资源 为TileMapLayer节点添加一个TileSet 将地板添加进来&#xff0c;然后选择自动分割图集 自定义时要确保大小合适 让Godot自…...

Spark Mllib 机器学习

概述 机器学习是什么 根据百度百科的定义&#xff1a; 机器学习是一种通过算法和模型使计算机从数据中自动学习并进行预测或决策的技术。 定义比较抽象&#xff0c;根据常见的机器学习可以总结出三个关键字&#xff1a; 算法、经验、性能。 机器学习的过程可以抽象成一个pipel…...

在windows使用docker打包springboot项目镜像并上传到阿里云

1、前提&#xff1a;已有spring项目 2、在项目根目录下创建Dockerfile文件 FROM openjdk:11 WORKDIR /ruoyi-admin COPY ruoyi-admin/build/libs/lifecolor-web.jar lifecolor-web.jar CMD ["java", "-jar", "lifecolor-web.jar"] 3、选…...

前端高频面试题day3

JavaScript作用域理解 核心概念 作用域&#xff1a;定义变量/函数的可见范围及生命周期&#xff0c;分为 全局作用域、函数作用域、块级作用域。作用域链&#xff1a;变量查找从当前作用域逐级向上直至全局&#xff0c;遵循词法作用域&#xff08;静态作用域&#xff09;。闭…...

时空特征如何融合?LSTM+Resnet有奇效,SOTA方案预测准确率超91%

LSTM有着不错的时序信息提取能力&#xff0c;ResNet有着不错的空间特征信息提取能力。如果现在有时空特征融合的创新需求&#xff0c;我们是否能将LSTM和ResNet两者的优点融合起来呢&#xff1f; 随着这个思路下去&#xff0c;LSTM ResNet混合模型横空出世&#xff0c;在各个…...

蓝桥杯Java全攻略:从零到一掌握竞赛与企业开发实战

蓝桥杯Java软件开发竞赛已成为全国高校学生展示编程能力的重要舞台,本指南将带您从零开始构建完整的Java知识体系,不仅覆盖蓝桥杯高频考点,还延伸至企业级开发实战,助您在竞赛中脱颖而出并为未来职业发展奠定坚实基础。 一、Java基础语法与数据结构 竞赛解题流程图设计 蓝…...

【Nginx】负载均衡配置详解

Nginx作为高性能的HTTP服务器和反向代理服务器&#xff0c;提供了强大的负载均衡功能。本文将详细介绍Nginx负载均衡的配置方法和相关策略。 一、基础负载均衡配置 1.单服务示例配置 配置nginx.conf模块 在Nginx配置文件中定义upstream模块&#xff1a; worker_processes a…...

打造企业级AI文案助手:GPT-J+Flask全栈开发实战

一、智能文案革命的序幕&#xff1a;为什么需要AI文案助手&#xff1f; 在数字化营销时代&#xff0c;内容生产效率成为企业核心竞争力。据统计&#xff0c;营销人员平均每天需要撰写3.2篇文案&#xff0c;而传统人工创作存在三大痛点&#xff1a; 效率瓶颈&#xff1a;创意构…...

【文献速递】snoRNA-SNORD113-3/ADAR2通过对PHKA2的A-to-I编辑影响胶质母细胞瘤糖脂代谢

Cui等人于2025年在Cellular & Molecular Biology Letters上的发表一篇研究论文&#xff0c;题目为“Effect of SNORD113-3/ADAR2 on glycolipid metabolism in glioblastoma via A-to-I editing of PHKA2”。这篇文章的核心内容是研究胶质母细胞瘤&#xff08;GBM&#xff…...

视频HLS分片与关键帧优化深度解析

视频HLS分片与关键帧优化深度解析 &#x1f310; HLS基础架构 #mermaid-svg-OQmrXfradiCv3EGC {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-OQmrXfradiCv3EGC .error-icon{fill:#552222;}#mermaid-svg-OQmrXfrad…...

再谈从视频中学习:从给视频打字幕的Humanoid-X、UH-1到首个人形VLA Humanoid-VLA:迈向整合第一人称视角的通用人形控制

前言 本博客内&#xff0c;之前写了比较多的大脑相关的&#xff0c;或者上肢操作&#xff0c;而解读运动控制、规划的虽也有&#xff0c;但相对少 故近期 准备多写写双足人形的运动控制相关 一方面&#xff0c;我们有些客户订单涉及这块二方面&#xff0c;想让双足人形干好活…...

Ubuntu下MySQL的安装

Ubuntu下MySQL的安装 1. 查看当前操作系统版本2. 添加MySQL APT源2.1 访问下载页面&#xff0c;并下载发布包2.2 执行安装指令2.3 安装MySQL 3. 查看MySQL状态4. 设置开机自启动 1. 查看当前操作系统版本 通过命令lsb_release -a查看&#xff1a; 2. 添加MySQL APT源 2.1 访问下…...

DataStreamAPI实践原理——快速上手

引入 通过编程模型&#xff0c;我们知道Flink的编程模型提供了多层级的抽象&#xff0c;越上层的API&#xff0c;其描述性和可阅读性越强&#xff0c;越下层API&#xff0c;其灵活度高、表达力越强&#xff0c;多数时候上层API能做到的事情&#xff0c;下层API也能做到&#x…...

《数据结构初阶》【顺序表 + 单链表 + 双向链表】

《数据结构初阶》【顺序表 单链表 顺序表】 前言&#xff1a;先聊些其他的东西&#xff01;&#xff01;&#xff01;什么是线性表&#xff1f;什么是顺序表&#xff1f;顺序表的种类有哪些&#xff1f; 什么是链表&#xff1f;链表的种类有哪些&#xff1f; ---------------…...

【JS-Leetcode】2621睡眠函数|2629复合函数|2665计数器||

文章目录 2621睡眠函数2629复合函数2665计数器|| 这三个题目涉及setTimeout、promise、数组reduce方法&#xff0c;闭包。 2621睡眠函数 请你编写一个异步函数&#xff0c;它接收一个正整数参数 millis &#xff0c;并休眠 millis 毫秒。要求此函数可以解析任何值。 原理&am…...

全国各地级城市月度平均房价统计数据2009-2021年

全国各地级城市月度平均房价统计数据2009-2021年.ziphttps://download.csdn.net/download/2401_84585615/90259770 https://download.csdn.net/download/2401_84585615/90259770 来源&#xff1a;安居客&#xff0c;本数据以excel格式展示&#xff0c;列举2.5万多条样本数据。总…...

ElasticSearch从入门到精通-覆盖DSL操作和Java实战

一、ElasticSearch基础概念 1.1 认识elasticSearch ElasticSearch&#xff08;简称ES&#xff09;是一款开源的、分布式的搜索引擎&#xff0c;它建立在Apache Lucene之上。简单来说&#xff0c;ElasticSearch就是一个能让你以极快速度进行数据搜索、存储和分析的系统。它不仅…...

SHCTF-REVERSE

前言 之前写的&#xff0c;一直没发&#xff0c;留个记录吧&#xff0c;万一哪天记录掉了起码在csdn有个念想 1.ezapk 反编译 快速定位关键函数 package com.mycheck.ezjv;import adrt.ADRTLogCatReader; import android.app.Activity; import android.content.Context; impo…...

C++学习:六个月从基础到就业——模板编程:模板特化

C学习&#xff1a;六个月从基础到就业——模板编程&#xff1a;模板特化 本文是我C学习之旅系列的第三十四篇技术文章&#xff0c;也是第二阶段"C进阶特性"的第十二篇&#xff0c;主要介绍C中的模板特化技术。查看完整系列目录了解更多内容。 目录 引言模板特化基础…...