上一篇介绍了使用基础Java客户端接入Apollo的示例,有同学反映在分布式环境下获取不到Apollo配置,只能在main方法中初始化使用,姿势不够优雅。
这里将Apollo的Java客户端将Flink官方推荐的ParameterTool结合使用,以解决该问题。
package org.example;
import com.ctrip.framework.apollo.ConfigFile;
import com.ctrip.framework.apollo.ConfigService;
import com.ctrip.framework.apollo.core.enums.ConfigFileFormat;
import org.apache.flink.api.common.functions.RichMapFunction;
import org.apache.flink.api.java.utils.ParameterTool;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.source.SourceFunction;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
/**
* @author xianghu.wang
* @time 2020/4/28
* @description Flink集成Apollo示例
*/
public class FinkIntegrateApolloV2 {
/**
* 应用id.
*/
private static final String APP_ID_NAME = "app.id";
private static final String APP_ID_VALUE = "apollo-integration-demo";
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 加载参数
loadConfig(env);
// 模拟数据源,每秒发送一次 Hello Apollo
DataStreamSource<String> helloApollo = env.addSource(new SourceFunction<String>() {
private volatile boolean isRunning = true;
@Override
public void run(SourceContext<String> ctx) throws Exception {
while (isRunning) {
ctx.collect("Hello Apollo");
TimeUnit.SECONDS.sleep(1);
}
}
@Override
public void cancel() {
isRunning = false;
}
});
// 模拟业务逻辑 -> 拼接字符串打印从Apollo加载到的timeout参数 ("Hello Apollo your timeout is 60000")
helloApollo.map(new RichMapFunction<String, String>() {
private ParameterTool config;
@Override
public void open(Configuration parameters) throws Exception {
super.open(parameters);
config = (ParameterTool) getRuntimeContext().getExecutionConfig().getGlobalJobParameters();
}
@Override
public String map(String value) throws Exception {
return value + " your timeout is " + config.get("timeout", "default");
}
}).print();
env.execute("FinkIntegrateApolloV2-" + ENV_VALUE);
}
/**
* 加载Apollo配置到ParameterTool.
*
* @param env
* @throws IOException
*/
private static void loadConfig(StreamExecutionEnvironment env) throws IOException {
// 指定app.id
System.setProperty(APP_ID_NAME, APP_ID_VALUE);
// 获取配置,注册到全局
ConfigFile configFile = ConfigService.getConfigFile("application", ConfigFileFormat.Properties);
ParameterTool config = ParameterTool.fromPropertiesFile(new ByteArrayInputStream(configFile.getContent().getBytes()));
env.getConfig().setGlobalJobParameters(config);
}
}
Note:
1.改用ConfigFile,为了更好的和ParameterTool结合使用;
2.取消了META-INF/app.properties配置文件:app.id的配置方式有多种,文件的方式略显啰嗦,我这里直接在代码里写死(毕竟这个参数是不会变的),同学们可以自由选择;
3.测试时的启动命令(-env放在最后):flink run -m yarn-cluster -d -ynm flink-apollo-demoV2 flink-apollo-demoV2.jar -env dev