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

应用层协议简介:以 HTTP 和 MQTT 为例

文章目录

  • 应用层协议简介:什么是应用层协议?为什么需要应用层协议?
    • 什么是应用层协议?
    • 为什么需要应用层协议?
  • HTTP 协议详解
    • HTTP 协议特点
    • HTTP 工作的基本原理
    • HTTP 请求与响应示例
    • 为什么 Web 应用基于 HTTP 请求?
    • HTTP 的版本演进
    • HTTP 的典型应用场景
  • 拓展:RPC
    • 为什么说 RPC 属于应用层协议?
    • RPC 与 HTTP 的优缺点分析
      • RPC 的优缺点
      • HTTP(RESTful API)的优缺点
      • 技术选型建议
  • MQTT 协议详解
    • MQTT 核心特性
    • MQTT 协议架构
    • 关键概念
      • 主题 Topic
      • QoS 等级
      • 保留消息(Retained Message)
      • 会话持久性
    • MQTT 与 HTTP 对比
    • 常见的 MQTT Broker 实现

应用层协议简介:什么是应用层协议?为什么需要应用层协议?

在这里插入图片描述

什么是应用层协议?

应用层协议是网络通信中面向具体应用场景的规则集合,定义了数据格式、交互流程和功能逻辑。

它位于 OSI 网络模型的最顶层,直接服务于应用程序。「这一点我个人认为很关键,应用层协议是直接服务于应用程序的,比如基于 HTTP 协议可以高效地构建 web 服务」

典型的协议包括:HTTP(网页)、SMTP(邮件)、DNS(域名解析)、FTP(文件传输)等。

核心作用:

  • 结构化数据:规定数据应该如何组织(如 HTTP 报文包含请求行、头部、正文);
  • 语义约定:定义交互逻辑(HTTP 中 GET 获取资源,POST 提交数据);
  • 状态管理:处理会话(如 Cookies 维持登录状态)。

为什么需要应用层协议?

我们已经知道,基于 TCP 协议或 UDP 协议可以完成端到端的字节流或数据包的传输。以 TCP 协议为例,TCP 可以可靠地在客户端与服务端之间传输字节流,但是传输的仅仅是字节流,如果不加以解析,这些字节流不具备具体的含义。

我们当然可以根据具体的业务来在 TCP 传输的字节流当中手动地加入一些代表语义的信息,与字节流一同发送,但这样做的一个很明显的问题在于复用性非常差,具体的业务与传输无法解耦。

基于上述分析,应用层协议应运而生,基于应用层协议,数据被赋予了具体的意义。以 HTTP 协议为例,它更多地提供的是一种标准,比如 GET 请求的 HTTP 报文明确要求从服务器请求资源,所有遵循 HTTP 协议的服务都能理解这个语义,而不需要额外协商。

下面看一个使用和不使用应用层协议进行数据传输的例子:
如果不使用应用层协议,客户端基于传输层协议发送原始字节流:48 54 54 50,服务器无法判断出这个字节流要做的是什么,需要额外的代码进行解析。

而如果使用应用层协议,客户端将发送结构化的请求数据:

GET /index.html HTTP/1.1
Host: yggp.test
Accept-Language: en

服务器将在应用层按照 HTTP 协议的规则对发送过来的报文进行解析,具体需要解析 HTTP 请求的类型、解析路径并返回对应页面。

总结一下,应用层协议为具体的业务逻辑与网络传输搭起了桥梁,将原始的字节流升级为可理解的业务操作。没有应用层协议,互联网将陷入混乱的自定义格式冲突(比如 A 公司将 TCP 报文的第一位为1视为请求数据,B 公司视为删除数据,存在冲突,需要额外的协商成本),无法实现跨平台、跨系统的写作。

HTTP 协议详解

HTTP(HyperText Transfer Protocol, 超文本传输协议)是互联网上应用最广泛的应用层协议,用于在客户端(如浏览器)和服务器之间传输超文本(如网页、API 数据等)。它是 Web 应用的基础通信协议,几乎所有现代 Web 应用都依赖 HTTP 进行数据交互。

HTTP 协议特点

