【问题标题】:How to configure Spring Boot datasource part to use in production?如何配置 Spring Boot 数据源部分以在生产中使用?
【发布时间】:2018-11-27 13:36:53
【问题描述】:

我正在编写我的第一份工作中的第一个“真正”应用程序。我可以使用 Spring Boot 部署我的应用程序,它工作得很好。我怀疑的一件事是数据源配置部分。现在我将所有数据源配置写入 application.properties 文件:

spring.datasource.url = jdbc:postgresql://10.60.6.34:5432/postgres
spring.datasource.username = *username*
spring.datasource.password = *password*
spring.jpa.hibernate.ddl-auto = update
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQL94Dialect

就是这样!我还应该做些什么来准备我的应用程序生产?连接池和所有这些东西怎么样? (我不太熟悉所有数据源配置的东西)提前谢谢!

【问题讨论】:

  • 小心spring.jpa.hibernate.ddl-auto = update,不是真正用于生产用途。使用 Flyway 或 Liquidbase。

标签: java spring spring-boot datasource production-environment


【解决方案1】:

您应该利用 SpringBoot 配置文件,它允许您根据属性为 dev、stage、prod 和任何其他您想要的环境定义单独的配置。

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html

配置文件使您可以根据定义应用程序部署位置的属性来控制加载哪些配置。

您对数据连接池的问题取决于您的支持数据存储选择以及该特定存储的设置方式。一般来说,当您投入生产时,您应该使用某种类型的连接池,但具体数量和类型取决于您的实现。

【讨论】:

    【解决方案2】:

    所以 Joe W 没有错 - 配置文件是处理此问题的好方法。但是,我建议改为使用环境变量来处理问题。这将使您的应用程序不仅兼容所有操作系统(配置文件也兼容),而且还允许您更轻松地在 Docker(容器)中运行它。无论如何,您都需要做一些这样的事情,因为配置文件仍然需要您指定正在运行的配置文件,您需要使用环境变量来执行此操作。

    幸运的是,Spring Boot 自动连接环境变量,无需您做额外的工作。您可以在此处阅读更多相关信息:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

    在处理环境变量时,您使用下划线而不是句点,因此您的配置如下所示:

    SPRING_DATASOURCE_URL = jdbc:postgresql://10.60.6.34:5432/postgres
    SPRING_DATASOURCE_USERNAME = *username*
    SPRING_DATASOURCE_PASSWORD = *password*
    SPRING_JPA_HIBERNATE_DDL_AUTO = update
    SPRING_JPA_PROPERTIES_HIBERNATE_DIALECT = org.hibernate.dialect.PostgreSQL94Dialect
    

    然后您可以将您的环境变量设置为您想要的任何值,并且您无需担心为每台服务器拉入新的配置文件。此外,由于环境变量在层次结构中高于基于文件的配置,因此您可以不理会当前的基于文件的配置(如果您愿意),您的环境变量将在您部署时覆盖它们。

    围绕您的连接池,这将在很大程度上取决于您的支持 servlet 容器(即,tomcat 与其他)和您的支持数据库(看起来像 postgres)。我建议您查看 Spring Boot 的 tomcat-jdbc 使用情况,然后您可以在 Spring 的环境变量中配置最大连接池等内容。

    【讨论】:

    • 是的。这是我对“配置文件”的问题之一,因为您必须根据环境重新构建代码(重新构建 docker 映像),而不是“提升”docker-image。 docker 的微妙优势之一是(例如)您可以推广 EXACT 图像。如果 Q.A. (质量保证)在 docker 镜像上“签名”,它可以是您在登台和生产中使用的 EXACT 镜像。这也是秘密值的问题(此处的数据库连接字符串的密码)。我个人不会将该秘密值保存在环境变量中。 docker 的一个不错的选择(嗯,...)
    • 好吧,docker 和 kubernetes...是使用 kubernetes “秘密卷挂载”。您基本上向 kubernetes“引擎”添加了一个秘密,然后,您获取这个秘密并将其挂载为一个特殊的 ram-in-memory-only“东西”,它以纯文本文件的形式出现在系统中。这是保存所有秘密的好地方,或者至少是“密钥零”(您用作解密值的密钥的值)。但是感谢(patrick)指出配置文件和 docker/container 世界的这个问题。
    【解决方案3】:

    此外,您可以使用 spring config service 。 Config-service 是所有属性的中心位置(可以更安全),并且只需极少的配置/更改,您的 spring-boot 应用程序就可以从 config-service 读取属性。

    【讨论】:

      【解决方案4】:

      您应该将您的数据库参数作为环境变量提供,然后在您的application.properties 中将它们设置为placeholders。例如:

      spring.datasource.url=${DATASOURCE_URL}
      

      其中 DATASOURCE_URL 是环境之一。变量。

      在您的 IDE 中,您在项目设置中设置它们 (for example)

      因此,在您的工作中,您在 IDE 中设置本地参数,并在生产机器上将 prod 参数设置为环境变量。

      【讨论】:

        猜你喜欢
        • 2018-06-14
        • 1970-01-01
        • 2013-12-01
        • 2021-09-24
        • 2021-07-28
        • 2016-01-17
        • 2015-01-26
        相关资源
        最近更新 更多