如何使用 Spring Boot 将使用 Postgresql 的 Spring 应用程序部署到 Heroku?
-
21-12-2019 - |
题
我正在 Heroku 上评估 Spring 4,到目前为止,我对两者都印象深刻。
但是,我在让 Spring Boot 应用程序在 Heroku 上运行时遇到问题。一切工作正常,除了 Postgresql (我刚刚得到 Connection Refused
错误)。
问题肯定与我如何设置有关 DataSource
但到目前为止,我只是在遵循尝试和错误的方法!我不太确定应该如何从 Heroku 设置数据源 DATABASE_URL
我找不到任何例子。
我已经发现 春云 偶然在谷歌上搜索,看起来很有希望,但它没有解释任何关于 DATABASE_URL
. 。另外,Spring.IO 上甚至没有提到它,所以我想知道它是否是生产使用的一个选项?
解决方案
Spring Cloud 是一个不错的选择。我不知道为什么它没有在 spring.io 中列出 - 它应该是,也许它还没有完全脱离孵化或其他什么,但我已经成功地使用了它。如果你不喜欢使用它,我想你可以设置 spring.datasource.url
Heroku 在其环境变量中给你的值。
其他提示
您可以使用 配置变量 可以在 Heroku 应用程序的设置选项卡中进行配置。配置变量将作为环境变量公开给您的应用程序。由于 Spring Boot 可以将环境变量映射到应用程序属性,因此您只需设置:
SPRING_DATASOURCE_URL
SPRING_DATASOURCE_USER
SPRING_DATASOURCE_PASSWORD
SPRING_DATASOURCE_DRIVER-CLASS-NAME
它们将被映射到:
spring.datasource.url
spring.datasource.user
spring.datasource.password
spring.datasource.driver-class-name
现在您所要做的就是提取相关值。完整的数据库配置可以在以下位置检查 Heroku Postgres 管理面板. 。选择您要连接的数据库,您将看到以下值 SPRING_DATASOURCE_USER
和 SPRING_DATASOURCE_PASSWORD
马上。这 SPRING_DATASOURCE_URL
必须这样构造:
jdbc:postgresql://<Host>:<Port>/<Database>
在哪里 <Host>
, <Port>
和 <Database>
必须替换为数据库连接页面中的相应值。最后但并非最不重要的 SPRING_DATASOURCE_DRIVER-CLASS-NAME
必须设置为 org.postgresql.Driver
.
这样您就可以使用 Spring Boot 的内置功能,而不是向应用程序添加特定于环境的配置。但请注意,Spring Boot 有一个特定的 读取外部配置的顺序. 。所以你必须确保没有
- 命令行参数(通过 过程文件)
- 来自 java:comp/env 的 JNDI 属性(不知道这些属性在 Heroku 中可能来自哪里。)
- Java 系统属性(也可以通过 Procfile 传递
-D
论据)
因为这些会覆盖操作系统环境变量。
在与此问题斗争了一段时间后,我想补充一件事——仅创建一个配置对象对于 Heroku 来说是不够的,即使使用 Spring Cloud 连接器也是如此。您还必须显式声明云配置文件(-Dspring.profiles.active=cloud
) 在您的应用程序 Procfile 中。
除了 DATABASE_URL
, ,它始终存在,Heroku 在运行时创建 3 个环境变量。他们是:
JDBC_DATABASE_URL
JDBC_DATABASE_USERNAME
JDBC_DATABASE_PASSWORD
如您所知,Spring Boot 如果发现,将自动配置您的数据库 spring.datasource.*
您的属性 application.properties
文件。这是我的 application.properties 的示例
spring.datasource.url=${JDBC_DATABASE_URL}
spring.datasource.username=${JDBC_DATABASE_USERNAME}
spring.datasource.password=${JDBC_DATABASE_PASSWORD}
spring.jpa.show-sql=false
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
Hibernate/Postgres 依赖项
就我而言,我使用 Hibernate(捆绑在 spring-boot-starter-jpa
与 PostgreSQL,所以我需要在我的 build.gradle
:
dependencies {
compile("org.springframework.boot:spring-boot-starter-data-jpa")
compile('org.postgresql:postgresql:9.4.1212')
}
如果我没记错的话,我遇到了同样的问题,并通读了 Heroku Postgres 文档,我发现我需要为 DataSource 指定两个额外的连接属性。
我必须配置以下属性:
- ssl=真
- sslfactory=org.postgresql.ssl.NonValidatingFactory
下面是一个 DataSource bean 的示例:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${database.driverClassName}" />
<property name="url" value="${database.url}" />
<property name="username" value="${database.username}" />
<property name="password" value="${database.password}" />
<property name="connectionProperties" value="ssl=true;sslfactory=org.postgresql.ssl.NonValidatingFactory"/>
</bean>
你当然需要添加一个 PostgreSQL 库依赖。