springboot引入flink,maven打包插件需替换

当Springboot项目集成Flink后,传统的Maven打包方式不再适用,需要使用maven-shade-plugin插件进行打包。配置包括设置finalName为flink以及指定maven-shade-plugin的版本。

在这里插入图片描述

目录

说明

springboot引入flink后,如果要打包,传统的maven不行,要更换指定插件

<build>
        <finalName>flink</finalName>
        <plugins>
            <plugin>
                
Spring Boot 项目中集成 Flink 组件实现数据同步,而无单独安装 Flink 应用,是一种将 Flink 作为嵌入式库使用的常见方式。这种方式适用于要在已有 Java 应用中嵌入流处理能力的场景,例如实时数据同步、ETL 任务或数据管道构建。 ### 内嵌 Flink 实现数据同步 通过将 Flink 作为依赖库引入 Spring Boot 项目,可以利用 Flink 的流处理能力实现数据库数据的实时同步。例如,结合 Flink CDC 实现 MySQL 到 Elasticsearch 的数据同步[^3]。Flink CDC 能够捕获数据库的全量和增量数据,直接作为数据流输出,供 Flink 程序进行实时处理和写入目标系统。 在 Spring Boot 中集成 Flink 时,通常引入以下依赖: ```xml <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-java</artifactId> <version>${flink.version}</version> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-streaming-java</artifactId> <version>${flink.version}</version> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-mysql-cdc</artifactId> <version>${flink.version}</version> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-clients</artifactId> <version>${flink.version}</version> </dependency> ``` ### 实现 MySQL 到 Elasticsearch 同步(DataStream API) 以下是一个基于 DataStream API 的示例代码,展示如何在 Spring Boot 中嵌入 Flink 实现 MySQL 到 Elasticsearch 的数据同步: ```java import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.api.datastream.DataStreamSource; import org.apache.flink.connector.elasticsearch7.Elasticsearch7SinkBuilder; import org.apache.flink.connector.elasticsearch.ElasticsearchSink; import org.apache.flink.formats.json.JsonSerializationSchema; import org.apache.flink.table.connector.ChangelogMode; import org.apache.flink.table.data.RowData; import org.apache.flink.table.runtime.typeutils.RowDataSerializer; import org.apache.flink.table.types.logical.RowType; import org.apache.flink.types.Row; import org.apache.flink.types.RowKind; import java.util.Arrays; import java.util.Properties; public class FlinkEmbeddedSync { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 读取 MySQL 数据 DataStreamSource<Row> mysqlStream = env.addSource(new MySqlCdcSource(...)); // 配置 Elasticsearch Sink Properties esProperties = new Properties(); esProperties.setProperty("cluster.name", "my-cluster"); ElasticsearchSink.Builder<Row> esSinkBuilder = new ElasticsearchSink.Builder<>( Arrays.asList(new HttpHost("localhost", 9200, "http")), new ElasticsearchSinkFunction<Row>() { private final JsonSerializationSchema jsonSerializer = new JsonSerializationSchema(); @Override public void process(Row element, RuntimeContext context, RequestIndexer indexer) { String json = jsonSerializer.serialize(element); indexer.add(new IndexRequest("mysql_data").source(json, XContentType.JSON)); } } ); // 设置批量刷新策略 esSinkBuilder.setBulkFlushMaxActions(1); // 构建并添加 Sink mysqlStream.addSink(esSinkBuilder.build()); env.execute("Embedded Flink Sync Job"); } } ``` ### Spring Boot 中集成 Flink 的注意事项 在 Spring Boot 中直接使用 Flink 时,要注意以下几点: - **Flink 运行时上下文管理**:Flink 作业要通过 `StreamExecutionEnvironment` 来构建流处理拓扑,Spring Boot 应用确保在合适的生命周期阶段启动 Flink 作业。 - **状态后端与检查点配置**:如果要启用检查点机制或状态管理,应配置合适的 `StateBackend`,如 `MemoryStateBackend` 或 `RocksDBStateBackend`。 - **资源隔离与线程管理**:Flink 作业在 Spring Boot运行时,注意线程模型与 Spring 容器线程的隔离,避免资源竞争。 - **日志与异常处理**:Flink 作业的异常处理机制Spring Boot 的日志系统集成,确保错误信息可追踪。 ### 示例:使用 Table API 实现同步 Flink 提供了更高层次的 Table API,支持 SQL 风格的数据操作,适合与 Spring Boot 结合使用: ```java import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; public class FlinkTableApiSync { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); StreamTableEnvironment tEnv = StreamTableEnvironment.create(env); // 创建 MySQL 表 tEnv.executeSql( "CREATE TABLE mysql_table (id INT PRIMARY KEY, name STRING) WITH (" + " 'connector' = 'mysql-cdc'," + " 'hostname' = 'localhost'," + " 'port' = '3306'," + " 'database-name' = 'mydb'," + " 'table-name' = 'mytable'," + " 'username' = 'root'," + " 'password' = 'password'" + ")" ); // 创建 Elasticsearch 表 tEnv.executeSql( "CREATE TABLE es_table (id INT PRIMARY KEY, name STRING) WITH (" + " 'connector' = 'elasticsearch-7'," + " 'hosts' = 'http://localhost:9200'," + " 'index' = 'mysql_data'" + ")" ); // 执行同步 tEnv.executeSql("INSERT INTO es_table SELECT * FROM mysql_table"); } } ``` 该方式简化了数据流的构建过程,适合对 SQL 语法熟悉的开发人员。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值