HTTP 协议的核心作用是在客户端和服务器之间传输超文本,主要特点包括:

  1. 使用请求-响应(Request-Response)模型:客户端发送请求(Request,请求报文需要携带相应的方法),服务器返回响应(Response,通常是一个 JSON 结构体);
  2. 无状态协议:HTTP 协议默认不记录用户的状态(但是可以通过 Cookie/Session 实现状态管理,可以将 JWT Access Token 放到 HTTP Header 当中,由服务端进行无状态认证);
  3. 支持多种数据格式:包括 HTML、JSON、XML、图片、视频等;
  4. 可拓展性强:通过 HTTP Header 可以传递额外信息(如认证、缓存控制等)。

HTTP 工作的基本原理

HTTP 工作的基本流程如下:

  1. 用户在浏览器输入 URL 并按下回车(客户端发起请求);
  2. DNS 解析(DNS 也是应用层协议,主要用于将 URL 对应到具体的 IP 地址,需要注意的是,一个 URL 可能对应多个 IP,因为可能不止一台服务器在提供服务);
  3. 得到 IP 之后与服务器建立 TCP 连接(比如基于 TCP 传输的 HTTP,默认的端口号是 80,HTTPS 默认的端口号是 HTTPS,基于端口号和 IP 在客户端与服务器之间建立 Socket 连接);
  4. 连接建立之后,客户端发送 HTTP 请求(比如 GET /index.html HTTP/1.1);
  5. 服务器处理请求(查找资源,执行后端逻辑);
  6. 服务器返回 HTTP 响应(如 200 OK + HTML 的内容);
  7. 客户端得到 HTML 内容后,对文本进行解析并在客户端浏览器进行渲染。

HTTP 请求与响应示例

HTTP 请求(Request)

# GET 请求
GET /index.html HTTP/1.1	// 请求行
Host: www.example.com		// 必需头部
User-Agent: Mozilla/5.0		// 客户端信息
Accept: text/html			// 期望返回的格式# POST 请求
POST /api/login HTTP/1.1          // 请求行
Host: example.com                 // 必需头部
Content-Type: application/json    // 指定 Body 格式
Content-Length: 56                // Body 的长度(字节)
User-Agent: Mozilla/5.0           // 客户端信息
Accept: application/json          // 期望返回的格式{"username": "admin", "password": "123456"}  // 请求体(Body)
  • 方法:GET 用于获取资源,POST 会提交数据,PUT 更新数据,DELETE 删除数据。因此为了确保接口的幂等性,应该重点关注 POST 和 PUT 等改变服务器状态的方法会不会在重复提交请求之后多次改变服务器中资源的状态。
  • 路径:/index.html 是请求的资源。
  • 协议版本:HTTP/1.1 标识了协议版本。
  • Headers:附加信息。

HTTP 响应(Response)

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234<!DOCTYPE html>
<html>...</html>
  • 状态码(Status Code):比如 200 表示请求成功,404 表示资源未找到。
  • Headers:描述数据(Content-Type、Content-Length);
  • Body:返回实际的数据(HTML、JSON)。

为什么 Web 应用基于 HTTP 请求?

  • 简单且标准化:HTTP 采用纯文本协议,易于调试和拓展,但问题在于需要考虑安全性,所以当前浏览器默认只能够以 HTTPS 协议发起请求,否则就会告知用户不安全。此外,HTTP 采用请求-响应模型,适合 Web 交互。
  • 跨平台兼容:几乎所有设备(PC、手机、IoT「后面要提到的 MQTT 更适用于 IoT」)都支持 HTTP。此外,浏览器、移动 APP 和后端应用都可以通过 HTTP 通信。
  • 无状态但可拓展:HTTP 协议默认不保存状态(但可拓展到 HTTP Header 保存登录态),因此适用于分布式系统。
  • 支持多种数据格式:早期用于 HTML,现在广泛用于 RESTful API(JSON)、文件传输、流媒体等。
  • 与 HTTPS 结合保证安全:HTTPS = HTTP + SSL/TLS,加密传输防止窃听和数据篡改(比如银行交易)。
  • 支持缓存和优化:通过 Cache-ControlETag 等头部优化性能,减少服务器负载。

HTTP 的版本演进

目前 HTTP 已经演化到了第三代,HTTP/3 采用的传输层协议也不再是 TCP,而是 UDP。甚至 HTTP/2 不再采用字节流的形式传输文本,而采用二进制协议来传输数据,以提升传输效率,gRPC 框架在发起调用时正是通过 HTTP/2 进行数据传输。

HTTP 的版本演进详见下表:

版本特点
HTTP/1.0基于最简单的请求-响应模型,但不存在连接复用,意味着每一次发起 HTTP 请求都需要新建 TCP 连接(效率低)
HTTP/1.1持久连接(Keep-Alive)、管道化、缓存优化。HTTP/1.1 是目前广泛使用的主流版本
HTTP/2二进制协议、多路复用(一个连接并行多个请求)、头部压缩
HTTP/3基于 QUIC(UDP),解决 TCP 对头阻塞,提升移动网络下的性能

HTTP 的典型应用场景

  1. 网页浏览(浏览器从服务器请求网页资源,用户还可以在浏览器向服务器提交表单);
  2. RESTful API(前端与后端进行数据交互);
  3. 文件下载/上传(HTTP 替代了部分 FTP 协议的功能);
  4. 实时通信(结合 WebSocket,实现即时通讯);
  5. 微服务通信(服务间通过 HTTP API 交互,gRPC 是一个典型的例子)。

拓展:RPC

近期时兴的后端开发技术中,最绕不开的一项技术一定包括微服务,微服务当中涉及到 RPC,也就是远程过程调用,它能够让客户端像是在调用本地函数一样来调用一个远程服务器上的业务函数。

根据以上概念,RPC 其实可以被归纳为应用层协议的一种,因为它屏蔽了底层网络传输的细节,更恰当地来说它应该被视为一种通信模式。实际上,RPC 是一个更上层的通信范式,它可以基于不同的底层协议(如 gRPC 基于 HTTP/2 协议通信,Dubbo 基于 TCP 协议通信,RPC 还可以基于自定义的协议来进行通信)实现。

为什么说 RPC 属于应用层协议?

RPC 的功能特性

  • 接口抽象:RPC 定义了远程服务的函数,客户端与服务器建立连接后可以直接通过客户端对象进行调用(如 getUser(id));
  • 序列化:RPC 需要将数据转换为网络可传输的格式,比如 JSON 或 Protobuf,具体来说是将 RPC 调用的参数转为网络可传输格式,服务端接收到字节流之后再将字节流反序列化为参数;
  • 服务发现:客户端需要通过服务发现来定位目标服务器,服务发现的功能类似于 DNS;
  • 负载均衡:比如客户端根据服务发现模块拉取的服务实例列表,根据调度策略随机选择一个服务实例执行 RPC 调用,实现负载均衡。

协议对比:RPC vs. HTTP

特性RPCHTTP
目标调用远程函数通过标准方法(GET/POST)获取资源
通信模式函数调用导向资源导向
协议绑定可基于 TCP、HTTP、自定义协议必需基于 HTTP/HTTPS
性能优化高效序列化(如基于 protobuf 的二进制序列化)基于文本协议(JSON/XML)
性能更高(低延迟、高吞吐)较低(文本传输和解析的开销较大)
适用场景微服务内部通信、高性能场景对外开放 API、浏览器兼容场景

RPC 与 HTTP 的优缺点分析

RPC 的优缺点

✅优点

  1. 高性能:可以使用二进制协议(比如 gRPC 使用 Protobuf)进行通信,数据体积小,序列化/反序列化快。支持多路复用(HTTP/2)或长连接(比如 Dubbo 基于 TCP 协议通信),减少 TCP 建立连接的握手开销;
  2. 开发友好:远程过程调用就像是调用本地函数一样简单,隐藏了网络的实现细节。此外,以 gRPC 为例,编写好 proto 文件之后可以直接根据 proto 文件生成相应开发环境(比如 C++/Python/Golang)的业务结构及接口,即自动生成客户端代码。

❌缺点

  1. 耦合性高:客户端和服务端共享接口定义文件(即 proto 文件),如有变更需要同步更新。
  2. 调试复杂:二进制协议难以直接阅读,需要工具解析。此外,需要专门的监控工具来对调用链进行监控,以防服务雪崩的发生。
  3. 穿透性差:基于自定义通信协议或 TCP 协议的 RPC 可能被防火墙拦截,但基于 HTTP 通信的 RPC 可以通过。

HTTP(RESTful API)的优缺点

✅优点

  1. 通用性强:所有设备均支持 HTTP,无需额外的库。且基于 HTTP 协议传输的数据是纯文本,人类可读,便于调试。
  2. 无状态:符合 REST 规范,易于水平拓展。
  3. 穿透性好:默认使用 80/443 端口,轻松穿透防火墙与代理。
  4. 生态丰富:HTTP 具有丰富的工具链(Swagger 文档、CDN 缓存、OAuth 认证等)。

❌缺点

  1. 性能较低:基于纯文本协议传输,传输开销较大,解析较慢,不适用于高频调用。
  2. 灵活性差:由于 HTTP 协议通过具体的方法进行调用,目的是请求资源,因此与 CRUD 强绑定,复杂操作需要绕行。
  3. 冗余性高:头部信息重复传输(比如一个 HTTP 请求如果需要无状态认证,需要多次传输相同的 JWT Access Token),浪费带宽。

技术选型建议

  • 对内使用 RPC,对外使用 HTTP。
  • 追求性能时使用二进制协议(Protobuf),追求通用性时选 JSON over HTTP。

MQTT 协议详解

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种轻量级的发布/订阅(Pub-Sub)消息协议,专为低带宽、高延迟或不稳定网络环境设计。

需要注意的是,MQTT 是典型的应用层协议,它明确基于 TCP/IP 协议栈进行通信,专为物联网(IoT)和低带宽环境设计。

MQTT 核心特性

MQTT 的核心特性如下:

  • 轻量级:协议头仅 2 字节(16 位),适合嵌入式设备(如传感器);
  • 发布/订阅模型:解耦消息生产者(Publisher)和消费者(Subscriber),通过主题(Topic)路由消息「和 Message Queue 的设计理念基本一致」;
  • 低功耗:适合电池供电设备(如智能家居传感器);
  • 支持 QoS 等级:提供 3 种消息传递可靠性保证等级(QoS 0/1/2);
  • 基于 TCP/IP:默认端口 1883,8883 为 TLS 加密端口;
  • 遗嘱消息(LWT):设备异常离线时,自动向订阅者发送预设消息。

MQTT 协议架构

核心角色
主要分为三部分,分别是发布者(Publisher)、订阅者(Subscriber)和代理服务器(Broker),与 MQ 的设计方式基本相同。

  • Publisher:向特定 Topic 发送消息的设备;
  • Subscriber:订阅 Topic 并接收消息的设备;
  • Broker:负责消息路由的核心组件(如 Mosquitto、EMQX)。

通信流程

  1. 设备(客户端)连接到 MQTT Broker;
  2. 订阅者订阅感兴趣的主题(如 sensor/temperature);
  3. 发布者向该主题发布消息(如 {"avlue": 25.5});
  4. Broker 将消息推送给所有订阅者。

关键概念

主题 Topic

  • 主题采用多级结构,用 / 分隔,如 home/living_room/temperature
  • 主题支持通配符:+ 为单机匹配,比如 home/+/temperature 匹配 home/living_room/temperature# 为多级匹配,如 home/# 匹配 home/living_room/temperaturehome/kitchen/temperature

QoS 等级

QoS可靠性传输次数用例
0最多一次(可能丢失) 1 1 1非关键数据(如周期性传感器读数)
1至少一次(可能重复) ≥ 1 \geq1 1需保证送达(如设备控制指令)
2恰好一次(可靠且不重复) ≥ 2 \geq2 2严格场景(如支付交易)

保留消息(Retained Message)

Broker 保留主题的最后一条消息,新的订阅者立即收到它(如设备上线后获取最新状态)。

会话持久性

客户端设置 Clean Session = false 之后,Broker 会保存离线期间的订阅和未接收消息。

MQTT 与 HTTP 对比

对比维度MQTTHTTP
设计目标设备间实时消息推送基于请求-响应模型的资源传输
传输开销极小高(Headers + Body,且基于纯文本传输)
连接方向设备可主动发布消息只能客户端发送请求
适用场景IoT、即时通讯Web API、网页资源加载
长连接保持 TCP 长连接短连接(HTTP/1.1 可连接复用)

常见的 MQTT Broker 实现

  • Mosquitto:Eclipse 开源项目,轻量级 Broker;
  • EMQX:高性能 MQTT Broker,支持集群;
  • AWS IoT Core:云服务集成;
  • HiveMQ:提供企业级支持。

相关文章:

应用层协议简介:以 HTTP 和 MQTT 为例

文章目录 应用层协议简介&#xff1a;什么是应用层协议&#xff1f;为什么需要应用层协议&#xff1f;什么是应用层协议&#xff1f;为什么需要应用层协议&#xff1f; HTTP 协议详解HTTP 协议特点HTTP 工作的基本原理HTTP 请求与响应示例为什么 Web 应用基于 HTTP 请求&#x…...

LeetCode 39. 组合总和 LeetCode 40.组合总和II LeetCode 131.分割回文串

LeetCode 39. 组合总和 需要注意的是题目已经明确了数组内的元素不重复&#xff08;重复的话需要执行去重操作&#xff09;&#xff0c;且元素都为正整数&#xff08;如果存在0&#xff0c;则会出现死循环&#xff09;。 思路1&#xff1a;暴力解法 对最后结果进行去重 每一…...

如何在 Windows 11 或 10 上安装 Fliqlo 时钟屏保

了解如何在 Windows 11 或 10 上安装 Fliqlo,为您的 PC 或笔记本电脑屏幕添加一个翻转时钟屏保以显示时间。 Fliqlo 是一款适用于 Windows 和 macOS 平台的免费时钟屏保。它也适用于移动设备,但仅限于 iPhone 和 iPad。Fliqlo 的主要功能是在用户不活动时在 PC 或笔记本电脑…...

Linux云计算训练营笔记day08(MySQL数据库)

Linux云计算训练营笔记day08&#xff08;MySQL数据库&#xff09; 目录 Linux云计算训练营笔记day08&#xff08;MySQL数据库&#xff09;数据准备修改更新update删除delete数据类型1.整数类型2.浮点数类型(小数)3.字符类型4.日期5.枚举: 表头的值必须在列举的值里选择拷贝表复…...

计算机视觉与深度学习 | matlab实现EMD-CNN-LSTM时间序列预测(完整源码、数据、公式)

EMD-CNN-LSTM 一、完整代码实现二、核心公式说明1. **经验模态分解(EMD)**2. **1D卷积运算**3. **LSTM门控机制**4. **损失函数**三、代码结构解析四、关键参数说明五、性能优化建议六、典型输出示例以下是用MATLAB实现EMD-CNN-LSTM时间序列预测的完整方案,包含数据生成、经…...

【vue】【环境配置】项目无法npm run serve,显示node版本过低

解决方案&#xff1a;安装高版本node&#xff0c;并且启用高版本node 步骤&#xff1a; 1、查看当前版本 node -v2、配置nvm下载镜像源 1&#xff09;查看配置文件位置 npm root2&#xff09;找到settings.txt文件 修改镜像源为&#xff1a; node_mirror: https://npmmirro…...

国芯思辰| 轮速传感器AH741对标TLE7471应用于汽车车轮速度感应

在汽车应用中&#xff0c;轮速传感器可用于车轮速度感应&#xff0c;为 ABS、ESC 等安全系统提供精确的轮速信息&#xff0c;帮助这些系统更好地发挥作用&#xff0c;在紧急制动或车辆出现不稳定状态时&#xff0c;及时调整车轮的制动力或动力分配。 国芯思辰两线制差分式轮速…...

鸿蒙PC操作系统:从Linux到自研微内核的蜕变

鸿蒙PC操作系统是否基于Linux内核,需要结合其技术架构、发展阶段和官方声明综合分析。以下从多个角度展开论述: 一、鸿蒙操作系统的多内核架构设计 多内核混合架构 根据资料,鸿蒙操作系统(HarmonyOS)采用分层多内核架构,内核层包含Linux内核、LiteOS-m内核、LiteOS-a内核…...

小程序弹出层/抽屉封装 (抖音小程序)

