Flink CDC 3.x实战:构建MySQL到Doris的实时数据同步管道
在数据驱动的业务场景中如何高效、低延迟地将数据库的变更数据同步到数据湖或数据仓库一直是数据架构师和开发工程师面临的挑战。传统基于查询的批处理方式延迟高、资源消耗大而自研CDCChange Data Capture组件又面临技术复杂度和稳定性的双重压力。本文将深入探讨如何利用Flink CDC 3.x这一利器构建一套从数据库变更捕获到实时湖仓集成的完整解决方案。无论你是希望了解CDC基础概念的数据开发新手还是正在寻求生产级实时同步方案的资深工程师都能从本文获得从原理到实战、从配置到优化的系统性指导。1. 背景与核心概念为什么需要 Flink CDC在深入技术细节之前我们首先要厘清几个核心概念及其解决的问题这有助于理解 Flink CDC 在整个数据架构中的定位和价值。1.1 什么是 CDCCDC即变更数据捕获是一种用于识别和捕获数据库中数据变更增、删、改的技术。其核心目标是实时或准实时地将这些变更事件从源数据库传递到下游系统如缓存、搜索引擎、数据湖仓或另一个数据库。传统数据同步方式的痛点全量定时抽取通过SELECT *定期拉取全表数据资源消耗巨大且无法感知中间发生的变更数据新鲜度低。基于时间戳或增量字段依赖update_time等字段无法捕获删除操作且对无此字段或字段未更新的数据无效。触发器Trigger在数据库表上创建触发器对数据库性能影响大增加运维复杂度。CDC 技术通过读取数据库的日志如 MySQL 的 Binlog、PostgreSQL 的 WAL来获取变更实现了低侵入、高性能、全增量一体化的数据捕获。1.2 Flink CDC 是什么Apache Flink 是一个强大的流处理框架。Flink CDC 是基于 Flink 构建的 CDC 连接器套件。它并非一个独立产品而是一系列Source Connector的集合允许 Flink 作业直接作为消费者从数据库的变更日志中读取数据并将其转化为 Flink 内部的DataStream或Table从而无缝接入 Flink 强大的流计算生态。Flink CDC 的核心优势全增量一体化读取无需区分全量和增量流程一个作业即可完成历史快照和后续变更的连续读取。Exactly-Once 语义结合 Flink 的检查点机制可以确保数据在端到端传输中不丢不重。丰富的生态集成捕获的数据可以直接用于实时计算如聚合、关联并写入到 Kafka、Hudi、Iceberg、Doris 等数十种目标轻松构建实时数仓或湖仓一体架构。无锁读取大多数连接器支持并行读取和无锁快照对源数据库影响极小。1.3 实时湖仓一体简介实时湖仓一体是当前数据架构演进的重要方向。它旨在融合数据湖的灵活性存储原始格式数据、支持多种计算引擎与数据仓库的高性能分析能力。数据湖如 HDFS、S3 存储 Parquet/ORC 文件搭配 Hudi/Iceberg 表格式。数据仓库如 Doris、StarRocks、ClickHouse提供亚秒级查询响应。Flink CDC 在其中扮演了“实时数据管道”的关键角色负责将业务数据库的变更实时、准确地注入到湖仓存储层为后续的实时分析、数据科学和报表应用提供鲜活的血液。2. 环境准备与版本说明在开始实战前请确保你的开发环境满足以下要求。本文示例将使用最典型的组合进行演示。基础环境操作系统Linux / macOS / Windows (WSL2 推荐)JavaJDK 8 或 11推荐 JDK 11与 Flink 兼容性更好构建工具Maven 3.6 或 Gradle 6.x核心组件及版本本文以 Flink CDC 3.0 版本为例它带来了更稳定的 API 和性能提升。请根据你的实际情况调整依赖版本。组件版本说明Flink1.18.xFlink CDC 3.x 设计兼容 Flink 1.16推荐较新的 1.18。Flink CDC3.0.0核心连接器库。MySQL5.7 / 8.0源数据库示例。需开启 Binlog。Flink SQL Client1.18.x用于执行 SQL 方式演示。Kafka3.x可选作为变更日志的中转站。Doris2.0.x可选作为实时数仓的目的地示例。项目结构预览我们将创建一个标准的 Maven 项目。flink-cdc-demo/ ├── pom.xml ├── src/ │ └── main/ │ ├── java/ │ │ └── com/ │ │ └── demo/ │ │ ├── MySQLCDCExample.java # DataStream API 示例 │ │ └── MySQLCDCSQLExample.java # Table API / SQL 示例 │ └── resources/ │ └── application.yaml # Flink 配置可选 └── README.md3. Flink CDC 3.x 核心原理与配置拆解理解 Flink CDC 的工作原理是正确使用和排错的基础。本节以 MySQL CDC 连接器为例进行拆解。3.1 工作原理全量快照 增量日志Flink CDC MySQL 连接器的工作流程分为两个阶段全量快照阶段作业启动时首先对源表执行一次一致性快照类似于SELECT *但通过分片、无锁如果支持等技术减少对源库压力。此阶段读取的数据被作为“插入”变更事件发出。增量读取阶段全量完成后连接器立即从快照结束时对应的 Binlog 位置开始持续读取并解析后续的 Binlog 事件INSERT, UPDATE, DELETE并转换为相应的变更事件流。这个过程对用户是透明的你得到的就是一个包含历史数据和实时变更的完整流。3.2 核心配置参数解析在 Flink SQL 中使用CREATE TABLE语句定义 CDC 源表时有许多关键参数。以下是必须和常用的配置-- 使用 Flink SQL 定义 MySQL CDC 源表 CREATE TABLE mysql_source_table ( id INT NOT NULL, name STRING, email STRING, update_time TIMESTAMP(3), PRIMARY KEY (id) NOT ENFORCED -- 必须声明主键 ) WITH ( connector mysql-cdc, -- 必需参数连接信息 hostname localhost, port 3306, username flinkuser, password flinkpw, database-name your_database, table-name your_table, -- 重要可选参数快照与增量 scan.startup.mode initial, -- 启动模式initial默认先快照后增量, earliest-offset, latest-offset等 server-id 5400-5404, -- 指定一个范围用于在集群中唯一标识此连接器从库ID server-time-zone Asia/Shanghai, -- 处理时间戳时区 debezium.snapshot.mode initial, -- 底层Debezium快照模式 debezium.max.batch.size 1024, -- 每次轮询的最大记录数 heartbeat.interval 30s -- 发送心跳事件间隔用于推动无数据更新的Watermark );关键参数详解scan.startup.mode决定了作业启动时的行为。initial是最常用模式即先做全量快照。如果只想处理启动后的新数据可设为latest-offset。server-id在 MySQL 主从复制中每个从库需要一个唯一的 ID。Flink CDC 连接器在内部模拟为一个 MySQL 从库因此必须指定一个在当前 MySQL 集群中唯一的 ID 或 ID 范围用于并行读取。debezium.*前缀参数Flink CDC 底层使用了 Debezium 引擎这些参数可以精细控制 Debezium 的行为。heartbeat.interval对于更新不频繁的表Binlog 可能长时间不更新导致 Flink 的 Watermark事件时间进展停滞。心跳事件可以定期推动 Watermark 前进避免窗口等计算无法触发。3.3 数据变更事件格式Flink CDC 连接器输出的每条数据都包含变更的元数据。在Table API中可以通过METADATA列或OP字段来获取。CREATE TABLE mysql_source_with_meta ( id INT, name STRING, update_time TIMESTAMP(3), op STRING METADATA FROM op VIRTUAL, -- 获取操作类型c(insert), u(update), d(delete), r(快照读取) ts_ms BIGINT METADATA FROM source.timestamp.ms VIRTUAL -- 获取变更在源库发生的时间戳 ) WITH ( connector mysql-cdc, -- ... 其他连接参数同上 );查询这个表你不仅能看到数据内容还能看到代表操作类型的op字段这对于下游进行不同逻辑处理如删除对应Hudi表的记录至关重要。4. 完整实战案例从 MySQL 到 Apache Doris现在我们构建一个完整的端到端示例实时同步 MySQL 的用户表变更到 Apache Doris 数仓中并在 Flink 中进行简单的数据清洗。4.1 环境准备与数据初始化1. 准备 MySQL 源表-- 在 MySQL 中执行 CREATE DATABASE demo_db; USE demo_db; CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL, email VARCHAR(100), status TINYINT DEFAULT 1 COMMENT 1-有效0-无效, last_login TIMESTAMP NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); -- 确保 Binlog 已开启 (ROW模式) 并具有足够权限 -- 检查: SHOW VARIABLES LIKE log_bin; -- 创建 Flink CDC 用户 CREATE USER flinkcdc% IDENTIFIED BY FlinkCDC123!; GRANT SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO flinkcdc%; FLUSH PRIVILEGES; -- 插入初始数据 INSERT INTO users (username, email, status) VALUES (alice, aliceexample.com, 1), (bob, bobexample.com, 1);2. 准备 Apache Doris 目标表在 Doris 中创建一个结构相似的表。-- 在 Doris 中执行 CREATE DATABASE demo_dw; USE demo_dw; CREATE TABLE users_sink ( id INT NOT NULL, username VARCHAR(50) NOT NULL, email VARCHAR(100), status TINYINT COMMENT 1-有效0-无效, last_login DATETIME, created_at DATETIME, updated_at DATETIME, doris_update_time DATETIME DEFAULT CURRENT_TIMESTAMP ) DUPLICATE KEY(id) -- 指定重复键模型适合CDC Upsert DISTRIBUTED BY HASH(id) BUCKETS 10 PROPERTIES ( replication_num 1 );4.2 编写 Flink SQL 作业我们将使用 Flink SQL Client 或编写 SQL 文件来提交作业。这里展示核心的 SQL 逻辑。创建源表MySQL CDC-- file: mysql_cdc_source.sql CREATE TABLE mysql_users_source ( id INT, username STRING, email STRING, status INT, last_login TIMESTAMP(3), created_at TIMESTAMP(3), updated_at TIMESTAMP(3), op STRING METADATA FROM op VIRTUAL, ts_ms BIGINT METADATA FROM source.timestamp.ms VIRTUAL, PRIMARY KEY (id) NOT ENFORCED ) WITH ( connector mysql-cdc, hostname your-mysql-host, port 3306, username flinkcdc, password FlinkCDC123!, database-name demo_db, table-name users, server-time-zone Asia/Shanghai, scan.startup.mode initial );创建目标表Doris-- file: doris_sink.sql CREATE TABLE doris_users_sink ( id INT, username STRING, email STRING, status INT, last_login TIMESTAMP(3), created_at TIMESTAMP(3), updated_at TIMESTAMP(3), doris_update_time TIMESTAMP(3) ) WITH ( connector doris, fenodes your-doris-fe:8030, table.identifier demo_dw.users_sink, username root, password , sink.properties.format json, sink.properties.read_json_by_line true, sink.buffer-flush.max-rows 1000, sink.buffer-flush.interval 10s );编写数据处理与插入逻辑在这个例子中我们过滤掉状态为0无效的用户并将数据写入 Doris。-- file: cdc_pipeline.sql -- 设置检查点确保Exactly-Once语义 SET execution.checkpointing.interval 30s; -- 将源表数据插入到目标表并进行简单过滤 INSERT INTO doris_users_sink SELECT id, username, email, status, last_login, created_at, updated_at, -- 可以使用Flink内置函数处理时间这里用源事件时间 -- 如果是删除操作(opd)可以通过后续的“动态表”概念或使用临时表处理这里简单过滤 CAST(FROM_UNIXTIME(ts_ms / 1000) AS TIMESTAMP(3)) AS doris_update_time FROM mysql_users_source WHERE status 1; -- 仅同步有效用户注意上述简单的INSERT INTO对于 Doris 的 Duplicate Key 模型如果遇到相同id的更新会插入一条新记录而非更新。为了实现 Upsert更新或插入需要使用 Flink CDC 的Changelog特性并配置 Doris Connector 的sink.ignore-update等参数或使用MERGE INTO语句如果 Doris 版本支持。更完整的 Upsert 示例涉及定义changelog-cdc源和配置sink.parallelism因篇幅所限此处指出此关键点。4.3 使用 DataStream API 实现对于更复杂的处理逻辑如多流关联、自定义状态计算可能需要使用 DataStream API。Flink CDC 3.x 提供了更简洁的 API。// 文件src/main/java/com/demo/MySQLCDCDataStreamExample.java import org.apache.flink.api.common.eventtime.WatermarkStrategy; import org.apache.flink.streaming.api.datastream.DataStreamSource; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import com.ververica.cdc.debezium.JsonDebeziumDeserializationSchema; import com.ververica.cdc.connectors.mysql.source.MySqlSource; import com.ververica.cdc.connectors.mysql.table.StartupOptions; public class MySQLCDCDataStreamExample { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env StreamExecutionEnvironment.getExecutionEnvironment(); env.enableCheckpointing(30000); // 开启检查点 // 1. 构建 MySQL CDC Source MySqlSourceString mySqlSource MySqlSource.Stringbuilder() .hostname(your-mysql-host) .port(3306) .databaseList(demo_db) .tableList(demo_db.users) .username(flinkcdc) .password(FlinkCDC123!) .startupOptions(StartupOptions.initial()) // 初始模式 .deserializer(new JsonDebeziumDeserializationSchema()) // 将变更事件反序列化为JSON字符串 .serverTimeZone(Asia/Shanghai) .build(); // 2. 创建数据源 DataStreamSourceString sourceStream env.fromSource( mySqlSource, WatermarkStrategy.noWatermarks(), // CDC源通常使用处理时间或从ts_ms提取事件时间 MySQL CDC Source ); // 3. 处理数据这里简单打印实际可进行解析、过滤、转换等操作 sourceStream.print().setParallelism(1); // 4. 执行作业 env.execute(Flink CDC MySQL to Print); } }此示例将变更事件以 JSON 格式打印出来。你需要添加flink-connector-mysql-cdc和flink-json等相关依赖到pom.xml。4.4 运行与验证打包与提交将 SQL 文件或 Java 项目打包成 JAR。启动 Flink 集群可以使用本地 standalone 集群或 YARN/K8s 集群。# 进入 Flink 安装目录 ./bin/start-cluster.sh提交作业# 使用 SQL Client 提交 ./bin/sql-client.sh -f /path/to/cdc_pipeline.sql # 或提交 JAR 包 ./bin/flink run -c com.demo.MySQLCDCDataStreamExample /path/to/your-job.jar验证数据流在 Flink Web UI (http://localhost:8081) 查看作业运行状态和指标。在 MySQL 中执行INSERT,UPDATE,DELETE操作。-- 在 MySQL 中更新数据 UPDATE demo_db.users SET email alice.newexample.com WHERE username alice; INSERT INTO demo_db.users (username, email) VALUES (charlie, charlieexample.com); DELETE FROM demo_db.users WHERE username bob;观察 Flink 作业日志或查询 Doris 目标表确认变更已实时同步。-- 在 Doris 中查询 SELECT * FROM demo_dw.users_sink ORDER BY updated_at DESC;5. 常见问题与排查思路在实际使用 Flink CDC 时你可能会遇到以下典型问题。问题现象可能原因排查思路与解决方案作业启动失败报错Access denied或The connector is trying to read binlog...MySQL 用户权限不足。确保授予了SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT权限。检查用户名、密码、主机白名单。全量同步阶段卡住或无进度表数据量巨大或源数据库性能压力大网络问题server-id冲突。1. 检查源库 CPU/IO。2. 尝试调整scan.incremental.snapshot.chunk.size分片大小和scan.snapshot.fetch.size。3. 确保server-id在 MySQL 集群中唯一。4. 查看 Flink TaskManager 日志。增量阶段延迟高下游 Sink如 Doris/Kafka写入慢Flink 作业反压网络延迟。1. 检查 Flink Web UI 的 BackPressure 监控。2. 检查下游系统状态和负载。3. 调整 Sink 的批量参数如sink.buffer-flush.*。4. 增加作业并行度。捕获不到 DELETE 操作目标表或 Sink Connector 不支持或未正确处理opd的消息。1. 确认 CDC 源表定义了主键。2. 检查 Sink 连接器是否支持DELETE消息如 Upsert 模式的 JDBC、Hudi MOR 表。3. 在 DataStream API 中打印op字段确认是否收到d事件。出现重复数据作业重启后从旧的 checkpoint 恢复导致部分数据重复读取。1. 确保 Source 和 Sink 都支持并正确配置了精确一次语义。2. 检查 Kafka 等中间件的事务设置。3. 对于幂等写入的系统如 Doris PK 表重复数据可能被覆盖问题不显性。时间戳字段时区不对数据库服务器时区、Flink 作业时区、连接器时区设置不一致。1. 在WITH参数中统一设置server-time-zone如Asia/Shanghai。2. 在 Flink 作业入口设置时区env.setStreamTimeCharacteristic(...)或 SQL 中设置table.local-time-zone。Heartbeat相关错误心跳事件配置问题或网络中断。1. 适当调整heartbeat.interval。2. 检查网络连通性。3. 确保 MySQLwait_timeout参数足够大避免连接被服务器断开。6. 最佳实践与工程建议将 Flink CDC 用于生产环境需要考虑更多工程化细节。6.1 性能优化配置并行读取对于大表利用scan.incremental.snapshot.chunk.size和scan.incremental.snapshot.chunk.key-column进行分片并设置合适的并行度可以显著加快全量阶段速度。资源调优根据数据量和 QPS 调整 TaskManager 的内存、CPU 核数。CDC Source 通常不是计算密集型但需要足够的网络和反序列化资源。Checkpoint 优化设置合理的检查点间隔如 30s-1min和超时时间。对于状态很大的作业考虑启用增量检查点。Sink 批处理对于 Doris、JDBC 等 Sink合理设置sink.buffer-flush.max-rows和sink.buffer-flush.interval在延迟和吞吐之间取得平衡。6.2 高可用与监控使用 Flink HA配置 ZooKeeper 或 Kubernetes 以实现 JobManager 的高可用避免单点故障。监控告警通过 Flink Metrics 系统监控currentFetchEventTimeLag当前消费延迟、numRecordsInPerSecond输入速率等关键指标并集成到 Prometheus Grafana。日志与追踪确保 Flink 和 Connector 的日志级别设置合理便于排查问题。对于复杂链路考虑集成 OpenTelemetry 进行分布式追踪。6.3 数据质量与一致性保障Schema 变更处理MySQL 表结构变更如加字段是常见需求。Flink CDC 默认会捕获 DDL 变更并传递到下游但下游 Sink 可能不支持自动适配。需要有相应的 Schema Evolution 处理策略如使用支持 Schema Registry 的 Kafka或手动在目标端执行 DDL。Exactly-Once 端到端确保整个链路Source - 计算 - Sink支持精确一次语义。这要求 Source 可重放CDC 支持、Sink 支持幂等写入或两阶段提交。数据稽核建立定期的数据一致性校验机制对比源库和目标端的记录数和关键字段的 checksum及时发现同步延迟或丢失问题。6.4 实时湖仓集成进阶写入 Apache Hudi / Iceberg使用 Flink 对应的 Connector将 CDC 数据直接写入数据湖表格式。这需要处理UPSERT和DELETE。Hudi 的MORMerge On Read表或 Iceberg 的V2格式对此有良好支持。-- 示例写入 Hudi MOR 表 INSERT INTO hudi_users_table /* OPTIONS(...) */ SELECT id, username, ... , op FROM mysql_users_source;多源汇聚与关联可以在 Flink 中将多个不同数据库的 CDC 流进行关联如订单流关联用户流形成宽表后再写入湖仓减轻下游查询压力。流批一体处理利用 Flink 的流批一体能力同一套 CDC 数据既可用于实时 Dashboard也可用于离线 T1 的批处理任务实现真正的湖仓一体。7. 总结与学习路线通过本文我们系统性地走完了使用 Flink CDC 3.x 构建实时数据管道的全流程从CDC 核心概念的理解到环境与版本的准备工作从连接器原理与配置的深度拆解到从 MySQL 到 Doris 的完整实战最后涵盖了生产环境中常见问题的排查思路以及性能、高可用、数据质量方面的最佳实践。掌握 Flink CDC 是构建现代实时数据栈的关键一步。为了进一步深入建议你按照以下路线进行学习与实践基础巩固反复练习本文的示例确保能在自己的环境中成功运行。尝试修改配置参数观察作业行为的变化。多连接器探索除了 MySQL尝试对接 PostgreSQL、Oracle、MongoDB 等 CDC 连接器了解其配置差异。深入目标端集成重点研究将 CDC 数据写入到 Kafka作为消息总线、Hudi/Iceberg数据湖、ClickHouse/DorisOLAP 数仓的具体配置和优化点。复杂流处理在 CDC 数据流上实践窗口聚合、双流 Join、状态管理等更复杂的 Flink SQL 或 DataStream API 编程。生产运维学习在 YARN 或 Kubernetes 上部署和管理 Flink CDC 作业配置监控告警体系设计容灾和数据回溯方案。Flink CDC 将数据库变更捕获这一复杂任务标准化、产品化极大地降低了实时数据集成门槛。结合 Flink 强大的计算能力和丰富的生态连接器它已成为构建实时湖仓一体架构不可或缺的桥梁。希望本文能成为你探索实时数据世界的得力助手在实际项目中大胆应用并持续迭代优化。

