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