最近忙于开发抖音小程序&#xff0c;最想吐槽的就是&#xff0c;既没有适配的UI框架&#xff0c;百度上还找不到关于抖音小程序的案列&#xff0c;我真的很裂开啊&#xff0c;于是我通过大模型封装了一套代码 效果如下 介绍 可以看到 这个弹出层是支持关闭和标题显示的&#xf…...

深入理解动态规划:从斐波那契数列到最优子结构

引言 动态规划(Dynamic Programming, DP)是算法设计中一种非常重要的思想&#xff0c;广泛应用于解决各类优化问题。许多看似复杂的问题&#xff0c;通过动态规划的视角分析&#xff0c;往往能找到高效的解决方案。本文将系统介绍动态规划的核心概念&#xff0c;通过经典案例展…...

基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL

基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL 场景说明&#xff1a; 先有项目需要读取生产库数据&#xff0c;但是不能直接读取生产库数据&#xff0c;需要把生产数据同步到一个中间库&#xff0c;下游系统从中间库读取数据。 生产库mysql - OGG - 中间库…...

电子电路原理第十六章(负反馈)

1927年8月,年轻的工程师哈罗德布莱克(Harold Black)从纽约斯塔顿岛坐渡轮去上班。为了打发时间,他粗略写下了关于一个新想法的几个方程式。后来又经过反复修改, 布莱克提交了这个创意的专利申请。起初这个全新的创意被认为像“永动机”一样愚蠢可笑,专利申请也遭到拒绝。但…...

Go语言数组的定义与操作 - 《Go语言实战指南》

在 Go 语言中&#xff0c;数组&#xff08;Array&#xff09; 是一种定长、同类型的集合。它在内存中是连续分布的&#xff0c;适合用于性能敏感的场景。 一、数组的定义 数组的基本语法如下&#xff1a; var 数组名 [长度]元素类型 示例&#xff1a; var nums [5]int …...

物联网简介:万物互联的未来图景

物联网简介&#xff1a;万物互联的未来图景 引言 在科技飞速发展的今天&#xff0c;我们身边的一切似乎都在悄然发生变化。从清晨智能闹钟根据你的睡眠状态自动唤醒&#xff0c;到厨房里的咖啡机在你起床前已经煮好咖啡&#xff1b;从城市交通系统通过实时数据优化红绿灯时长…...

命令拼接符

Linux多命令顺序执行符号需要记住5个 【&#xff5c;】【||】【 ;】 【&】 【&&】 &#xff0c;在命令执行里面&#xff0c;如果服务器疏忽大意没做限制&#xff0c;黑客通过高命令拼接符&#xff0c;可以输入很多非法的操作。 ailx10 网络安全优秀回答者 互联网…...

【通用智能体】Lynx :一款基于终端的纯文本网页浏览器

Lynx &#xff1a;一款基于终端的纯文本网页浏览器 一、Lynx简介二、应用场景及案例场景 1&#xff1a;服务器端网页内容快速查看场景 2&#xff1a;网页内容快速提取场景 3&#xff1a;表单提交与自动化交互场景 4&#xff1a;网络诊断与调试场景 5&#xff1a;辅助工具适配 三…...

51单片机的lcd12864驱动程序

#include <reg51.h> #include <intrins.h>#define uchar...

GStreamer (三)常⽤插件

常⽤插件 1、Source1.1、filesrc1.2. videotestsrc1.3. v4l2src1.4. rtspsrc和rtspclientsink 2、 Sink2.1. filesink2.2. fakesink2.3. xvimagesink2.4. kmssink2.5. waylandsink2.6. rkximagesink2.7. fpsdisplaysink 3 、视频推流/拉流3.1. 本地推流/拉流3.1.1 USB摄像头3.1…...

Java POJO接收前端null值设置

在 Java 中&#xff0c;若要让 price 字段接收前端传递的 null 值&#xff0c;只需确保以下几点&#xff1a; 1. 使用包装类型 Double 你的 price 字段已经是包装类型 Double&#xff08;而不是基本类型 double&#xff09;&#xff0c;这天然支持 null 值。基本类型 double …...

详细总结和讲解redis的基本命令

Redis 是一个开源的内存数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。Redis 支持多种类型的数据结构&#xff0c;如字符串&#xff08;Strings&#xff09;、哈希&#xff08;Hashes&#xff09;、列表&#xff08;Lists&#xff09;、集合&#xff08;Se…...

