【问题标题】:How to manage spring-boot application configuration for different environmnets?如何管理不同环境的spring-boot应用配置?
【发布时间】:2018-10-26 12:42:48
【问题描述】:

我有一个运行在不同环境(dev、qa、prod)中的 spring-boot 应用程序。为了生成可以在所有环境中运行而无需任何修改的不可变构建,我已将特定于环境的配置文件打包到生成的 jar 本身中。但这也产生了将生产数据库凭据暴露给开发团队的另一个问题。我可以使用外部配置服务器,但现在这对我来说太过分了。

我如何管理这些配置文件以避免这种信息泄漏并拥有不可变的构建来支持 CI/CD?

【问题讨论】:

  • 为什么不在每个环境上指定配置文件路径,然后在每台机器上部署环境特定的配置?或者只是将该路径上的凭据外部化?
  • 是的,我可以这样做,但是这样应用程序部署过程变得复杂,应用程序部署人员现在需要管理两件事,配置和应用程序。此外,我应该把这些配置文件放在哪里?代码库,所有人都可以访问

标签: spring spring-boot configuration-files


【解决方案1】:

对于数据泄露,建议使用 jasypt 加密用户名/密码。

application connect to database

https://github.com/ulisesbocchio/jasypt-spring-boot

不过,解密的密码必须在机器上,所以它应该已经存在,并且尽可能地保护(例如不同的用户,或https://github.com/certnanny/KeyNanny

不过,我不会将配置放入 jar 文件中。它不是应用程序逻辑的一部分,它是部署过程的一部分,部署者应该能够轻松地添加新机器。如果你使用 docker,那当然就不同了。

【讨论】:

  • 这很难回答,取决于您的组织,以及您的项目和组织拥有或允许使用的工具。在我的项目中,我通常将它们部署到 maven repo(具有读取限制,因此文件更加私密)。然后一个单独的部署费用(uDeploy、bladelogic)获取这些文件并部署它们。在一个不同的项目,不同的团队,同一个客户,我其实写了一个配置软件进行配置+部署。供应商交付,银行应用专家配置+部署交付。可惜不是开源的……
  • 哦,你还可以把机器上要保护的东西放在一个专用文件夹中,最好只有部署用户才能读取,然后将它们合并到配置文件中(使用properties 这是一个简单的猫 secrets.properties >> application.properties)
【解决方案2】:

在应用程序中保存您的凭据似乎是不安全的做法。您可以在外部保存凭据(用于保存机密的外部服务器,或者可能在不同应用程序或环境变量内的同一服务器上)。通过环境变量读取数据将使您的构建保持完整。

如果您使用任何云服务,例如 aws 或 pivotal,那么他们就有此类服务来存储您的秘密。

【讨论】:

    【解决方案3】:

    我的大部分应用程序配置文件(eq.application.yml)是这样的:

      datasource:
        username: {database_username:root}
        password: {database_password:root123}
        sql-script-encoding: utf-8
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://{database_host:localhost}:3306/dbname?useUnicode=true&characterEncoding=utf-8
    

    如果环境变量存在,应用程序将从环境中加载配置。否则将使用默认值。

    在此之后,您可以构建单个包并在任何地方运行。

    在我的例子中,我将应用程序构建成一个 docker 镜像,并在 kubernetes 中运行,因此配置属性将存储在 ConfigMaps 和 Secret 中。

    当 Pod 运行时,会将 configmaps 和 secret 加载到环境变量中。

    当然,您也可以使用其他工具。

    【讨论】:

      【解决方案4】:

      您可以为不同的配置文件创建 yml 文件并在 JVM 参数中指定配置文件。

      1. application.yml中的所有配置文件设置通用参数
      2. application-name.yml 中设置的特定配置文件的参数
      3. 在 JVM 参数中设置配置文件:java -jar -Dspring.profiles.active=name 或在 .conf 文件中:JAVA_OPTS=-Dspring.profiles.active=name
      4. 与配置文件集数据库参数相同:java -jar -Dspring.datasource.username=name -Dspring.datasource.password=pass

      Read more

      【讨论】:

        猜你喜欢
        • 2018-11-09
        • 1970-01-01
        • 2020-08-09
        • 2013-07-25
        • 2019-08-03
        • 1970-01-01
        • 1970-01-01
        • 2019-07-01
        • 2019-01-10
        相关资源
        最近更新 更多