相关新闻

服务器存储管理利器:StorCLI命令行工具从入门到实战

服务器存储管理利器:StorCLI命令行工具从入门到实战

1. 从命令行到存储阵列的“手术刀”:为什么你需要了解storcli如果你管理过服务器,尤其是那些搭载了LSI(现为Broadcom旗下)或Avago RAID控制卡的机器,那么你一定对“黑盒子”式的存储管理感到过头疼。图形界面的管理工具…

2026/8/23 8:01:58 阅读更多 →
乘数比较大时溢出处理(二)

乘数比较大时溢出处理(二)

目录 1、数学原理拆解 2、映射到你 ISP 直方图场景 ✅最关键溢出安全点 3、分步数值实例演算 使用拆分公式分步算 4、纯 32‑bit 无 64 位依赖 C 标准实现 5、边界极限测试(total 取最大 32bit 值) 6、算法适用边界 & 注意事项(I…

2026/8/23 8:01:58 阅读更多 →
C++模板分离编译问题解析:从链接错误到模板特化实战

C++模板分离编译问题解析:从链接错误到模板特化实战

1. 从一次编译报错说起:为什么我的模板函数链接失败了? 最近在重构一个C项目时,我又一次掉进了那个熟悉的“坑”里。场景是这样的:我有一个通用的日志工具类,里面用到了函数模板来处理不同类型的日志格式化。为了代码结…

2026/8/23 8:01:58 阅读更多 →

最新新闻

Conda Base环境重置与修复:从依赖冲突到环境重建的完整指南

Conda Base环境重置与修复:从依赖冲突到环境重建的完整指南

1. 当你的Conda“地基”开始晃动:为什么需要重置Base环境?搞Python开发或者数据科学的朋友,对Anaconda或者Miniconda肯定不陌生。我们通常把安装后自带的那个环境叫做base环境,它就像是整个Conda生态系统的“地基”和“大本营”。…

2026/8/23 8:45:36 阅读更多 →
LeRobot开源机器人平台:VLA与强化学习结合的实践指南

LeRobot开源机器人平台:VLA与强化学习结合的实践指南

这次我们来看一个面向机器人开发的开源项目——LeRobot。如果你正在寻找一个能快速上手、支持视觉语言模型(VLA)与强化学习(RL)结合、并且提供完整硬件BOM清单的机械臂开发平台,那么这个项目值得你重点关注。它不是一个…

2026/8/23 8:45:36 阅读更多 →
油箱见底才加油,伤的真的只是油泵吗?

油箱见底才加油,伤的真的只是油泵吗?

一句话结论:油表灯亮才加油,伤的不只是油泵:长期保持这个习惯,等于悄悄给发动机燃油系统的“积脏”推开了门。一、这事儿,有人真当本事“油表灯亮了还敢再跑20公里”—— 这话搁车友群里,多半有人接&#x…

2026/8/23 8:45:36 阅读更多 →
能源系统优化建模:从混合水电储能规划看随机规划与成本平衡

能源系统优化建模:从混合水电储能规划看随机规划与成本平衡

1. 项目概述:从一道赛题看能源系统的复杂博弈去年带学生备赛时,我们花了大量时间研究2022年美国大学生数学建模竞赛(MCM/ICM)的B题。这道题目的官方名称是“Water, Water, Everywhere”,直译过来是“水啊水&#xff0c…

2026/8/23 8:45:36 阅读更多 →
Vue 组件化进阶:计算属性、生命周期、组件通信与动态组件

Vue 组件化进阶:计算属性、生命周期、组件通信与动态组件

一、内容回顾 前面学习了 Vue 的响应式数据、模板指令、列表和表单,以及用 axios 请求接口。本篇进一步学习 Node.js 运行环境、计算属性、监听属性、生命周期、组件和组件通信。 二、Node.js 与前端工程 JavaScript 最初主要运行在浏览器中,浏览器还提供…

2026/8/23 8:45:36 阅读更多 →
使用ueditor-plus解决ueditor中JSP的SSRF漏洞的实现方案

使用ueditor-plus解决ueditor中JSP的SSRF漏洞的实现方案

一、背景 项目中使用ueditor进行文章的富文本编辑,因ueditor使用过程中存在SSRF漏洞,考虑到开源项目ueditor-plus是在ueditor的基础上进行了二次开发,保留了ueditor的使用方式不变,同时ueditor-plus在不断更新维护,特选用ueditor-plus来平替ueditor,并解决ueditor中jsp的…

2026/8/23 8:44:35 阅读更多 →

日新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:00:50 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/23 0:00:50 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/23 0:00:50 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:00:50 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/23 0:00:50 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/23 0:00:50 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/22 18:08:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/22 7:31:03 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →