在Akka项目中加载和共享配置数据



我定义了两个application.conf文件,每个环境一个,即dev和prod:

application-dev.conf
application-prod.conf

为了读取配置值,我使用名为ConfigurationObject的配置对象生成器(使用lombok(来设置从应用程序配置文件读取的值。配置对象只存储两个属性"kafkaBrokers"one_answers"someOtherConfig":

import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ConfigLoader {
private static final Logger LOGGER = LoggerFactory.getLogger(ConfigLoader.class);
public static void main(String[] args) {
String env = "dev";
final Config configDev = ConfigFactory.load("application-"+env+".conf");
final ConfigurationObject configurationObjectDev = ConfigurationObject.builder()
.kafkaBrokers(configDev.getString("kafka-config.brokers"))
.someOtherConfig(configDev.getString("kafka-config.brokers"))
.build();
env = "prod";
final Config configProd = ConfigFactory.load("application-"+env+".conf");
final ConfigurationObject configurationObjectProd = ConfigurationObject.builder()
.kafkaBrokers(configProd.getString("kafka-config.brokers"))
.someOtherConfig(configProd.getString("kafka-config.brokers"))
.build();
LOGGER.info(configurationObjectDev.toString());
LOGGER.info(configurationObjectProd.toString());
}
}

在这里,我定义了配置对象来存储从application.conf读取的值:

import lombok.Builder;
import lombok.ToString;
@Builder
@ToString
public class ConfigurationObject {
final String kafkaBrokers;
final String someOtherConfig;
}

我应该直接使用ConfigFactory.load,而不是将给定环境application.conf中的每个属性包装到配置对象中吗?在本例中是ConfigLoader。有没有我应该使用的模式?

应用程序配置文件:

application-dev.conf:

kafka-config {
brokers="broker1,broker4"
brokers = ${?MY_KEY_ENV}
}
some-other-config {
brokers="broker-prod1,broker-prod4"
brokers = ${?MY_KEY_ENV}
}

application-prod.conf:

kafka-config {
brokers="broker-prod1,broker-prod4"
}
some-other-config {
brokers="broker-prod1,broker-prod4"
brokers = ${?MY_KEY_ENV}
}

在Lightbend Config/HOCON中,定义一个表示应用程序配置的类肯定不是一种常见的模式。在Scala方面,有一些像PureConfig这样的工具可以很容易地将配置读取到这样的类中。我不知道Java方面有类似的工具(例如,反射式地查看配置类,并让您从Config对象构建该类的实例,在此过程中推断模式(,但我不认为这样的工具是不可能的。

无论您是否定义这样一个类,在应用程序中只加载一个配置,然后传递您定义的用于表示配置的类或Config对象通常是一个好主意:文件/资源I/O和解析不是免费的,多个加载可能会增加认知负载。

我对阅读application-dev.confapplication-prod.conf有点怀疑。如果您的应用程序需要两组Kafka代理(例如,它从一个代理消费并从另一个代理生产(,那么在单个配置文件中拥有(例如(source-kafkadestination-kafka配置节可能是值得的。或者,如果您的应用程序实际上只使用一个配置,则可以指定config.file属性(例如,通过在Java命令行上添加-Dconfig.file=application-dev.conf(,然后只使用ConfigFactory.load()。在这种情况下,通过HOCON的文件包含功能组合配置文件可能是个好主意。这通常用于定义具有部署/环境特定配置的覆盖配置文件,其中包括常规application.conf,它结合了更通用的设置。

最新更新