上一篇介紹了使用基礎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