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

Kafka消费者客户端源码深度解析:从架构到核心流程

在Kafka生态系统中,消费者客户端作为数据消费的入口,其设计与实现直接影响数据处理的效率和可靠性。本文将深入Kafka消费者客户端源码,通过核心组件解析、流程拆解与源码分析,揭示其高性能消费背后的技术奥秘,并辅以架构图与流程图增强理解。

一、消费者客户端整体架构

Kafka消费者客户端采用分层架构设计,各组件职责明确且协同工作,核心组件包括:

  • KafkaConsumer:消费者入口,封装消费逻辑与API
  • Fetcher:负责从Broker拉取消息数据
  • ConsumerCoordinator:管理消费组协调与Rebalance
  • PartitionAssignor:实现分区分配策略
  • OffsetManager:管理消费位移的提交与获取

消费者客户端的整体架构如下所示:

KafkaConsumer
Fetcher
ConsumerCoordinator
Metadata
NetworkClient
PartitionAssignor
OffsetManager
Cluster元数据

二、消费者初始化流程解析

2.1 配置加载与组件初始化

KafkaConsumer的构造函数是初始化的起点,核心逻辑如下:

public KafkaConsumer(Properties properties) {// 解析配置参数this.config = new ConsumerConfig(properties);// 初始化元数据管理器this.metadata = new Metadata(config);// 创建Fetcher处理消息拉取this.fetcher = new Fetcher(config, metadata, time, this);// 初始化消费组协调器this.coordinator = new ConsumerCoordinator(this, metadata, config);// 创建网络客户端this.client = new NetworkClient(new Selector(config.getLong(ConsumerConfig.CONNECTIONS_MAX_IDLE_MS_CONFIG)),metadata,time,config.getLong(ConsumerConfig.RECEIVE_BUFFER_CONFIG),config.getLong(ConsumerConfig.SEND_BUFFER_CONFIG));// 启动后台线程this.worker = new ConsumerNetworkClientWorker(client, metadata, time);this.worker.start();
}

关键配置参数解析:

  • bootstrap.servers:指定Kafka集群地址
  • group.id:消费组标识,同一组消费者共同消费分区
  • key.deserializer/value.deserializer:反序列化器配置
  • fetch.min.bytes:每次拉取的最小数据量
  • fetch.max.wait.ms:拉取等待超时时间

2.2 元数据获取与分区分配

消费者启动后会主动获取集群元数据:

public List<PartitionInfo> partitionsFor(String topic) {// 等待元数据更新metadata.add(topic);metadata.awaitUpdate(metadataTimeoutMs);// 返回主题的分区信息return metadata.partitionsFor(topic);
}

当消费者加入消费组时,会触发分区分配流程,核心由ConsumerCoordinator处理:

public void onJoinPrepare(JoinGroupRequest.Builder requestBuilder) {// 收集订阅的主题requestBuilder.topics(subscriptions().all());// 获取分区分配策略List<String>策略 = config.get(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG).stream().map(Class::getName).collect(Collectors.toList());requestBuilder.strategies(策略);
}

三、消息拉取核心流程

3.1 poll()方法核心逻辑

poll()是消费者获取消息的主要接口,其核心流程如下:

public ConsumerRecords<K, V> poll(Duration timeout) {// 检查是否已订阅主题ensureSubscribed();// 等待分配分区if (subscriptions().hasNoSubscriptionOrUserAssignment()) {subscribeTopics();}// 拉取消息的主循环while (true) {// 处理重平衡结果handleAssignment();// 准备拉取请求Map<TopicPartition, FetchRequest.PartitionData> partitions = prepareFetchRequests();// 发送拉取请求client.send(fetchRequest, requestTimeoutMs);// 处理拉取响应handleFetchResponse();// 返回拉取到的消息if (!records.isEmpty()) {return records;}}
}

3.2 Fetcher拉取实现

Fetcher负责具体的消息拉取逻辑:

public FetchSessionResult fetch(FetchRequest request) {// 构建请求并发送client.send(request.destination(), request);// 处理响应Map<TopicPartition, FetchResponse.PartitionData> responses = new HashMap<>();while (responses.size() < request.partitions().size()) {// 轮询获取响应ClientResponse response = client.poll(Duration.ofMillis(100));if (response.request() instanceof FetchRequest) {FetchResponse fetchResponse = (FetchResponse) response.responseBody();responses.putAll(fetchResponse.partitionData());}}// 返回拉取结果return new FetchSessionResult(responses, fetchResponse.throttleTimeMs());
}

拉取请求参数控制:

  • fetch.min.bytes:确保每次拉取至少获取指定字节数
  • fetch.max.bytes:单次拉取的最大字节数
  • max.poll.records:单次poll返回的最大记录数

四、分区分配与Rebalance机制

4.1 分区分配策略

Kafka提供多种分区分配策略,核心接口为PartitionAssignor

public interface PartitionAssignor {// 计算分配方案Map<String, List<TopicPartition>> assign(Map<String, List<TopicPartition>> partitions,Map<String, Subscription> subscriptions);// 策略名称String name();
}

内置策略包括:

  • RangeAssignor:按分区范围分配
  • RoundRobinAssignor:轮询分配
  • StickyAssignor:粘性分配,尽量保持原有分配

4.2 Rebalance触发与处理

Rebalance触发条件:

  1. 消费者加入/离开消费组
  2. 分区数量变化
  3. 消费者心跳超时

ConsumerCoordinator处理Rebalance的核心逻辑:

private void maybeTriggerRebalance() {if (memberState == MemberState.UNJOINED || !subscriptions().hasSubscription()) {return;}// 检查是否需要Rebalanceif (needsRebalance()) {// 触发重平衡requestRebalance();}
}private boolean needsRebalance() {// 检查消费组状态if (coordinatorUnknown()) {return true;}// 检查是否有新分区if (subscriptions().hasNewPartitions()) {return true;}// 检查心跳超时if (time.milliseconds() - lastHeartbeat > sessionTimeoutMs) {return true;}return false;
}

五、位移管理与可靠性保证

5.1 位移提交机制

位移提交分为自动提交与手动提交,核心由OffsetManager处理:

public void commitSync() {commitSync(Collections.emptyMap());
}public void commitSync(Map<TopicPartition, OffsetAndMetadata> offsets) {if (offsets.isEmpty()) {// 提交所有分区的位移offsets = this.offsets();}// 构建提交请求OffsetCommitRequest.Builder builder = OffsetCommitRequest.builder(offsets).setGroupId(groupId).setGenerationId(memberGeneration.generationId()).setMemberId(memberId);// 发送提交请求ClientResponse response = client.send(coordinator, builder.build()).get();// 处理响应handleOffsetCommitResponse((OffsetCommitResponse) response.responseBody());
}

5.2 位移存储实现

位移默认存储在Kafka的__consumer_offsets主题中,由OffsetManager管理:

private Map<TopicPartition, OffsetAndMetadata> loadoffsets() {// 从__consumer_offsets主题读取位移TopicPartition tp = new TopicPartition(OFFSET_TOPIC, groupId.hashCode() % OFFSET_PARTITIONS);FetchRequest request = FetchRequest.builder().addFetch(tp, OFFSET_STORAGE_TIMESTAMP, Long.MAX_VALUE, 1).build();FetchResponse response = (FetchResponse) client.send(coordinator, request).get().responseBody();// 解析位移数据return parseOffsetData(response.partitionData().get(tp));
}

六、性能优化与最佳实践

6.1 关键参数调优

  • fetch.min.bytes:建议设置为10KB-1MB,平衡延迟与吞吐量
  • fetch.max.wait.ms:配合fetch.min.bytes,控制拉取等待时间
  • max.poll.records:根据处理能力设置,避免单次拉取过多数据
  • session.timeout.ms:建议设置为10-30秒,控制Rebalance触发频率

6.2 高效消费模式

// 手动提交位移的最佳实践
try {while (true) {ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));for (ConsumerRecord<String, String> record : records) {process(record);// 记录位移offsetsToCommit.put(new TopicPartition(record.topic(), record.partition()),new OffsetAndMetadata(record.offset() + 1));}// 批量提交位移if (!offsetsToCommit.isEmpty()) {consumer.commitSync(offsetsToCommit);}}
} catch (Exception e) {// 处理异常后重新提交consumer.commitSync(offsetsToCommit);
}

通过对Kafka消费者客户端的源码深度解析,我们了解了从初始化、消息拉取到分区分配、位移管理的完整流程。消费者客户端通过分层架构、高效网络通信与智能分配策略,实现了高吞吐量与低延迟的消息消费。在实际应用中,合理配置参数与选择消费模式,能够充分发挥Kafka消费者的性能优势,满足各类实时数据处理场景的需求。

相关文章:

Kafka消费者客户端源码深度解析:从架构到核心流程

在Kafka生态系统中&#xff0c;消费者客户端作为数据消费的入口&#xff0c;其设计与实现直接影响数据处理的效率和可靠性。本文将深入Kafka消费者客户端源码&#xff0c;通过核心组件解析、流程拆解与源码分析&#xff0c;揭示其高性能消费背后的技术奥秘&#xff0c;并辅以架…...

Linux进程间通信:从入门到精通(2)

嘿&#xff0c;小伙伴&#xff01;今天我们来聊聊Linux系统中一个超级重要的话题——进程间通信&#xff08;IPC&#xff09;。看到"进程间通信"这个词&#xff0c;别急着打哈欠&#xff0c;这可是Linux内核中的"社交达人"&#xff0c;让进程们能够愉快地交…...

从源码到生产:Apache 2.4.57 自动化安装实战指南(附脚本)

引言&#xff1a;为何选择源码安装 Apache&#xff1f; 在服务器运维场景中&#xff0c;源码编译安装 Apache HTTP Server 是实现精细化配置的重要方式。相比包管理器安装&#xff0c;源码安装可自定义模块组合、适配特定依赖环境&#xff0c;并精确控制版本。本文将通过自动化…...

CMake实践:指定gcc版本编译和交叉编译

目录 1.指定gcc版本编译 1.1.通过CMake参数来实现 1.2.使用 RPATH/RUNPATH 直接指定库路径 1.3.使用符号链接和 LD_LIBRARY_PATH 1.4.使用 wrapper 脚本封装 LD_LIBRARY_PATH 2.交叉编译 2.1.基本用法 2.2.工具链文件关键配置 2.3.多平台工具链示例 2.4.注意事项 2.…...

【MySQL基础】MySQL内置函数全面解析:提升你的数据库操作效率

MySQL学习&#xff1a; https://blog.csdn.net/2301_80220607/category_12971838.html?spm1001.2014.3001.5482 前言&#xff1a; MySQL提供了丰富的内置函数来帮助开发者高效地处理数据。这些函数覆盖了字符串操作、数值计算、日期时间处理、流程控制等多个方面。本文将全面…...

OpenCV CUDA模块设备层-----在GPU上计算两个uchar1类型像素值的反正切(arctangent)比值函数atan2()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 对输入的两个 uchar1 像素值 a 和 b&#xff0c;先分别归一化到 [0.0, 1.0] 浮点区间&#xff0c;然后计算它们的 四象限反正切函数。 函数原型…...

unity 半透明描线shader

效果如图 Shader "Custom/TransparentWithOutline_Fixed" {Properties{// 主材质属性_Color ("Main Color", Color) (1,1,1,1)_MainTex ("Base (RGB) Trans (A)", 2D) "white" {}_Glossiness ("Smoothness", Range(0,1)…...

react中使用antd的form表单去受控switch时初始值没有正确显示

解决方案 antd内api中有valuePropName熟悉 只需正常绑定当前元素触发事件即可...

01__QT的背景介绍和工程创建

一、QT软件的安装 1、qt的背景介绍 Qt 是一个跨平台的 图形界面库&#xff08;重量级&#xff09;&#xff0c;1994年由罗威troll tech公司出品&#xff0c;它集成了网络、数据库、串口通信协议&#xff08;RS232&#xff0c;蓝牙&#xff0c;NFC&#xff09;、打印、PDF生成…...

Java Map 深度解析

一、HashMap 底层实现详解 1. 核心数据结构 HashMap 在 JDK 8 中的底层结构是 数组 链表 红黑树&#xff0c;其核心成员变量包括&#xff1a; transient Node<K,V>[] table;&#xff1a;哈希桶数组transient int size;&#xff1a;实际键值对数量int threshold;&…...

异地组网工具

目前手头上两台服务器&#xff08;一台主力&#xff0c;一台有gpu用来跑点深度学习任务&#xff09;&#xff0c;两台pc&#xff08;一台是主力&#xff0c;一台是便携碎片化时间随时赶工用&#xff09;&#xff1b; 之前组网的时候&#xff0c;用zerotiertailscale&#xff0…...

我们为什么要模拟

大约 25 年前&#xff0c;当我开始从事高速 PCB 设计时&#xff0c;速度很慢&#xff0c;层数少&#xff0c;介电常数和损耗角正切很高&#xff0c;设计裕量很宽&#xff0c;铜粗糙度无关紧要&#xff0c;玻璃编织样式也无关紧要。我们称电介质为“FR-4”&#xff0c;它们的特性…...

MySQL 三大日志:Redo、Undo 与 Binlog 详解

写在前面 关于三大日志&#xff0c;博主看了无数视频和文章&#xff0c;也是总结的非常精辟了&#xff01; 在 MySQL 数据库的运行机制中&#xff0c;Redo Log、Undo Log 和 Binlog 起着至关重要的作用&#xff0c;它们各司其职&#xff0c;共同保障数据库的数据安全、事务一…...

JMeter-SSE响应数据自动化3.0

背景 此次因为多了一些需要过滤排除的错误(数量很少)&#xff0c;还需要修改下JMeter的jtl文件输出数据&#xff08;后续统计数据需要&#xff09; 所以只涉及到JSR脚本的一些改动(此部分改动并不会影响到JMeter的HTML报告) 改动 主要通过设置JMeter中prev输出数据变量threadN…...

C#上位机通过WebApi访问WinCC

在智能工厂架构中&#xff0c;WinCC作为SCADA一级&#xff0c;负责着与上级MES和下级PLC及其他现场组件的联系。与下层通信&#xff0c;WinCC支持S7、MC、Modbus TCP、OPC等多种接口和协议。对上层通信&#xff0c;WinCC从7.5 SP2开始支持REST Api这种Web接口方式。 今天跟大家…...

【深度学习新浪潮】什么是端侧AI?

什么是端侧AI? 端侧AI的定义 端侧AI(Edge AI)是指在终端设备(如手机、智能家居、穿戴设备等)本地运行的人工智能技术,无需将数据上传至云端服务器,直接在设备端完成数据处理、模型推理和决策。其核心优势在于低延迟、高隐私性、减少网络依赖,尤其适合对实时性和数据安…...

Postman 的 Jenkins 管理 - 自动构建

目录 一、环境准备 创建 Postman 集合和环境 二、postman Postman 集合和环境并导出 1. 打开已完成并测试无误的 postman 项目脚本。 再次执行测试。 ​编辑​2. 导出&#xff08; 测试用例集、环境变量 两个文件&#xff09;**“不 支 持 中 文”** —— 全部改成英文&a…...

HomeBrew MAC PRO 安装教程

1、检查xcode工具 这个东西一般是有的&#xff0c;命令后输入以下内容即可 xcode-select --install如安装&#xff0c;结果为&#xff1a; 2、安装HomeBrew 方式1&#xff08;推荐&#xff09; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebr…...

多模态大语言模型arxiv论文略读(129)

Task Success Prediction for Open-Vocabulary Manipulation Based on Multi-Level Aligned Representations ➡️ 论文标题&#xff1a;Task Success Prediction for Open-Vocabulary Manipulation Based on Multi-Level Aligned Representations ➡️ 论文作者&#xff1a;M…...

Android 实现 Toast 显示重叠问题,有效提升用户体验

Android 实现 Toast 显示重叠问题 在 Android 开发中&#xff0c;Toast 是一个非常常用的提示工具&#xff0c;能够为用户提供短暂的信息展示。然而&#xff0c;Toast 的默认实现中&#xff0c;存在一个体验上的问题&#xff0c;当多次触发 Toast 显示时&#xff0c;会导致多个…...

Spring Boot + MyBatis + Vue:构建高效全栈应用的实战指南

一、项目需求分析 假设我们需要开发一个简单的任务管理系统&#xff0c;用户可以通过该系统创建、查看和删除任务。以下是项目的基本需求&#xff1a; 用户管理&#xff1a;用户可以注册和登录系统。 任务管理&#xff1a;用户可以创建、查看和删除任务。 数据持久化&#x…...

语音情感识别:CNN-LSTM 和注意力增强 CNN-LSTM 模型的比较分析

摘要: 语音情感识别 &#xff08;SER&#xff09; 技术可帮助计算机理解语音中的人类情感&#xff0c;这在推进人机交互和心理健康诊断方面占据了关键地位。本研究的主要目标是通过创新的深度学习模型提高 SER 的准确性和泛化性。尽管它在人机交互和心理健康诊断等各个领域都很…...

Cursor Pro取消500次请求限制,无限用的体验更好了吗?

目录 前言 一、发生了什么&#xff1f;从"限量"到"无限"的升级 1.1 "顶配" Ultra 套餐的登场 1.2 Pro 套餐的"静默升级" 1.3 新旧方案对比 二、"无限"背后的体验&#xff1a;一个开发者的真实感受 三、Cursor 为何要…...

视频汇聚EasyCVR平台v3.7.2发布:新增全局搜索、播放器默认解码方式等4大功能

EasyCVR视频汇聚平台带着全新的v3.7.2版本重磅登场&#xff01;此次升级&#xff0c;绝非简单的功能堆砌&#xff0c;而是从用户体验、操作效率以及系统性能等多维度进行的深度优化与革新&#xff0c;旨在为大家带来更加强大、稳定且高效的视频监控管理体验。 一、全局功能搜索…...

2025年AI热潮:开发一款聚合AI系统,包含AI对话、视频、数字人、办公、客服、剪辑为一体的ai智能系统有多强

前言&#xff0c;我们了解了网上比较火的ai平台&#xff0c;比如&#xff1a; 抖音豆包AI、百度AI、阿里巴巴AI、腾讯AI、华为AI、DeepSeek、ChatGPT、文心一言、通义千问 一、系统概述 本聚合AI系统是一个集AI对话、图片生成、视频生成、视频剪辑、数字人创作、音乐制作、办公…...

DeepSeek 助力 Vue3 开发:打造丝滑的日历(Calendar),日历_项目里程碑示例(CalendarView01_22)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…...

AWS数据库迁移实战:本地MySQL零停机上云方案

一、迁移场景 本地环境&#xff1a;自建MySQL 5.7&#xff08;数据量500GB&#xff09;&#xff0c;业务要求迁移停机时间<5分钟 目标架构&#xff1a; 二、迁移四步法 步骤1&#xff1a;环境准备&#xff08;耗时30分钟&#xff09; 1.1 创建Aurora MySQL # AWS CLI创…...

windows汇编

今天发现一个很好的视频&#xff0c;讲windows汇编/调试等。是个老太太讲的&#xff0c;但是讲的真好。 Create/Assemble/Link x64 Windows asm exe, Debugging Tools for Windows (WinDbg), stack shadow store. 照例边看边记录边实验。 1. install visual studio 2. instal…...

用 python 开发一个可调用工具的 AI Agent,实现电脑配置专业评价

在人工智能时代&#xff0c;AI Agent凭借其强大的任务处理能力&#xff0c;逐渐成为开发人员手中的得力工具。今天&#xff0c;我们就来一起动手&#xff0c;用Python打造一个能够调用工具的AI Agent&#xff0c;实现根据电脑信息对电脑配置进行专业评价的功能。 一、项目创建…...

Java自定义线程池(ThreadPoolExecutor)

Java线程池使用示例 下面将展示如何使用自定义线程池(ThreadPoolExecutor)来执行任务&#xff0c;包括提交Runnable任务、Callable任务&#xff0c;处理拒绝策略以及关闭线程池。 import java.util.concurrent.*;public class ThreadPoolDemo {// 自定义线程工厂&#xff08;…...

386. 字典序排数

386. 字典序排数 理解题目要求 题目要求我们生成从 1 到 n 的整数的字典序排列&#xff0c;并且要求&#xff1a; ​时间复杂度 O(n)​​&#xff1a;不能使用直接排序&#xff08;通常指的是使用标准的排序算法&#xff08;如快速排序、归并排序、堆排序等&#xff09;对数…...

Kaggle-Plant Seedlings Classification-(多分类+CNN+图形处理)

Plant Seedlings Classification 题意&#xff1a; 就是给出很多图片&#xff0c;预测出图片中的小草是什么类型的。 数据处理&#xff1a; 1.去除图片背景&#xff0c;只保留物体。 2.图片数据加强。 建立模型&#xff1a; 1.CNN的Sequential()&#xff0c;多层卷积块和…...

Android 应用多语言与系统语言偏好设置指南

文章目录 创建语言包以中文包为例 以系统为主导的“应用语言偏好设置”从你的应用调到“应用语言偏好设置” 创建语言包 我们可以使用一个很蹩脚的办法来实现&#xff1a; 以中文包为例 values是默认values-zh-rCN是简体中文values-zh-rTW是繁体&#xff08;台湾省&#xff…...

Excel学习01

Excel是微软公司开发的一款电子表格软件&#xff0c;可以广泛应用于数据处理、统计分析、图表制作、财务管理和自动化办公领域等。Excel在实际工作中使用的非常广泛&#xff0c;为此本次开始针对excel的使用进行一系列讲解。 展示使用的软件是WPS&#xff0c;它和excel的使用方…...

Loggers 配置解析(log4j.xml)

Loggers 配置解析 我们通过下面的例子来理解 log4j 的 Loggers 配置是如何决定日志输出规则的。 <Loggers><!-- 根Logger&#xff1a;全局配置 --><Root level"debug"><AppenderRef ref"consoleAppender" level"info"/&g…...

Matplotlib 绘图库使用技巧介绍

目录 前言 Matplotlib 简介 快速入门 图形结构解剖 常用绘图函数 子图与布局 单行多列子图&#xff1a; 网格布局&#xff1a; 自定义位置&#xff1a; 样式与标注 中文字体与科学计数 图例、网格、坐标轴 动态图与动画 三维绘图 常见问题与技巧 前言 Matplotli…...

服务器如何从http升级到https(nginx)

1.证书申请 可以到阿里云或者华为云去申请证书&#xff0c;申请完下载证书是个压缩包&#xff0c;然后解压 可以到到几个文件夹&#xff0c;找到 .Nginx 文件夹打开 会有两个文件&#xff0c;将这两个文件上传至nginx/conf/cert文件夹下&#xff08;cert需要手…...

解决戴尔电脑No bootable devices found问题

解决戴尔电脑No bootable devices found问题 一、调整BIOS设置 1、在关机状态下&#xff0c;打开计算机电源&#xff0c;在出现 Dell 徽标时按 F2 键以引导至 BIOS 设置菜单。 2、选择 Boot sequence&#xff08;引导顺序 &#xff09;并将选项从 Legacy&#xff08;传统 &…...

FPGA基础 -- Verilog 行为级建模之条件语句

Verilog 的行为级建模&#xff08;Behavioral Modeling&#xff09;中的条件语句&#xff08;Conditional Statements&#xff09;&#xff0c;逐步从基础到实际工程应用&#xff0c;适合有RTL开发基础但希望深入行为建模的人。 一、行为级建模简介 行为级建模&#xff08;Beh…...

最大公约数

题目描述 输入两个正整数a,b,求a,b的最大公约数。 输入 输入正整数a和b,中间用空格隔开 输出 输出最大公约数 样例输入 144 84样例输出 12程序分析 &#xff1a;运用辗转相除法&#xff08;欧几里得算法&#xff09; 用较大数除以较小数&#xff0c;取余数&#xff1b…...

springboot入门之路(一)

文章目录 1.Spring Boot介绍2.开发你的第一个Spring Boot应用2.1创建POM2.2yml和properties的配置区别yml配置properties配置 2.3springbootDemo代码2.4创建一个可执行jar 参考文档&#xff1a;SpringBoot参考指南&#xff1b;SpringBoot实战 1.Spring Boot介绍 Spring Boot使…...

vue | vue 插件化机制,全局注册 和 局部注册

组件插件化&#xff1a;提升组件的可复用性、扩展性和独立性 组件插件化实现方式 ├── 注册机制 │ ├── 全局注册&#xff08;app.use&#xff09;→ install, 循环注册, 配置项 │ └── 局部注册&#xff08;import components&#xff09; │ ├── 插件化能力…...

技术与情感交织的一生 (八)

目录 融合 东西厂公 接风宴 头痛 “巴巴罗萨” 突击 推进 助攻 96小时 寒冬 食堂 反攻 消耗 Delphi 西厂 内困 外患 “敦刻尔克” 多线作战 大撤退 资源 融合 东西厂公 初次来到纸箱厂&#xff0c;是主厂区&#xff0c;感觉很大&#xff0c;相对西面正在…...

基于python的web系统界面登录

#让我们的电脑可以支持服务访问 #需要一个web框架 #pip install Flask from flask import Flask, render_template,request from random import randint app Flask(__name__) app.route(/index) def index():uname request.args.get("uname")return f"主页&am…...

利用Java进行验证码的实现——算数验证码

我主要使用使用 Java Swing 库创建一个 GUI 窗口&#xff0c;然后在窗口中显示生成的算术验证码图片&#xff0c;并提供一个文本框和一个按钮&#xff0c;输入验证码并验证显示结果。 代码如下&#xff1a; package calculate; import javax.swing.*; import java.awt.*; imp…...

OpenStack入门体验

1.1云计算概述 相信大家都听到很多的阿里云、腾讯云、百度云等等这些词,那到底什么是云计算?云 计算又能做什么? 1.1.1什么是云计算 云计算(cloud computing)是一种基于网络的超级计算模式,基于用户的不同需求,提供所需的资源,包括计算资源、存储资源、网络资源等。云计算…...

实时中值滤波 + 低通滤波 示例程序(STM32环境)

一、功能概述 本示例实现两个滤波器&#xff1a; 中值滤波器&#xff08;Median Filter&#xff09;&#xff1a;对短期异常值&#xff08;如尖峰噪声&#xff09;有良好的抑制能力&#xff1b;低通滤波器&#xff08;Low-Pass Filter&#xff09;&#xff1a;对数据进行平滑…...

AppBarLayout+ CoordinatorLayout,ViewPager2为什么不会覆盖AppBarLayout

<?xml version"1.0" encoding"utf-8"?> <layout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"xmlns:tools"http://schemas.android.com/tools&quo…...

C语言——枚举

目录 一、枚举的基本概念 1. 定义与语法 2. 枚举变量的声明 二、枚举的特性 1. 整型常量的本质 2. 作用域规则 3. 内存占用 三、枚举的使用场景 1. 替代宏定义常量 2. 状态机实现 3. 函数返回值类型 四、枚举与其他类型的对比 五、高级技巧与注意事项 1. 位掩码枚…...

148. 排序链表

题目&#xff1a; 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例1&#xff1a; 解题思路&#xff1a; 这道题是一道综合题&#xff0c;考察了链表中间节点合并有序链表。首先我们链表中间节点&#xff0c;然后从中间结点的前一个节点处断…...