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

基于 Flink CDC YAML 的 MySQL 到 Kafka 流式数据集成

本教程的演示都将在 Flink CDC CLI 中进行,无需一行 Java/Scala 代码,也无需安装 IDE。

 

这篇教程将展示如何基于 Flink CDC YAML 快速构建 MySQL 到 Kafka 的 Streaming ELT 作业,包含整库同步、表结构变更同步演示和关键参数介绍。

准备阶段

准备 Flink Standalone 集群

  1. 1. 下载 Flink 1.19.2[1]压缩包,解压后并跳转至 Flink 目录下,设置 FLINK_HOME 为 flink-1.19.2 所在目录。

tar -zxvf  flink-1.19.2-bin-scala_2.12.tgz
export FLINK_HOME=$(pwd)/flink-1.19.2
  1. 2. 在 conf/config.yaml 文件追加下列参数开启 checkpoint,每隔 3 秒做一次 checkpoint。

execution:checkpointing:interval: 3000
  1. 3. 使用下面的命令启动 Flink 集群。

./bin/start-cluster.sh

启动成功后可以在 http://localhost:8081/访问到 Flink Web UI,如下图所示:

图片

重复执行 start-cluster.sh 可以拉起多个 TaskManager

注意:如果是在云服务器上运行,需要将 conf/config.yaml 里面 rest.bind-address 和 rest.address 的 localhost 改成0.0.0.0,然后使用 公网IP:8081 即可访问。

准备 Docker 环境

使用下面的内容新建一个 docker-compose.yml 文件:

services:Zookeeper:image: zookeeper:3.7.1ports:- "2181:2181"environment:- ALLOW_ANONYMOUS_LOGIN=yesKafka:image: bitnami/kafka:2.8.1ports:- "9092:9092"- "9093:9093"environment:- ALLOW_PLAINTEXT_LISTENER=yes- KAFKA_LISTENERS=PLAINTEXT://:9092- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.67.2:9092- KAFKA_ZOOKEEPER_CONNECT=192.168.67.2:2181MySQL:image: debezium/example-mysql:1.1ports:- "3306:3306"environment:- MYSQL_ROOT_PASSWORD=123456- MYSQL_USER=mysqluser- MYSQL_PASSWORD=mysqlpw

注意:文件里面的 192.168.67.2 为内网 IP,可通过 ifconfig 查找。

该 Docker Compose 中包含的组件有:
● MySQL: 包含商品信息的数据库app_db
● Kafka: 存储从 MySQL 中根据规则映射过来的结果表
● Zookeeper:主要用于进行Kafka集群管理和协调
在 docker-compose.yml 所在目录下执行下面的命令来启动上述组件:

docker-compose up -d

该命令以 detached 模式启动 Docker Compose 配置中定义的所有组件。可以通过 docker ps 来观察上述的组件是否正常启动。

图片

在 MySQL 数据库中准备数据

通过执行如下命令可以进入 MySQL 容器:

docker-compose exec MySQL mysql -uroot -p123456

创建数据库 app_db和表 orders,products,shipments 并插入数据:

-- 创建数据库CREATE DATABASE app_db;USE app_db;-- 创建 orders 表CREATE TABLE `orders` (`id` INT NOT NULL,`price` DECIMAL(10,2) NOT NULL,PRIMARY KEY (`id`));-- 插入数据INSERT INTO `orders` (`id`, `price`) VALUES (1, 4.00);INSERT INTO `orders` (`id`, `price`) VALUES (2, 100.00);-- 创建 shipments 表CREATE TABLE `shipments` (`id` INT NOT NULL,`city` VARCHAR(255) NOT NULL,PRIMARY KEY (`id`));-- 插入数据INSERT INTO `shipments` (`id`, `city`) VALUES (1, 'beijing');INSERT INTO `shipments` (`id`, `city`) VALUES (2, 'xian');-- 创建 products 表CREATE TABLE `products` (`id` INT NOT NULL,`product` VARCHAR(255) NOT NULL,PRIMARY KEY (`id`));-- 插入数据INSERT INTO `products` (`id`, `product`) VALUES (1, 'Beer');INSERT INTO `products` (`id`, `product`) VALUES (2, 'Cap');INSERT INTO `products` (`id`, `product`) VALUES (3, 'Peanut');

通过 Flink CDC CLI 提交任务

  1. 1. 下载压缩包并解压得到目录 flink-cdc-3.3.0;
    flink-cdc-3.3.0-bin.tar.gz[2]中包含 bin、lib、log、conf 四个目录。

  2. 2. 下载下面列出的 connector 包,并且移动到 lib 目录下:
    ■ MySQL pipeline connector 3.3.0[3]
    ■ Kafka pipeline connector 3.3.0[4]

您还需要将下面的 Driver 包放在 Flink lib 目录下,或通过 --jar 参数将其传入 Flink CDC CLI,因为 CDC Connectors 不再打包这个依赖:
■ MySQL Connector Java[5]
3. 编写任务配置 yaml 文件
下面给出了一个整库同步的示例文件 mysql-to-kafka.yaml:

################################################################################
# Description: Sync MySQL all tables to Kafka
################################################################################
source:type: mysqlhostname: 0.0.0.0port: 3306username: rootpassword: 123456tables: app_db.\.*server-id: 5400-5404server-time-zone: UTCsink:type: kafkaname: Kafka Sinkproperties.bootstrap.servers: 0.0.0.0:9092topic: yaml-mysql-kafkapipeline:name: MySQL to Kafka Pipelineparallelism: 1

其中 source 中的 tables: app_db..* 通过正则匹配同步 app_db 下的所有表。
4. 最后,通过命令行提交任务到 Flink Standalone cluster

bash bin/flink-cdc.sh mysql-to-kafka.yaml
# 参考,一些自定义路径的示例  主要用于多版本flink,mysql驱动不一致等情况 如,
# bash /root/flink-cdc-3.3.0/bin/flink-cdc.sh /root/flink-cdc-3.3.0/bin/mysql-to-kafka.yaml --flink-home /root/flink-1.19. --jar /root/flink-cdc-3.3.0/lib/mysql-connector-java-8.0.27.jar

提交成功后,返回信息如:

Pipeline has been submitted to cluster.
Job ID: ba2afd0697524bd4857183936507b0bf
Job Description: MySQL to Kafka Pipeline

在 Flink Web UI,可以看到名为 MySQL to Kafka Pipeline 的任务正在运行。

通过 Kafka 客户端查看 Topic 数据,可得到debezium-json格式的内容:

docker-compose exec Kafka kafka-console-consumer.sh --bootstrap-server 192.168.31.229:9092 --topic yaml-mysql-kafka --from-beginning

debezium-json 格式包含了 before/after/op/source 几个元素,示例如下:

{"before": null,"after": {"id": 1,"price": 4},"op": "c","source": {"db": "app_db","table": "orders"}
}
...
{"before": null,"after": {"id": 1,"product": "Beer"},"op": "c","source": {"db": "app_db","table": "products"}
}
...
{"before": null,"after": {"id": 2,"city": "xian"},"op": "c","source": {"db": "app_db","table": "shipments"}
}

同步变更

进入 MySQL 容器:

docker-compose exec MySQL mysql -uroot -p123456

接下来,修改 MySQL 数据库中表的数据,StarRocks 中显示的订单数据也将实时更新:

  1. 1. 在 MySQL 的 orders 表中插入一条数据

INSERT INTO app_db.orders (id, price) VALUES (3, 100.00);
  1. 2. 在 MySQL 的 orders 表中增加一个字段

ALTER TABLE app_db.orders ADD amount varchar(100) NULL;
  1. 3. 在 MySQL 的 orders 表中更新一条数据

UPDATE app_db.orders SET price=100.00, amount=100.00 WHERE id=1;
  1. 4. 在 MySQL 的 orders 表中删除一条数据

DELETE FROM app_db.orders WHERE id=2;

通过 Kafka 消费者监控 Topic,可以看到 Kafka 上也在实时接收到这些变更:

