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

实时数据处理实战:使用 Apache Flink 消费 Kafka 数据并进行窗口聚合

在大数据时代实时处理流式数据已经成为企业级应用的标配。无论是用户行为分析、实时监控告警还是金融风控系统都离不开低延迟、高吞吐的流处理引擎。本文将带你从零开始使用Apache Flink和Kafka构建一个完整的实时数据处理流水线涵盖数据模拟、流式消费、窗口聚合及结果输出所有代码均可直接运行。为什么选择 Flink KafkaKafka分布式消息队列擅长缓冲和分发海量实时数据保证数据可靠性和顺序性。Flink领先的流处理框架支持事件时间处理、精确一次语义Exactly-Once、毫秒级延迟和复杂状态管理。两者结合可以轻松搭建生产级的实时数仓或监控系统。实战场景我们模拟一个电商网站的用户点击流每个用户点击商品时产生一条 JSON 日志包含userId、productId、eventTypeclick/buy、timestamp。我们需要每隔 1 分钟统计一次所有商品的点击量PV并将结果实时写入 Elasticsearch 便于可视化。环境准备为了专注代码逻辑我们使用 Docker 快速启动 Kafka 和 Elasticsearch。Flink 程序可在本地 IDE 运行或提交到集群。1. 启动 Kafka 和 ES创建docker-compose.ymlyamlversion: 3 services: zookeeper: image: confluentinc/cp-zookeeper:latest environment: ZOOKEEPER_CLIENT_PORT: 2181 kafka: image: confluentinc/cp-kafka:latest depends_on: - zookeeper environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 ports: - 9092:9092 elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:8.6.0 environment: - discovery.typesingle-node - xpack.security.enabledfalse ports: - 9200:9200运行docker-compose up -d2. 创建 Maven 项目新建一个 Java 项目pom.xml关键依赖xmlproperties flink.version1.17.1/flink.version kafka.version3.4.0/kafka.version jackson.version2.15.2/jackson.version /properties dependencies !-- Flink 核心依赖 -- dependency groupIdorg.apache.flink/groupId artifactIdflink-streaming-java/artifactId version${flink.version}/version /dependency dependency groupIdorg.apache.flink/groupId artifactIdflink-clients/artifactId version${flink.version}/version /dependency !-- Flink Kafka 连接器 -- dependency groupIdorg.apache.flink/groupId artifactIdflink-connector-kafka/artifactId version${flink.version}/version /dependency !-- JSON 序列化 -- dependency groupIdcom.fasterxml.jackson.core/groupId artifactIdjackson-databind/artifactId version${jackson.version}/version /dependency !-- Elasticsearch 8.x 连接器 -- dependency groupIdorg.apache.flink/groupId artifactIdflink-connector-elasticsearch8/artifactId version${flink.version}/version /dependency !-- 日志 -- dependency groupIdorg.slf4j/groupId artifactIdslf4j-simple/artifactId version2.0.9/version /dependency /dependencies第一步模拟数据生产者我们编写一个独立的 Kafka 生产者每秒随机生成 100~500 条点击事件发送到click-events主题。javaimport org.apache.kafka.clients.producer.*; import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.Properties; import java.util.Random; import java.util.concurrent.TimeUnit; public class ClickEventProducer { private static final String TOPIC click-events; private static final String BOOTSTRAP_SERVERS localhost:9092; private static final Random random new Random(); private static final ObjectMapper mapper new ObjectMapper(); public static void main(String[] args) throws Exception { Properties props new Properties(); props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, BOOTSTRAP_SERVERS); props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, org.apache.kafka.common.serialization.StringSerializer); props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, org.apache.kafka.common.serialization.StringSerializer); try (KafkaProducerString, String producer new KafkaProducer(props)) { long userIdCounter 0; while (true) { int eventsThisSecond 100 random.nextInt(401); // 100-500 条/秒 for (int i 0; i eventsThisSecond; i) { String event generateEvent(userIdCounter); producer.send(new ProducerRecord(TOPIC, event)); } TimeUnit.SECONDS.sleep(1); } } } private static String generateEvent(long userId) { long now System.currentTimeMillis(); ObjectNode json mapper.createObjectNode(); json.put(userId, userId % 100000); // 模拟 10 万用户 json.put(productId, random.nextInt(500)); json.put(eventType, random.nextBoolean() ? click : buy); json.put(timestamp, now); return json.toString(); } }运行这个类之前先在 Kafka 中创建主题生产环境一般自动创建也可手动bashdocker exec -it kafka-container-id kafka-topics --create --topic click-events --bootstrap-server localhost:9092 --partitions 3 --replication-factor 1第二步定义数据实体和反序列化器Flink 从 Kafka 消费的是二进制数据我们需要将其解析为 POJO。这里定义一个简单的ClickEvent类javaimport java.sql.Timestamp; public class ClickEvent { public long userId; public int productId; public String eventType; public long timestamp; // 毫秒 public ClickEvent() {} // 必须有无参构造 public ClickEvent(long userId, int productId, String eventType, long timestamp) { this.userId userId; this.productId productId; this.eventType eventType; this.timestamp timestamp; } Override public String toString() { return String.format(ClickEvent{user%d, product%d, type%s, ts%s}, userId, productId, eventType, new Timestamp(timestamp)); } }反序列化器使用 Jackson 将 JSON 字符串转成ClickEventjavaimport org.apache.flink.api.common.serialization.DeserializationSchema; import org.apache.flink.api.common.typeinfo.TypeInformation; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; public class ClickEventDeserializer implements DeserializationSchemaClickEvent { private static final ObjectMapper mapper new ObjectMapper(); Override public ClickEvent deserialize(byte[] message) throws IOException { return mapper.readValue(message, ClickEvent.class); } Override public boolean isEndOfStream(ClickEvent nextElement) { return false; } Override public TypeInformationClickEvent getProducedType() { return TypeInformation.of(ClickEvent.class); } }第三步编写 Flink 核心作业这是文章的核心——实时统计每分钟每个商品的点击次数PV并写入 Elasticsearch。3.1 构建执行环境并设置时间特性javaimport org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.api.windowing.assigners.TumblingEventTimeWindows; import org.apache.flink.streaming.api.windowing.time.Time; import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer; import org.apache.flink.api.common.eventtime.WatermarkStrategy; import java.time.Duration; import java.util.Properties; public class RealTimePVJob { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env StreamExecutionEnvironment.getExecutionEnvironment(); env.setParallelism(1); // 为了方便演示设置并行度为1 // 设置 Kafka 消费属性 Properties kafkaProps new Properties(); kafkaProps.setProperty(bootstrap.servers, localhost:9092); kafkaProps.setProperty(group.id, flink-pv-group); // 创建 Kafka 消费者 FlinkKafkaConsumerClickEvent consumer new FlinkKafkaConsumer( click-events, new ClickEventDeserializer(), kafkaProps ); // 为了处理乱序数据设置最大允许延迟 5 秒 WatermarkStrategyClickEvent watermarkStrategy WatermarkStrategy .ClickEventforBoundedOutOfOrderness(Duration.ofSeconds(5)) .withTimestampAssigner((event, timestamp) - event.timestamp); DataStreamClickEvent clickStream env .addSource(consumer) .assignTimestampsAndWatermarks(watermarkStrategy); // 后续操作... env.execute(Real-time PV Statistics); } }3.2 计算每分钟每个商品的点击量我们需要按productId分组然后在 1 分钟的滚动窗口内统计click事件的数量。javaimport org.apache.flink.streaming.api.datastream.KeyedStream; import org.apache.flink.streaming.api.datastream.WindowedStream; import org.apache.flink.streaming.api.windowing.windows.TimeWindow; import org.apache.flink.api.common.functions.MapFunction; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.util.Collector; // 接上面代码 DataStreamTuple2Integer, Long productClickCounts clickStream .filter(event - click.equals(event.eventType)) // 只统计点击 .map(new MapFunctionClickEvent, Tuple2Integer, Long() { Override public Tuple2Integer, Long map(ClickEvent event) { return Tuple2.of(event.productId, 1L); } }) .keyBy(tuple - tuple.f0) // 按 productId 分组 .window(TumblingEventTimeWindows.of(Time.minutes(1))) .reduce((a, b) - Tuple2.of(a.f0, a.f1 b.f1));或者使用更清晰的sum聚合javaimport org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.api.common.functions.MapFunction; import org.apache.flink.api.java.tuple.Tuple2; DataStreamTuple2Integer, Long counts clickStream .filter(e - click.equals(e.eventType)) .map(e - Tuple2.of(e.productId, 1L)) .returns(Types.TUPLE(Types.INT, Types.LONG)) .keyBy(t - t.f0) .window(TumblingEventTimeWindows.of(Time.minutes(1))) .sum(1);3.3 将结果输出到控制台调试用javacounts.print();3.4 写入 Elasticsearch生产常用Flink 提供了 Elasticsearch 8 的 Sink。我们定义一个ElasticsearchSink将每个窗口的统计结果以 JSON 形式存入索引product_pv。javaimport org.apache.flink.streaming.connectors.elasticsearch8.ElasticsearchSink; import org.apache.flink.streaming.connectors.elasticsearch8.RequestIndexer; import org.apache.flink.api.common.functions.RuntimeContext; import org.apache.http.HttpHost; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.client.Requests; import java.util.HashMap; import java.util.Map; public static ElasticsearchSinkTuple2Integer, Long createESSink() { // ES 服务器地址 HttpHost httpHost new HttpHost(localhost, 9200, http); ElasticsearchSink.BuilderTuple2Integer, Long esBuilder new ElasticsearchSink.Builder(java.util.Collections.singletonList(httpHost), (Tuple2Integer, Long element, RuntimeContext ctx, RequestIndexer indexer) - { MapString, Object json new HashMap(); json.put(productId, element.f0); json.put(clickCount, element.f1); json.put(windowEnd, System.currentTimeMillis()); // 可改用窗口结束时间 IndexRequest indexRequest Requests.indexRequest() .index(product_pv) .source(json); indexer.add(indexRequest); }); // 可选配置批量写入参数 esBuilder.setBulkFlushMaxActions(10); return esBuilder.build(); } // 在 main 方法中添加 counts.sinkTo(createESSink());注意Elasticsearch 索引product_pv需要提前创建动态创建也可建议在 Kibana 或通过 REST API 创建映射以优化性能。第四步完整可运行代码整合为了方便复制下面给出完整的RealTimePVJob.java省略 package 和 imports但核心逻辑已全javapublic class RealTimePVJob { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env StreamExecutionEnvironment.getExecutionEnvironment(); env.setParallelism(2); // 可以根据 CPU 调整 Properties kafkaProps new Properties(); kafkaProps.setProperty(bootstrap.servers, localhost:9092); kafkaProps.setProperty(group.id, flink-pv-group); FlinkKafkaConsumerClickEvent consumer new FlinkKafkaConsumer( click-events, new ClickEventDeserializer(), kafkaProps ); WatermarkStrategyClickEvent watermarkStrategy WatermarkStrategy .ClickEventforBoundedOutOfOrderness(Duration.ofSeconds(5)) .withTimestampAssigner((event, recordTimestamp) - event.timestamp); DataStreamClickEvent source env .addSource(consumer) .assignTimestampsAndWatermarks(watermarkStrategy); DataStreamTuple2Integer, Long pvStream source .filter(event - click.equals(event.eventType)) .map(e - Tuple2.of(e.productId, 1L)) .returns(Types.TUPLE(Types.INT, Types.LONG)) .keyBy(t - t.f0) .window(TumblingEventTimeWindows.of(Time.minutes(1))) .sum(1); pvStream.print(PV per product every minute); pvStream.sinkTo(createESSink()); env.execute(Flink Kafka to ES PV Job); } private static ElasticsearchSinkTuple2Integer, Long createESSink() { HttpHost httpHost new HttpHost(localhost, 9200, http); ElasticsearchSink.BuilderTuple2Integer, Long builder new ElasticsearchSink.Builder(Collections.singletonList(httpHost), (element, ctx, indexer) - { MapString, Object doc new HashMap(); doc.put(productId, element.f0); doc.put(pv, element.f1); doc.put(timestamp, System.currentTimeMillis()); IndexRequest request Requests.indexRequest() .index(product_pv) .source(doc); indexer.add(request); }); builder.setBulkFlushMaxActions(10); return builder.build(); } }运行与验证启动 Docker 容器Kafka ES运行ClickEventProducer开始发送模拟数据运行RealTimePVJob观察控制台输出每分钟打印一次统计结果查询 Elasticsearch验证数据写入bashcurl -X GET localhost:9200/product_pv/_search?pretty你会看到类似下面的文档json{ productId: 123, pv: 342, timestamp: 1743249876000 }进阶优化与常见问题1. 使用事件时间 vs 处理时间本例使用了事件时间基于数据中的timestamp字段能正确处理乱序和延迟数据。如果使用处理时间只需将TumblingEventTimeWindows换成TumblingProcessingTimeWindows但这样会丢失事件时间的语义。2. 检查点Checkpoint配置为了达到 Exactly-Once 语义建议启用 checkpointjavaenv.enableCheckpointing(60000); // 每分钟一次 env.getCheckpointConfig().setMinPauseBetweenCheckpoints(30000);3. Kafka 消费者的 offset 提交Flink 默认在 checkpoint 完成时提交 offset保证一致性。如果未开启 checkpoint则依赖setCommitOffsetsOnCheckpoints参数。4. Elasticsearch 连接优化增大setBulkFlushMaxActions和setBulkFlushInterval提高吞吐。如果 ES 开启安全认证需要添加HttpHost的凭证。5. 处理乱序和迟到数据除了 Watermark 的延迟容忍可以使用allowedLateness让窗口等待一段时间java.window(TumblingEventTimeWindows.of(Time.minutes(1))) .allowedLateness(Time.seconds(10)) .sideOutputLateData(lateTag) // 将迟到数据输出到侧输出流6. 状态后端选择如果窗口状态很大例如按用户、商品多维聚合建议使用 RocksDB 作为状态后端避免 OOM。扩展从 PV 到 UV只需修改 keyBy 和聚合逻辑即可计算每分钟独立访客数UV。例如javaDataStreamTuple2Integer, Long uvStream source .filter(e - click.equals(e.eventType)) .map(e - Tuple2.of(e.productId, e.userId)) .keyBy(t - t.f0) .window(TumblingEventTimeWindows.of(Time.minutes(1))) .aggregate(new AggregateFunctionTuple2Integer,Long, SetLong, Long() { Override public SetLong createAccumulator() { return new HashSet(); } Override public SetLong add(Tuple2Integer,Long value, SetLong acc) { acc.add(value.f1); return acc; } Override public Long getResult(SetLong acc) { return (long) acc.size(); } Override public SetLong merge(SetLong a, SetLong b) { a.addAll(b); return a; } });总结本文带你完整实现了一条基于 Kafka Flink Elasticsearch 的实时数据处理管道。从模拟数据生成、事件时间窗口聚合到结果持久化每一步都提供了可直接运行的代码。你可以基于此模板轻松适配其他业务场景如实时推荐、监控报警、大屏展示等。Flink 的强大远不止于此——状态存储、CEP 模式匹配、SQL 动态分析等都能与 Kafka 无缝集成。希望这篇文章能成为你踏入实时流处理世界的扎实一步。动手试试你会爱上数据流过的每一毫秒。

相关文章:

实时数据处理实战:使用 Apache Flink 消费 Kafka 数据并进行窗口聚合

在大数据时代,实时处理流式数据已经成为企业级应用的标配。无论是用户行为分析、实时监控告警,还是金融风控系统,都离不开低延迟、高吞吐的流处理引擎。本文将带你从零开始,使用 Apache Flink 和 Kafka 构建一个完整的实时数据处理…...

告别模拟信号烦恼:手把手教你用51单片机驱动DAC0832输出正弦波(附Proteus仿真)

51单片机实战:用DAC0832打造完美正弦波发生器 在电子设计领域,能够精确生成模拟信号是一项基础却至关重要的技能。想象一下,当你亲手搭建的电路在示波器上显示出光滑的正弦波形时,那种成就感是无与伦比的。本文将带你从零开始&…...

Qwen3-TTS-VoiceDesign一文详解:speech_tokenizer作用机制与语音表征可视化

Qwen3-TTS-VoiceDesign一文详解:speech_tokenizer作用机制与语音表征可视化 1. 引言:从文字到声音的魔法转换 你有没有想过,为什么现在的AI语音合成听起来越来越像真人?为什么只需要用文字描述"温柔的成年女性声音"&a…...

Qwen3-ASR-1.7B问题解决:服务重启、音频格式兼容全攻略

Qwen3-ASR-1.7B问题解决:服务重启、音频格式兼容全攻略 1. 引言:语音识别服务的稳定性挑战 语音识别技术正在改变我们处理音频内容的方式,但在实际部署中,服务稳定性和格式兼容性常常成为绊脚石。Qwen3-ASR-1.7B作为阿里云通义千…...

Network Connection Class深度优化:10个提升网络检测精度的技巧

Network Connection Class深度优化:10个提升网络检测精度的技巧 【免费下载链接】network-connection-class Listen to current network traffic in the app and categorize the quality of the network. 项目地址: https://gitcode.com/gh_mirrors/ne/network-co…...

HiveSQL实战:巧用前后函数(lag/lead)解析用户行为序列

1. 窗口函数与用户行为分析的完美结合 做数据分析的朋友们应该都遇到过这样的场景:老板让你分析用户从浏览商品到最终下单的平均时间间隔,或者找出那些在关键页面停留时间过长的流失用户。这类问题本质上都是在分析用户行为序列,而HiveSQL中的…...

UniApp图片上传性能优化:从选图到上传的全流程提速方案

UniApp图片上传性能优化:从选图到上传的全流程提速方案 在移动应用开发中,图片上传功能几乎是社交、电商、内容创作类应用的标配功能。然而随着用户对体验要求的提高,简单的"选择-上传"模式已经难以满足性能敏感型场景的需求。特别…...

GUI智能体MAI-UI-8B API调用全攻略:从基础到进阶实战

GUI智能体MAI-UI-8B API调用全攻略:从基础到进阶实战 1. 认识MAI-UI-8B:你的GUI自动化助手 MAI-UI-8B是一款专为图形用户界面(GUI)操作设计的智能体,它能像人类一样"看"屏幕、"理解"界面元素并执行操作。想象一下&…...

dry容器管理实战:从创建、启动到停止删除的全流程操作

dry容器管理实战:从创建、启动到停止删除的全流程操作 【免费下载链接】dry moncho/dry: dry(Docker Run Commands)是一款命令行工具,旨在简化对Docker容器的操作管理,提供了一种简洁的方式创建、启动、停止和删除Dock…...

Photoshop AI绘画革命:3分钟学会Auto-Photoshop-StableDiffusion-Plugin终极指南

Photoshop AI绘画革命:3分钟学会Auto-Photoshop-StableDiffusion-Plugin终极指南 【免费下载链接】Auto-Photoshop-StableDiffusion-Plugin A user-friendly plug-in that makes it easy to generate stable diffusion images inside Photoshop using either Automa…...

VideoAgentTrek-ScreenFilter在CAD教学中的应用:自动筛选设计演示视频重点

VideoAgentTrek-ScreenFilter在CAD教学中的应用:自动筛选设计演示视频重点 每次上完CAD软件课,你是不是都有这样的感觉?老师演示了两个小时,鼠标点得飞快,步骤一个接一个。你录了屏,打算课后复习&#xff…...

Z-Image-GGUF实战:为Android应用集成AI头像生成功能

Z-Image-GGUF实战:为Android应用集成AI头像生成功能 最近在做一个社交类的Android应用,产品经理提了个需求,想加入一个“AI生成个性头像”的功能。用户上传一张自己的照片,选择喜欢的风格(比如动漫风、油画感、像素艺…...

OpenClaw配置备份指南:Qwen3-32B镜像环境迁移无忧方案

OpenClaw配置备份指南:Qwen3-32B镜像环境迁移无忧方案 1. 为什么需要备份OpenClaw环境 上周我的主力开发机RTX4090D突然显卡故障送修,导致所有OpenClaw自动化流程中断。最痛苦的不是硬件问题,而是重新配置Qwen3-32B镜像环境时,发…...

C# 工业级温度监控软件:支持多PLC通信与实时曲线绘制

前言工业自动化领域,温度监控是保障生产安全与产品质量的核心环节。面对多台设备分散、数据孤岛严重的现状,开发一套高效、可视化的上位机系统显得尤为重要。本文将详细介绍一款基于 WinForms 与 S7.Net 开发的温度监控系统。该系统不仅实现了对多台西门…...

深入解析FOC控制中的Clark/Park变换及其Matplotlib动态仿真实现

1. 从三相交流电到FOC控制的基础认知 第一次接触电机控制时,看到那些复杂的坐标变换公式确实让人头疼。但后来我发现,理解FOC(磁场定向控制)的核心,关键在于抓住两个关键点:为什么要做坐标变换和变换后能解…...

3个核心维度解析iOS数据取证:iLEAPP从入门到精通

3个核心维度解析iOS数据取证:iLEAPP从入门到精通 【免费下载链接】iLEAPP iOS Logs, Events, And Plist Parser 项目地址: https://gitcode.com/gh_mirrors/il/iLEAPP 一、核心价值:iOS数据解析的全能工具 iLEAPP(iOS Logs, Events, …...

终极内存故障排查方案:Memtest86+完整应用指南

终极内存故障排查方案:Memtest86完整应用指南 【免费下载链接】memtest86plus memtest86plus: 一个独立的内存测试工具,用于x86和x86-64架构的计算机,提供比BIOS内存测试更全面的检查。 项目地址: https://gitcode.com/gh_mirrors/me/memte…...

从演唱会踩踏到交通拥堵:我们如何用无人机双光人群计数,为城市装上‘智慧之眼’?

无人机双光人群计数:城市安全管理的智能升级之路 当夜幕降临,体育场外数万观众正陆续离场,安保指挥中心的大屏上闪烁着红黄相间的热力图——这不是科幻电影的场景,而是某省会城市在明星演唱会后的真实一幕。通过部署在关键节点的1…...

Bing Wallpaper自动化部署:GitHub Actions与持续集成

Bing Wallpaper自动化部署:GitHub Actions与持续集成 【免费下载链接】bing-wallpaper 项目地址: https://gitcode.com/gh_mirrors/bi/bing-wallpaper Bing Wallpaper项目是一个专注于收集和展示Bing每日壁纸的开源项目,通过自动化部署可以确保壁…...

3分钟看穿B站评论区:高效识别用户背景的精准秘诀

3分钟看穿B站评论区:高效识别用户背景的精准秘诀 【免费下载链接】bilibili-comment-checker B站评论区自动标注成分,支持动态和关注识别以及手动输入 UID 识别 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-comment-checker 在B站评论…...

LangChain实战:从零构建一个联网搜索增强的RAG问答系统

1. 为什么需要联网搜索增强的RAG系统 传统的RAG(检索增强生成)系统有个致命伤——它只能回答知识库里已有的内容。想象一下,你去年精心构建了一个旅游推荐系统,但今年新开的网红景点它完全不知道,因为数据没更新。这就…...

2026年程序员必看:AI Agent全面爆发,国产算力突围,这波技术红利别错过

🔥个人主页:北极的代码(欢迎来访) 🎬作者简介:java后端学习者 ❄️个人专栏:苍穹外卖日记,SSM框架深入,JavaWeb ✨命运的结局尽可永在,不屈的挑战却不可须臾或…...

嵌入式开发必备:rootfs.img镜像修改的5个常见问题与解决方案

嵌入式开发实战:rootfs.img镜像修改的五大核心问题与深度解决方案 在嵌入式Linux开发中,rootfs.img镜像的修改是每个开发者绕不开的关键环节。无论是添加自定义配置文件、更新系统组件,还是优化启动流程,对根文件系统的调整都直接…...

FastAPI API版本控制:URI前缀的终极实现指南

FastAPI API版本控制:URI前缀的终极实现指南 【免费下载链接】fastapi FastAPI framework, high performance, easy to learn, fast to code, ready for production 项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi FastAPI是一个高性能、易于学习…...

从投稿到接收:我的IEEE SPL完整时间线复盘与经验总结

从投稿到接收:我的IEEE SPL完整时间线复盘与经验总结 去年夏天,当我收到IEEE Signal Processing Letters(SPL)的录用邮件时,实验室的咖啡机正发出熟悉的咕噜声。那一刻,我意识到这杯咖啡比往常更香——不是…...

提升输入效率:Qwerty Learner开源键盘训练工具的肌肉记忆训练方案

提升输入效率:Qwerty Learner开源键盘训练工具的肌肉记忆训练方案 【免费下载链接】qwerty-learner 项目地址: https://gitcode.com/GitHub_Trending/qw/qwerty-learner Qwerty Learner是一款开源键盘训练工具,通过将单词记忆与英语肌肉记忆训练…...

ArtiPub AI与Docker集成:构建可扩展的容器化发布系统

ArtiPub AI与Docker集成:构建可扩展的容器化发布系统 【免费下载链接】artipub Article publishing platform that automatically distributes your articles to various media channels 项目地址: https://gitcode.com/gh_mirrors/ar/artipub 在当今快速发展…...

# WebNFC:让网页也能“碰一碰”实现设备交互的新可能随着移动互联网的快速发展,**近场通信(NFC)技术**逐渐从支付场景走

3 webNFC:让网页也能“碰一碰”实现设备交互的新可能 随着移动互联网的快速发展,近场通信(NFC)技术逐渐从支付场景走向更广泛的应用领域。而在浏览器端,**WebNFC ApI*8 的出现彻底改变了我们与 NFC 设备交互的方式——…...

从RGB-D到3D语义分割:用Scannet v2的25k帧子集快速上手你的第一个模型

从RGB-D到3D语义分割:Scannet v2实战指南 在计算机视觉领域,3D场景理解正成为研究热点。Scannet v2作为包含丰富标注的RGB-D数据集,为初学者和专业开发者提供了理想的实验平台。本文将带您快速上手这个强大的工具集,从数据获取到模…...

Sycamore与Leptos、Dioxus对比:如何选择最适合的Rust前端框架

Sycamore与Leptos、Dioxus对比:如何选择最适合的Rust前端框架 【免费下载链接】sycamore A library for creating reactive web apps in Rust and WebAssembly 项目地址: https://gitcode.com/gh_mirrors/sy/sycamore 在Rust前端开发领域,Sycamor…...