如何配置Spring Boot数据源部分以在生产中使用?

4

我正在写我的第一个"真正的"应用程序,这是我第一份工作。我可以使用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

就是这样了!那么,我需要做些什么才能让我的应用程序准备好上线呢?连接池和其他一些东西怎么办呢?(我对所有的数据源配置都不太熟悉)提前感谢您的帮助!


1
小心使用 spring.jpa.hibernate.ddl-auto = update,它并不适合生产环境。请使用 Flyway 或 Liquidbase。 - syncdk
4个回答

4
所以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 vs其他)和您的后备数据库(看起来像Postgres)。我建议您查看Spring Boot与Tomcat JDBC的使用,这样您就可以在Spring的环境变量中配置一些类似于最大连接池等的内容。


是的。这一直是我对“配置文件”的问题之一,因为您必须针对每个环境重新构建代码(重新构建Docker镜像),而不是“推广”Docker镜像。 Docker的一个微妙优势是,例如,您可以推广确切的镜像。如果Q.A.(质量保证)对Docker镜像进行“签名”,则它可以是您在暂存和生产中使用的确切镜像。还有秘密值的问题(此处为数据库连接字符串的密码)。我个人不会将该秘密值保存在环境变量中。 Docker的一个好选择(嗯,...) - granadaCoder
好的,Docker和Kubernetes...的解决方法是使用Kubernetes的“secret volume mounts”。你基本上将一个秘密添加到Kubernetes的“引擎”中,然后稍后,你会将这个秘密作为一种特殊的RAM内存中的“东西”挂载,它在系统中显示为一个纯文本文件。这是保存所有秘密的好地方,或者至少是“零号键”(用作解密值的键值)。但感谢(Patrick)指出了与配置文件和Docker/容器世界相关的问题。 - granadaCoder

1
你应该利用SpringBoot配置文件,这将允许你根据属性定义开发、测试、生产和其他任何环境的不同配置。

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

一个配置文件可以通过定义应用程序部署的位置属性来控制加载哪个配置。
关于数据连接池的问题取决于您所选择的后端数据存储和该存储的设置方式。一般来说,在生产环境中,您应该使用某种类型的连接池,但具体使用多少和什么类型取决于您的实现。

0

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

spring.datasource.url=${DATASOURCE_URL}

DATASOURCE_URL 是环境变量之一。

在您的 IDE 中,您可以在项目设置中设置它们(例如 此处)。

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


0
此外,您还可以使用Spring配置服务。Config-service是所有属性的中央位置(可以更安全),通过非常少量的配置/更改,您的Spring Boot应用程序就可以从config-service读取属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接