编译后更改Kafka Streams配置

时间:2019-01-21 10:35:32

标签: apache-kafka-streams

我目前正在研究一个小的Kafka Streams项目,目标是自动设置Kafka集群并在其上运行Streams应用程序。为了方便起见,如果可以的话,即使在编译后也可以在应用程序的.java文件之外设置bootstrap.servers属性,这将非常有帮助。

文档设置属性的唯一方法如下:

import java.util.Properties;
import org.apache.kafka.streams.StreamsConfig;

Properties settings = new Properties();
// Set a few key parameters
settings.put(StreamsConfig.APPLICATION_ID_CONFIG, "my-first-streams-application");
settings.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka-broker1:9092");
// Any further settings
settings.put(... , ...);

但是如果在编写代码时还不知道集群的主机名和端口怎么办?原因是我想创建一个使用Kafka集群和Kafka Streams应用程序的配置参数的工具,然后自动设置所有必需的VM和服务并执行该应用程序。其他人应该能够使用此工具,而不必更改流应用程序的Java代码。

有什么想法吗?我想到的唯一其他选择是通过代码解析并更改属性。如果可能的话,我不想对未知代码执行此操作...

1 个答案:

答案 0 :(得分:3)

是的,您始终可以将代理和其他配置作为运行时配置。实际上,这是将代码与群集配置解耦的最佳实践,因为这些配置可能会更改。您可以使用所有运行时参数创建一个application.propertiesapplication.yaml文件。

1.(使用springboot)application.yaml示例:

  application-id: my-application1
  bootstrap-servers:  server1:9092,server2:9092
  schema-registry-url: http://localhost:8081
  default-key-serde: String
  default-value-serde: JsonNode
  auto-offset-reset: earliest
  default-state-dir: /data/state
  num-threads: 4

并通过以下方式添加代码以读取属性:
https://www.mkyong.com/spring-boot/spring-boot-configurationproperties-example/

如果您使用的是Spring Boot项目,则可以使用application.yaml通过以下方式运行jar

java -jar myjar.jar --spring.config.location=path-to-yaml-file

2。 (不使用Spring)application.properties

java -cp ... -Dmy.app.properties=/path/to/app.properties mypackage.myclass

然后您可以阅读系统属性。

String propertiesPath = System.getProperty( "app.properties" );
final Properties myProps;
if ( propertiesPath != null ){
     final FileInputStream in = new FileInputStream( propertiesPath );
     try{
         myProps = Properties.load( in );
     }finally{
         in.close( );
     }
}