【问题标题】:Including profiles via a Spring Boot starter通过 Spring Boot 启动器包含配置文件
【发布时间】:2018-11-16 16:15:50
【问题描述】:

我在使用自定义 Spring Boot 启动器时遇到问题。启动器如何使配置文件被包含并从配置服务器中提取相关配置?

也许我的用例是独一无二的,因为我没有在网上找到任何有用的信息。我在企业环境中工作,这个启动器供我的团队使用,所以我们能够控制一些在开源世界中可能没有意义的东西(比如配置文件名称)。

这里是场景:我们运行了一个 Spring Cloud Config Server 来提供配置。在我们的 Spring Boot 项目中,我们对某些配置文件名称进行了标准化,例如“prod”和“nonprod”,以控制我们不同环境中的配置。我正在尝试创建一个启动器来提供可重用的功能。例如,假设我正在创建一个启动器,它为为我们执行加密工作的设备提供接口。此启动器将需要设备的 IP 地址以及生产和非生产之间不同的各种其他配置。

在配置仓库中,我将拥有 application.yml、application-nonprod.yml、application-nonprodEncryption.yml 等文件。

我的目标是让自定义加密启动器在应用程序中包含该启动器时自动包含 nonprodEncryption 配置文件。这样一来,不需要加密的应用就不会加载加密相关的属性。

这是我目前的实验结果:

  • 在应用程序的 bootstrap.yml 中,我可以放置一个块,例如

    spring.profiles: nonprod
    spring:
      profiles:
        include:
          - nonprodEncryption
    

    这会产生所需的结果(即从配置服务器加载并使用 application-nonprodEncryption.yml 文件),但这是一个不受欢迎的解决方案,因为每个使用我的自定义启动器的应用程序都需要包含此样板配置。

  • 当我把上面的配置移到starter的bootstrap.yml中,好像没有效果。

  • 1234563从配置服务器中拉取。

我考虑过的其他事情:

  • 为什么不将所有配置放入主配置文件配置文件(例如 application-nonprod.yml)?从关注点和维护的角度来看,我想保持各个启动器的配置彼此隔离。此外,一些配置数据比其他配置数据更敏感,所以我不喜欢将所有配置公开给所有应用程序的想法,因为许多应用程序不需要一些更敏感的配置。是的,他们可以得到它,但是如果他们不需要它,为什么要把它加载到他们的记忆中呢?

  • 为什么不在我们启动应用程序时指定额外的配置文件?这些应用程序将在云平台上运行。平台将根据应用程序运行的层级指定“prod”或“nonprod”作为配置文件。我想在平台级别而不是应用程序级别管理它,所以我想要在应用程序提供的配置文件列表启动以在所有应用程序中统一(例如,将 nonprodEncryption 添加到列表中只会让我陷入与上述相同的情况 - 所有应用程序都将具有所有配置,所以我不妨将它们全部放在一个文件中)。

我们目前使用的是 Spring Boot 1.5.10。

对如何实现我想要做的事情有什么想法吗?

【问题讨论】:

    标签: spring spring-boot spring-cloud-config spring-boot-starter


    【解决方案1】:

    我终于找到了解决方案(以防其他人发现自己在同一个地方)。

    第 1 步:将这样的配置类添加到您的启动器中:

    package com.company.bootstrap;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.ConfigurableApplicationContext;
    import org.springframework.context.annotation.Profile;
    
    @Configuration
    @Profile("nonprod")
    public class BootstrapNonprod {
        public BootstrapNonprod(ConfigurableApplicationContext ctx) {
            ctx.getEnvironment().addActiveProfile("nonprodEncryption");
        }
    }
    

    这将有条件地添加配置文件。在此示例中,只要“nonprod”配置文件处于活动状态,此类就会添加“nonprodEncryption”配置文件。

    第 2 步:在您的 starter 的 spring.factories 文件中,添加如下一行:

    org.springframework.cloud.bootstrap.BootstrapConfiguration=com.company.bootstrap.BootstrapNonprod
    

    好像就是这么简单。

    【讨论】:

      猜你喜欢
      • 2020-01-09
      • 1970-01-01
      • 2021-03-02
      • 1970-01-01
      • 2023-01-30
      • 2018-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多