Flink集成Apollo獲取配置V2

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章