Linux 内核等待机制详解:prepare_to_wait_exclusive 与 TASK_INTERRUPTIBLE

1. prepare_to_wait_exclusive 函数解析 1.1 核心作用 prepare_to_wait_exclusive 是 Linux 内核中用于将进程以独占方式加入等待队列的关键函数,其主要功能包括: 标记独占等待:通过设置 WQ_FLAG_EXCLUSIVE 标志,表明此等待条目是独占的。 安全入队:在自旋锁保护下,将条…...

蓝桥杯2300 质数拆分

问题描述 将 2022 拆分成不同的质数的和&#xff0c;请问最多拆分成几个&#xff1f; 01背包问题 #include<iostream> #include<cmath> #include<algorithm> using namespace std;int prime[2025]; int dp[2025]; //dp[j]&#xff1a;和为 j 时的最多拆分…...

软件架构风格系列(2):面向对象架构

文章目录 引言一、什么是面向对象架构风格1. 定义与核心概念2. 优点与局限性二、业务建模&#xff1a;用对象映射现实世界&#xff08;一&#xff09;核心实体抽象1. 员工体系2. 菜品体系 &#xff08;二&#xff09;封装&#xff1a;隐藏实现细节 三、继承实战&#xff1a;构建…...

ngx_http_random_index_module 模块概述

一、使用场景 随机内容分发 当同一目录下存放多份等价内容&#xff08;如多张轮播图、不同版本静态页面等&#xff09;时&#xff0c;可通过随机索引实现负载均衡或流量分散。A/B 测试 通过目录请求自动随机分配用户到不同测试组&#xff0c;无需后端逻辑参与。动态“首页”选…...

go-zero(十八)结合Elasticsearch实现高效数据检索

go-zero结合Elasticsearch实现高效数据检索 1. Elasticsearch简单介绍 Elasticsearch&#xff08;简称 ES&#xff09; 是一个基于 Lucene 库 构建的 分布式、开源、实时搜索与分析引擎&#xff0c;采用 Apache 2.0 协议。它支持水平扩展&#xff0c;能高效处理大规模数据的存…...

AM32电调学习解读九:ESC上电启动关闭全流程波形分析

这是第九篇&#xff0c;前面的文章把各个模块的实现都介绍了一轮&#xff0c;本章是从运行的角度结合波形图&#xff0c;把整个流程走一遍。 先看下一运行的配置&#xff0c;我把一些配置关闭了&#xff0c;这样跑起来会好分析一些&#xff0c;不同配置跑起来效果会有差异。使用…...

怎么打包发布到npm?——从零到一的详细指南

怎么打包发布到npm&#xff1f;——从零到一的详细指南 目录 怎么打包发布到npm&#xff1f;——从零到一的详细指南一、准备工作1. 注册 npm 账号2. 安装 Node.js 和 npm 二、初始化项目三、编写你的代码四、配置 package.json五、打包你的项目六、登录 npm七、发布到 npm八、…...

NX二次开发C#---遍历当前工作部件实体并设置颜色

该代码片段展示了如何在Siemens NX软件中使用C#进行自动化操作。通过NXOpen和UFSession API&#xff0c;代码首先获取当前工作部件&#xff0c;并遍历其中的所有实体。对于每个实体&#xff0c;代码检查其类型和子类型是否为“实体”&#xff0c;如果是&#xff0c;则将其颜色设…...

如何用体育数据做分析:从基础统计到AI驱动的决策科学

一、体育数据分析的演进与价值创造 体育数据分析已从简单的比分记录发展为融合统计学、计算机科学和运动科学的交叉学科。现代体育组织通过数据分析可以实现&#xff1a; 竞技表现提升&#xff1a;勇士队利用投篮热图优化战术布置 商业价值挖掘&#xff1a;曼联通过球迷行为数…...

09、底层注解-@Import导入组件

09、底层注解-Import导入组件 Import是Spring框架中的一个注解&#xff0c;用于将组件导入到Spring的应用上下文中。以下是Import注解的详细介绍&#xff1a; #### 基本用法 - **导入配置类** java Configuration public class MainConfig { // 配置内容 } Configuration Impo…...