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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值