{"before": {"id": 1,"price": 4,"amount": null},"after": {"id": 1,"price": 100,"amount": "100.00"},"op": "u","source": {"db": "app_db","table": "orders"}
}

同样地,去修改 shipments, products 表,也能在 Kafka对应的 Topic 中实时看到同步变更的结果。

特色功能

路由变更

Flink CDC 提供了将源表的表结构/数据路由到其他表名的配置,借助这种能力,我们能够实现表名库名替换,整库同步等功能。下面提供一个配置文件说明:

################################################################################
# Description: Sync MySQL all tables to Kafka
################################################################################
source:type: mysqlhostname: 0.0.0.0port: 3306username: rootpassword: 123456tables: app_db.\.*server-id: 5400-5404server-time-zone: UTCsink:type: kafkaname: Kafka Sinkproperties.bootstrap.servers: 0.0.0.0:9092
pipeline:name: MySQL to Kafka Pipelineparallelism: 1
route:- source-table: app_db.orderssink-table: kafka_ods_orders- source-table: app_db.shipmentssink-table: kafka_ods_shipments- source-table: app_db.productssink-table: kafka_ods_products

通过上面的 route 配置,会将 app_db.orders 表的结构和数据同步到 kafka_ods_orders 中。从而实现数据库迁移的功能。特别地,source-table 支持正则表达式匹配多表,从而实现分库分表同步的功能,例如下面的配置:

route:- source-table: app_db.order\.*sink-table: kafka_ods_orders

这样,就可以将诸如 app_db.order01、app_db.order02、app_db.order03 的表汇总到 kafka_ods_orders 中。利用 Kafka 自带的工具,可查看对应 Topic 的建立,详情可使用 kafka-console-consumer.sh 进行查询。

docker-compose exec Kafka kafka-topics.sh --bootstrap-server 192.168.67.2:9092 --list

Kafka 中新建的 Topic 信息如下:

__consumer_offsets
kafka_ods_orders
kafka_ods_products
kafka_ods_shipments
yaml-mysql-kafka

选取 kafka_ods_orders 这个 Topic 进行查询,返回数据示例如下:

{"before": null,"after": {"id": 1,"price": 100,"amount": "100.00"},"op": "c","source": {"db": null,"table": "kafka_ods_orders"}
}

写入多个分区

使用 partition.strategy 参数可以定义发送数据到 Kafka 分区的策略, 可以设置的选项有:
● all-to-zero(将所有数据发送到 0 号分区),默认值
● hash-by-key(所有数据根据主键的哈希值分发)
我们基于 mysql-to-kafka.yaml 在sink下增加一行配置: partition.strategy: hash-by-key

source:...
sink:...topic: yaml-mysql-kafka-hash-by-keypartition.strategy: hash-by-key
pipeline:...

同时我们利用 Kafka 的脚本新建一个 12 分区的 Kafka Topic:

docker-compose exec Kafka kafka-topics.sh --create --topic yaml-mysql-kafka-hash-by-key --bootstrap-server 192.168.67.2:9092  --partitions 12

提交 YAML 作业后,查看一下各个分区里面所存储的数据。

docker-compose exec Kafka kafka-console-consumer.sh --bootstrap-server=192.168.67.2:9092  --topic yaml-mysql-kafka-hash-by-key  --partition 0  --from-beginning

部分分区数据详情如下:

  • • 分区0

{"before": null,"after": {"id": 1,"price": 100,"amount": "100.00"},"op": "c","source": {"db": "app_db","table": "orders"}
}
  • • 分区4

{"before": null,"after": {"id": 2,"product": "Cap"},"op": "c","source": {"db": "app_db","table": "products"}
}
{"before": null,"after": {"id": 1,"city": "beijing"},"op": "c","source": {"db": "app_db","table": "shipments"}
}

输出格式

