flink+nacos实现参数化配置
导言
项目分为开发环境,测试环境,预发布环境以及生产环境。之前的flink都是在代码中隔开,发布环境改配置文件的,非常的不方便,而且是每个flink中写一个配置,太麻烦了。想着通过nacos来区分环境。节省垃圾代码的使用。
1.前置条件
nacos的安装,可以实现基于db的访问。
2.代码流程
项目结构
实现思路
在resource目录下定义开发环境,测试环境,预发布环境,以及生产环境需要的配置文件
在nacos中配置需要的参数。通过指定不同环境,获得不同的参数。
父类pom
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.hailong.flink</groupId> <artifactId>flink-learning</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>flink-nacos-learning</module> </modules> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <!-- Maven properties --> <maven.test.skip>false</maven.test.skip> <maven.javadoc.skip>true</maven.javadoc.skip> <!-- Compiler settings properties --> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <nacos.groupId>com.alibaba.nacos</nacos.groupId> <nacos.version>1.1.4</nacos.version> <flink.version>1.10.0</flink.version> <flink.groupId>org.apache.flink</flink.groupId> </properties> <!-- 所有的子项目默认依赖 --> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> <version>4.12</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <!--相关的配置包--> <dependency> <groupId>${flink.groupId}</groupId> <artifactId>flink-clients_2.11</artifactId> <version>${flink.version}</version> <scope>compile</scope> </dependency> <dependency> <groupId>${flink.groupId}</groupId> <artifactId>flink-core</artifactId> <version>${flink.version}</version> <scope>compile</scope> </dependency> <dependency> <groupId>${flink.groupId}</groupId> <artifactId>flink-scala_2.11</artifactId> <version>${flink.version}</version> <scope>compile</scope> </dependency> <dependency> <groupId>${flink.groupId}</groupId> <artifactId>flink-streaming-scala_2.11</artifactId> <version>${flink.version}</version> <scope>compile</scope> </dependency> <dependency> <groupId>${flink.groupId}</groupId> <artifactId>flink-streaming-java_2.11</artifactId> <version>${flink.version}</version> <scope>compile</scope> </dependency> <dependency> <groupId>${flink.groupId}</groupId> <artifactId>flink-jdbc_2.11</artifactId> <version>${flink.version}</version> <scope>compile</scope> </dependency> <!--NACOS 服务配置中心依赖包--> <dependency> <groupId>${nacos.groupId}</groupId> <artifactId>nacos-common</artifactId> <version>${nacos.version}</version> </dependency> <!--<dependency> <groupId>${nacos.groupId}</groupId> <artifactId>nacos-core</artifactId> <version>${nacos.version}</version> </dependency>--> <dependency> <groupId>${nacos.groupId}</groupId> <artifactId>nacos-client</artifactId> <version>${nacos.version}</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.11.2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.11.2</version> </dependency> </dependencies> </dependencyManagement> </project>
子类pom
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>flink-learning</artifactId> <groupId>com.hailong.flink</groupId> <version>1.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>flink-nacos-learning</artifactId> <dependencies> <dependency> <groupId>${flink.groupId}</groupId> <artifactId>flink-clients_2.11</artifactId> </dependency> <dependency> <groupId>${flink.groupId}</groupId> <artifactId>flink-core</artifactId> </dependency> <dependency> <groupId>${flink.groupId}</groupId> <artifactId>flink-scala_2.11</artifactId> </dependency> <dependency> <groupId>${flink.groupId}</groupId> <artifactId>flink-streaming-java_2.11</artifactId> </dependency> <dependency> <groupId>${flink.groupId}</groupId> <artifactId>flink-jdbc_2.11</artifactId> </dependency> <dependency> <groupId>${nacos.groupId}</groupId> <artifactId>nacos-common</artifactId> </dependency> <!--<dependency> <groupId>${nacos.groupId}</groupId> <artifactId>nacos-core</artifactId> </dependency>--> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> </dependency> <!-- log --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </dependency> </dependencies> </project>
resource
sim.flink.nacos.enable=true sim.flink.nacos.serverAddr=120.0.0.1:8848 .flink.nacos.namespace=public sim.flink.nacos.groups=DEFAULT_GROUP sim.flink.nacos.dataIds=test
nacos参数
java代码
package com.hailong.flink.nacos; import com.alibaba.nacos.api.NacosFactory; import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.exception.NacosException; import com.alibaba.nacos.client.config.listener.impl.PropertiesListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.InputStream; import java.io.StringReader; import java.util.Properties; /** * flink nacos support * * @author wxg */ public class FlinkNacosConfig { private static final Logger logger = LoggerFactory.getLogger(FlinkNacosConfig.class); private static final String ENABLE_NACOS_KEY = "sim.flink.nacos.enable"; private static final String SERVER_ADDR_KEY = "sim.flink.nacos.serverAddr"; private static final String NAMESPACE_KEY = "sim.flink.nacos.namespace"; private static final String GROUPS_KEY = "sim.flink.nacos.groups"; private static final String DATA_IDS_KEY = "sim.flink.nacos.dataIds"; private static final String TIMEOUT_KEY = "sim.flink.nacos.timeout"; private static final String DEFAULT_GROUP = "DEFAULT_GROUP"; private static final String DEFAULT_DATA_ID = "test"; private static final String DEFAULT_TIMEOUT = "3000"; private static String SERVER_ADDR; private static String NAMESPACE; private static String[] GROUPS; private static String[] DATA_IDS; private static Integer TIMEOUT; private static Properties CONFIG_MAP = new Properties(); private static Properties NACOS_CONFIG_MAP = new Properties(); private static final String DEFAULT_CONFIG_FILE = "application.properties"; static { InputStream inputStream = FlinkNacosConfig.class.getClassLoader().getResourceAsStream("application.properties"); // int i = 0; // byte[] b = new byte[2]; // while (true) { // try { // if (!((i = inputStream.read(b)) != -1)) break; // } catch (IOException e) { // e.printStackTrace(); // } // String str = new String(b); // System.out.print(str); // } if (inputStream == null) { logger.info("no flink nacos config found"); } else { try { CONFIG_MAP.load(inputStream); String enableNacos = CONFIG_MAP.getProperty(ENABLE_NACOS_KEY, "false"); if (Boolean.valueOf(enableNacos)) { SERVER_ADDR = CONFIG_MAP.getProperty(SERVER_ADDR_KEY); NAMESPACE = CONFIG_MAP.getProperty(NAMESPACE_KEY); GROUPS = CONFIG_MAP.getProperty(GROUPS_KEY, DEFAULT_GROUP).split(","); DATA_IDS = CONFIG_MAP.getProperty(DATA_IDS_KEY, DEFAULT_DATA_ID).split(","); TIMEOUT = Integer.valueOf(CONFIG_MAP.getProperty(TIMEOUT_KEY, DEFAULT_TIMEOUT)); initNacos(); } else { logger.debug("Naocs config is not enable"); } } catch (IOException e) { e.printStackTrace(); logger.error("", e); } } } private static void initNacos() { Properties properties = new Properties(); properties.put("serverAddr", SERVER_ADDR); properties.put("namespace", NAMESPACE); String content = null; try { logger.info("loading config from nacos..."); ConfigService configService = NacosFactory.createConfigService(properties); for (String group : GROUPS) { for (String dataId : DATA_IDS) { content = configService.getConfig(dataId, group, TIMEOUT); if (content != null) { NACOS_CONFIG_MAP.load(new StringReader(content)); configService.addListener(dataId, group, new PropertiesListener() { @Override public void innerReceive(Properties properties) { logger.info("config file {}:{} refreshed", group, dataId); NACOS_CONFIG_MAP.putAll(properties); } }); } } } logger.info("load config from nacos success"); } catch (NacosException | IOException e) { e.printStackTrace(); logger.error("", e); } } public static String getConfigValue(String key) { return NACOS_CONFIG_MAP.getProperty(key); } public static String getConfigValue(String key, String defaultValue) { return NACOS_CONFIG_MAP.getProperty(key, defaultValue); } }
test
package com.hailong.flink.nacos; import com.alibaba.nacos.api.NacosFactory; import com.alibaba.nacos.api.config.ConfigService; import org.apache.flink.api.java.utils.ParameterTool; import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Properties; /** * Created by 袁海龙 on 2020/2/26. * https://www.bilibili.com/video/av90742627 */ public class FlinkNacosConfigTest { private static final Logger logger = LoggerFactory.getLogger(FlinkNacosConfig.class); public static void main(String[] args) throws Exception { String configValue = FlinkNacosConfig.getConfigValue("shuaige.wdw.swf"); String chenjie = FlinkNacosConfig.getConfigValue("chenjie1"); String ceshi = FlinkNacosConfig.getConfigValue("shuaige.ceshi"); logger.info("configValue:{}",configValue); } }
结果
代码地址
https://gitee.com/chenjie950907/flink-learning
本文来自博客园,作者:小陈子博客,转载请注明原文链接:https://www.cnblogs.com/cj8357475/p/16412796.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本