在 Akka 项目中加载和共享配置数据
Loading and sharing configuration data in an Akka project
我已经定义了两个 application.conf 文件,每个环境一个,即 dev 和 prod :
application-dev.conf
application-prod.conf
为了读取配置值,我使用名为 ConfigurationObject
的配置对象生成器(使用 lombok)来设置从应用程序配置文件中读取的值。配置对象只存储两个属性‘kafkaBrokers’和‘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。有没有我应该为此使用的模式?
应用程序配置文件:
申请-dev.conf:
kafka-config {
brokers="broker1,broker4"
brokers = ${?MY_KEY_ENV}
}
some-other-config {
brokers="broker-prod1,broker-prod4"
brokers = ${?MY_KEY_ENV}
}
申请-prod.conf:
kafka-config {
brokers="broker-prod1,broker-prod4"
}
some-other-config {
brokers="broker-prod1,broker-prod4"
brokers = ${?MY_KEY_ENV}
}
在 Lightbend Config/HOCON 中定义代表应用程序配置的 class 绝对不是一个不常见的模式。在 Scala 方面,有像 PureConfig 这样的工具可以很容易地将配置读入这样的 class。我不知道 Java 方面有类似的工具(例如,反思性地查看配置 class 并让您从 Config
对象构建 class 的实例,沿途推断模式),但我认为这样的工具并非不可能。
无论您是否定义这样的 class,通常最好在应用程序中加载一次且仅一次配置,然后将您定义的 class 传递给表示周围的配置或 Config
对象:file/resource I/O 并且解析不是免费的,多个负载会增加认知负担。
我对阅读 application-dev.conf
和 application-prod.conf
有点怀疑。如果您的应用程序需要两组 Kafka 代理(例如,它从一组消费并生产到另一组),那么可能值得在单个配置文件中包含(例如)source-kafka
和 destination-kafka
配置节.或者,如果您的应用程序实际上只使用一个配置,您可以指定 config.file
属性(例如,通过在 Java 命令行上添加 -Dconfig.file=application-dev.conf
),然后仅使用 ConfigFactory.load()
。在这种情况下,通过 HOCON 的文件包含功能合并配置文件可能是个好主意。这通常用于使用 deployment-/environment-specific 配置定义覆盖配置文件,其中包括结合了更多通用设置的常规 application.conf
。
我已经定义了两个 application.conf 文件,每个环境一个,即 dev 和 prod :
application-dev.conf
application-prod.conf
为了读取配置值,我使用名为 ConfigurationObject
的配置对象生成器(使用 lombok)来设置从应用程序配置文件中读取的值。配置对象只存储两个属性‘kafkaBrokers’和‘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。有没有我应该为此使用的模式?
应用程序配置文件:
申请-dev.conf:
kafka-config {
brokers="broker1,broker4"
brokers = ${?MY_KEY_ENV}
}
some-other-config {
brokers="broker-prod1,broker-prod4"
brokers = ${?MY_KEY_ENV}
}
申请-prod.conf:
kafka-config {
brokers="broker-prod1,broker-prod4"
}
some-other-config {
brokers="broker-prod1,broker-prod4"
brokers = ${?MY_KEY_ENV}
}
在 Lightbend Config/HOCON 中定义代表应用程序配置的 class 绝对不是一个不常见的模式。在 Scala 方面,有像 PureConfig 这样的工具可以很容易地将配置读入这样的 class。我不知道 Java 方面有类似的工具(例如,反思性地查看配置 class 并让您从 Config
对象构建 class 的实例,沿途推断模式),但我认为这样的工具并非不可能。
无论您是否定义这样的 class,通常最好在应用程序中加载一次且仅一次配置,然后将您定义的 class 传递给表示周围的配置或 Config
对象:file/resource I/O 并且解析不是免费的,多个负载会增加认知负担。
我对阅读 application-dev.conf
和 application-prod.conf
有点怀疑。如果您的应用程序需要两组 Kafka 代理(例如,它从一组消费并生产到另一组),那么可能值得在单个配置文件中包含(例如)source-kafka
和 destination-kafka
配置节.或者,如果您的应用程序实际上只使用一个配置,您可以指定 config.file
属性(例如,通过在 Java 命令行上添加 -Dconfig.file=application-dev.conf
),然后仅使用 ConfigFactory.load()
。在这种情况下,通过 HOCON 的文件包含功能合并配置文件可能是个好主意。这通常用于使用 deployment-/environment-specific 配置定义覆盖配置文件,其中包括结合了更多通用设置的常规 application.conf
。