我目前正在研究一个小的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代码。
有什么想法吗?我想到的唯一其他选择是通过代码解析并更改属性。如果可能的话,我不想对未知代码执行此操作...
答案 0 :(得分:3)
是的,您始终可以将代理和其他配置作为运行时配置。实际上,这是将代码与群集配置解耦的最佳实践,因为这些配置可能会更改。您可以使用所有运行时参数创建一个application.properties
或application.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( );
}
}