繁体   English   中英

如何使用Spring Boot使用Postgresql将Spring应用程序部署到Heroku?

[英]How to do I deploy a Spring app using Postgresql to Heroku using Spring Boot?

我正在评估Heroku上的Spring 4,到目前为止我对两者都印象深刻。

但是,我无法让我的Spring Boot应用程序在Heroku上运行。 一切都运行正常,除了Postgresql(我只是得到Connection Refused错误)。

问题肯定与我如何设置DataSource但到目前为止我一直在遵循试错法! 我不确定我应该如何从Heroku DATABASE_URL设置数据源,我找不到任何示例。

我发现弹簧云偶然通过搜索谷歌看起来很有前途,但它并没有解释有关的任何事情DATABASE_URL 另外,它甚至没有在Spring.IO上提及,所以我想知道它是否甚至是生产使用的选项?

您可以使用配置瓦尔可以在你的Heroku在应用程序的设置选项卡中进行配置。 Config Vars将作为环境变量公开给您的应用程序。 由于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_USERSPRING_DATASOURCE_PASSWORD的值。 SPRING_DATASOURCE_URL必须像这样构造:

jdbc:postgresql://<Host>:<Port>/<Database>

其中<Host><Port><Database>必须替换为<Database>连接页面中的相应值。 最后但并非最不重要的是, SPRING_DATASOURCE_DRIVER-CLASS-NAME必须设置为org.postgresql.Driver

这样,您可以使用Spring Boot的内置功能,而不是为应用程序添加特定于环境的配置。 但请注意,Spring Boot具有读取外部配置的特定顺序 所以你必须确保没有

  • 命令行参数(通过Procfile传递)
  • 来自java:comp / env的JNDI属性(不知道Heroku中可能来自哪里。)
  • Java系统属性(也可以通过Procfile作为-D参数传递)

因为那些会覆盖OS环境变量。

有一点我想在这个问题上挣扎一段时间之后 - 仅仅使用Heroku来创建一个配置对象是不够的,即使使用Spring云连接器也是如此。 您还必须在应用程序Procfile中明确声明云配置文件( -Dspring.profiles.active=cloud )。

除了始终存在的DATABASE_URL之外,Heroku还在运行时创建了3个环境变量。 他们是:

JDBC_DATABASE_URL
JDBC_DATABASE_USERNAME
JDBC_DATABASE_PASSWORD

您可能知道,如果在您的application.properties文件中找到spring.datasource.*属性,Spring Boot将自动配置您的数据库。 这是我的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使用正确的依赖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库依赖项。

Spring Cloud是一个不错的选择。 我不知道为什么它没有在spring.io中列出 - 它应该是,也许它还没有完全没有孵化还是什么,但我已成功使用它。 如果您不喜欢使用它,我认为您可以将spring.datasource.url设置为Heroku在其env var中为您提供的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM