如何管理不同环境的spring-boot应用程序配置?

时间:2018-05-16 12:40:18

标签: spring spring-boot configuration-files

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

如何管理这些配置文件以避免此信息泄漏并使用不可变构建来支持CI / CD?

4 个答案:

答案 0 :(得分:1)

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

application connect to database

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

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

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

答案 1 :(得分:1)

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

如果您正在使用像aws或pivotal这样的任何云服务,那么他们会提供此类服务来存储您的秘密。

答案 2 :(得分:0)

我的大多数应用程序配置文件(例如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加载到环境变量。

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

答案 3 :(得分:0)

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

  1. application.yml
  2. 中的所有配置文件设置常用参数
  3. application-name.yml
  4. 中设置的特定配置文件的参数
  5. 在JVM参数中设置个人资料:java -jar -Dspring.profiles.active=name.conf文件:JAVA_OPTS=-Dspring.profiles.active=name
  6. 与配置文件集db参数相同:java -jar -Dspring.datasource.username=name -Dspring.datasource.password=pass
  7. Read more