簡體   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