value.format 参数用于序列化 Kafka 消息的值部分数据的格式。可选的填写值包括 debezium-json和 canal-json,默认值为 debezium-json,目前还不支持用户自定义输出格式。
debezium-json  [6]格式会包含 before(变更前的数据)/after(变更后的数据)/op(变更类型)/source(元数据) 几个元素,ts_ms 字段并不会默认包含在输出结构中(需要在 Source 中指定 metadata.list 配合)。canal-json  [7]格式会包含 old/data/type/database/table/pkNames 几个元素,但是 ts 并不会默认包含在其中(原因同上)。
可以在 YAML 文件的 sink 中定义 value.format: canal-json 来指定输出格式为 canal-json 类型:

source:...sink:...topic: yaml-mysql-kafka-canalvalue.format: canal-json
pipeline:...
查询对应 topic 的数据,返回示例如下:
{"old": null,"data": [{"id": 1,"price": 100,"amount": "100.00"}],"type": "INSERT","database": "app_db","table": "orders","pkNames": ["id"]
}

自定义上下游映射关系

使用 sink.tableId-to-topic.mapping 参数可以指定上游表名到下游 Kafka Topic 名的映射关系。无需使用 route 配置。与之前介绍的通过 route 实现的不同点在于,配置该参数可以在保留源表的表名信息的情况下设置写入的 Topic 名称。
在前面的 YAML 文件中增加 sink.tableId-to-topic.mapping 配置指定映射关系,每个映射关系由 ; 分割,上游表的 TableId 和下游 Kafka 的 Topic 名由 : 分割:

source:...sink:...sink.tableId-to-topic.mapping: app_db.orders:yaml-mysql-kafka-orders;app_db.shipments:yaml-mysql-kafka-shipments;app_db.products:yaml-mysql-kafka-products
pipeline:...

运行后,Kafka 中将会生成如下的 Topic:

...
yaml-mysql-kafka-orders
yaml-mysql-kafka-products
yaml-mysql-kafka-shipments

上述 3 个 Topic 中的部分数据详情:

{"before": null,"after": {"id": 1,"price": 100,"amount": "100.00"},"op": "c","source": {"db": "app_db","table": "orders"}
}
{"before": null,"after": {"id": 2,"product": "Cap"},"op": "c","source": {"db": "app_db","table": "products"}
}
{"before": null,"after": {"id": 2,"city": "xian"},"op": "c","source": {"db": "app_db","table": "shipments"}
}

环境清理

本教程结束后,在 docker-compose.yml 文件所在的目录下执行如下命令停止所有容器:

docker-compose down

在 Flink 所在目录 flink-1.19.2 下执行如下命令停止 Flink 集群:

./bin/stop-cluster.sh

参考资料

[1]

Flink 1.19.2: https://archive.apache.org/dist/flink/flink-1.19.2/flink-1.19.2-bin-scala_2.12.tgz

[2]

flink-cdc-3.3.0-bin.tar.gz: https://www.apache.org/dyn/closer.lua/flink/flink-cdc-3.3.0/flink-cdc-3.3.0-bin.tar.gz

[3]

MySQL pipeline connector 3.3.0: https://repo1.maven.org/maven2/org/apache/flink/flink-cdc-pipeline-connector-mysql/3.3.0/flink-cdc-pipeline-connector-mysql-3.3.0.jar

[4]

Kafka pipeline connector 3.3.0: https://repo1.maven.org/maven2/org/apache/flink/flink-cdc-pipeline-connector-kafka/3.3.0/flink-cdc-pipeline-connector-kafka-3.3.0.jar

[5]

MySQL Connector Java: https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.27/mysql-connector-java-8.0.27.jar

[6]

debezium-json: https://debezium.io/documentation/reference/stable/integrations/serdes.html

[7]

canal-json: https://github.com/alibaba/canal/wiki


基于 Flink CDC 打造企业级实时数据同步方案


相比于传统数据集成流水线,Flink CDC 提供了全量和增量一体化同步的解决方案。对于一个同步任务,只需使用一个 Flink 作业即可将上游的全量数据和增量数据一致地同步到下游系统。此外, Flink CDC 使用了增量快照算法,无需任何额外配置即可实现全量和增量数据的无缝切换。

现推出“Flink CDC 挑战任务”参与挑战不仅可快速体验《基于 Flink CDC 打造企业级实时数据同步方案》,限时上传任务截图还可获得精美礼品。

 点击即可跳转:Flink CDC 挑战任务

图片

相关文章:

基于 Flink CDC YAML 的 MySQL 到 Kafka 流式数据集成

本教程的演示都将在 Flink CDC CLI 中进行,无需一行 Java/Scala 代码,也无需安装 IDE。 这篇教程将展示如何基于 Flink CDC YAML 快速构建 MySQL 到 Kafka 的 Streaming ELT 作业,包含整库同步、表结构变更同步演示和关键参数介绍。 准备阶段…...

Hue UI展示中文

个人博客地址:Hue UI展示中文 | 一张假钞的真实世界 如果使用开发分支代码如master分支)编译安装,需要自己编译语言文件。例如Hue安装目录为“/opt/hue”,则安装后执行以下命令: $ cd /opt/hue $ make locales 如果…...

(十 一)趣学设计模式 之 组合模式!

目录 一、 啥是组合模式?二、 为什么要用组合模式?三、 组合模式的实现方式四、 组合模式的优缺点五、 组合模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支…...

安全模块设计:token服务、校验注解(开启token校验、开启签名校验、允许处理API日志)、获取当前用户信息的辅助类

文章目录 引言pom.xmlI 校验注解ApiValidationII token服务TokenService获取当前用户信息的辅助类III 域登录接口响应数据登陆用户信息引言 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/PO…...

Python学习第十八天之深度学习之Tensorboard

Tensorboard 1.TensorBoard详解2.安装3.使用4.图像数据格式的一些理解 后续会陆续在词博客上更新Tensorboard相关知识 1.TensorBoard详解 TensorBoard是一个可视化的模块&#xff0c;该模块功能强大&#xff0c;可用于深度学习网络模型训练查看模型结构和训练效果&#xff08;…...

Redis安装及其AnotherRedisDesktopManagera安装使用

一、Redis安装 1. 下载Redis安装包 通过网盘分享的文件&#xff1a;Redis 链接: https://pan.baidu.com/s/1elAT8mk3EIoYQQ3WoVVoNg?pwd7yrz 提取码: 7yrz 2. 解压Redis安装包 下载完成后&#xff0c;将Redis安装包解压到一个指定的目录&#xff0c;例如&#xff1a;C:\Re…...

C# dll文件的反编译获取源码

目录 前言操作流程结论 前言 上一篇文章介绍了将C# cs类文件加密为dll文件&#xff0c;在此给大家写一篇关于反编译dll文件的文章。 操作流程 首先&#xff0c;我们需要准备一个C#反编译工具&#xff0c;我这里用的是免费的软件JetBrains dotPeek&#xff0c;类似的有很多&am…...

大语言模型学习--LangChain

LangChain基本概念 ReAct学习资料 https://zhuanlan.zhihu.com/p/660951271 LangChain官网地址 Introduction | &#x1f99c;️&#x1f517; LangChain LangChain是一个基于语言模型开发应用程序的框架。它可以实现以下应用程序&#xff1a; 数据感知&#xff1a;将语言模型…...

Spark内存迭代计算

一、宽窄依赖 窄依赖&#xff1a;父RDD的一个分区数据全部发往子RDD的一个分区 宽依赖&#xff1a;父RDD的一个分区数据发往子RDD的多个分区&#xff0c;也称为shuffle 二、Spark是如何进行内存计算的&#xff1f;DAG的作用&#xff1f;Stage阶段划分的作用&#xff1f; &a…...

Python之参数星号(*)使用笔记

背景 在学习python时发现方法调用和方法定义会经常发现有带星号的标记&#xff0c;为了弄明白是怎么使用的。特此做个笔记。 一、参数符号对比速查表 符号类使用场景作用描述示例无符号函数定义/调用普通位置参数或关键字参数.def func(a, b)*函数定义收集多余位置参数为元组…...

一文掌握 Scrapy 框架的详细使用,包括实战案例

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. Scrapy 简介2. Scrapy 的核心组件3. 安装 Scrapy4. 创建 Scrapy 项目4.1 创建项目4.2 创建 Spider5. 编写 Spider5.1 定义 Item5.2 编写 Spider 逻辑6. 运行 Scrapy 爬虫6.1 运行爬虫6.2 保存爬取数据7. Scrapy 的高…...

【Mac】git使用再学习

目录 前言 如何使用github建立自己的代码库 第一步&#xff1a;建立本地git与远程github的联系 生成密钥 将密钥加入github 第二步&#xff1a;创建github仓库并clone到本地 第三步&#xff1a;上传文件 常见的git命令 git commit git branch git merge/git rebase …...

【MySQL篇】数据库基础

目录 1&#xff0c;什么是数据库&#xff1f; 2&#xff0c;主流数据库 3&#xff0c;MySQL介绍 1&#xff0c;MySQL架构 2&#xff0c;SQL分类 3&#xff0c;MySQL存储引擎 1&#xff0c;什么是数据库&#xff1f; 数据库&#xff08;Database&#xff0c;简称DB&#xf…...

SpringBoot项目注入 traceId 来追踪整个请求的日志链路

SpringBoot项目注入 traceId 来追踪整个请求的日志链路&#xff0c;有了 traceId&#xff0c; 我们在排查问题的时候&#xff0c;可以迅速根据 traceId 查找到相关请求的日志&#xff0c;特别是在生产环境的时候&#xff0c;用户可能只提供一个错误截图&#xff0c;我们作为开发…...

【Block总结】SAFMN,空间自适应调制与局部特征增强的协同设计|即插即用

论文信息 标题&#xff1a;Spatially-Adaptive Feature Modulation for Efficient Image Super-Resolution论文链接&#xff1a;https://arxiv.org/pdf/2302.13800代码与模型&#xff1a;https://github.com/sunny2109/SAFMN 创新点 空间自适应特征调制&#xff08;SAFM&…...

Python爬虫:一文掌握PyQuery模块

文章目录 1. PyQuery 简介2. PyQuery 的安装2.1 安装 PyQuery2.2 安装依赖库3. PyQuery 的基本使用3.1 初始化 PyQuery 对象3.2 选择元素3.3 获取元素内容3.4 遍历元素4. PyQuery 的高级用法4.1 过滤元素4.2 查找子元素4.3 获取属性值4.4 修改元素4.5 添加和删除元素4.6 遍历文…...

LearnOpenGL之Shader编程用算法绘画

———————————————————— 前序 ——————————————————— AndroidLearnOpenGL是本博主自己实现的LearnOpenGL练习集合&#xff1a; Github地址&#xff1a;GitHub - wangyongyao1989/AndroidLearnOpenGL: OpenGL基础及运用 系列文章&#xff…...

如何使用Spring Boot框架整合Redis:超详细案例教程

目录 # 为什么选择Spring Boot与Redis整合&#xff1f; 1. 更新 pom.xml 2. 配置application.yml 3. 创建 Redis 配置类 4. Redis 操作类 5. 创建控制器 6. 启动应用程序 7. 测试 # 为什么选择Spring Boot与Redis整合&#xff1f; 将Spring Boot与Redis整合可以充分利…...

算法--贪心

贪心 原理经典例题[860. 柠檬水找零](https://leetcode.cn/problems/lemonade-change/description/)[2208. 将数组和减半的最少操作次数](https://leetcode.cn/problems/minimum-operations-to-halve-array-sum/description/)[179. 最大数](https://leetcode.cn/problems/large…...

线程控制(创建、终止、等待、分离)

目录 1.前言 2.创建线程 pthread_create函数 3.线程终止 pthread_exit函数 pthread_cancel函数 4.线程等待 5.线程分离 1.前言 在Linux系统中&#xff0c;并不存在真正的线程&#xff0c;只有轻量级进程。所以&#xff0c;Linux系统只提供了操作轻量级进程的系统调用…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...