通过Spring Boot启动程序包含配置文件

时间:2018-06-06 21:00:04

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

我遇到了自定义Spring Boot启动器的问题。启动器如何导致包含配置文件并从配置服务器中提取相关配置?

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

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

在config repo中,我将有application.yml,application-nonprod.yml,application-nonprodEncryption.yml等文件。

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

到目前为止,我的实验结果如下:

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

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

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

  • 当我将上述配置移至启动器的bootstrap.yml时,它似乎没有效果。

  • 当我将上述配置移动到starter的application.yml时,它似乎已被应用(即它显示在The following profiles are active:列表中),但是在生命周期中导致从配置服务器中提取的适当配置。

我考虑过的其他事情:

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

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

我们目前正在使用Spring Boot 1.5.10。

关于如何实现我想要做的事情的任何想法?

1 个答案:

答案 0 :(得分:0)

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

步骤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步:在您的初学者的spring.factories文件中,添加如下行:

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

看起来就是那么简单。