Как развернуть приложение Spring с помощью Postgresql в Heroku с помощью Spring Boot?

Я оцениваю Spring 4 на Heroku, и я до сих пор очень впечатлен обоими.

однако у меня возникли проблемы с запуском приложения Spring Boot на Heroku. Все работает нормально, кроме Postgresql (я просто получаю Connection Refused ошибки).

проблема, безусловно, будет связана с тем, как я настраиваю DataSource но до сих пор я просто следовал методу проб и ошибок! Я не совсем уверен, как я должен настроить источник данных в Heroku DATABASE_URL и я не могу найти никаких примеров.

Я нашел весна-облако случайно путем поиска в Google, который выглядит многообещающим, но ничего не объясняет о DATABASE_URL. Кроме того, он даже не упоминается весной.IO поэтому мне интересно, является ли это даже вариантом для использования в производстве?

5 ответов


Spring Cloud-хороший вариант. Не знаю, почему его нет в списке весной.io-это должно быть, может быть, он еще не совсем вышел из инкубации или что-то еще, но я использовал его успешно. Если вам не нравится использовать это, я думаю, вы можете просто установить spring.datasource.url к значению Heroku дает вам в своем env var.


можно использовать Config Vars который можно настроить на вкладке "Настройки" вашего приложения в Heroku. Конфигурационные 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_USER и SPRING_DATASOURCE_PASSWORD сразу. The SPRING_DATASOURCE_URL должен быть построен следующим образом:

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

здесь <Host>, <Port> и <Database>должны быть заменены соответствующими значениями со страницы подключения к базе данных. Последнее, но не менее SPRING_DATASOURCE_DRIVER-CLASS-NAME должна быть org.postgresql.Driver.

таким образом, вы можете использовать создайте функциональность Spring Boot вместо добавления конфигурации среды в приложение. Обратите внимание, однако, что Spring Boot имеет определенный порядок чтения внешней конфигурации. Поэтому вы должны убедиться, что нет

  • аргументы командной строки (передаются через Procfile, для)
  • атрибуты JNDI из java: comp/env (не знаю, откуда они могут поступать в Heroku.)
  • Система Java свойства (также могут быть переданы через Procfile как -D аргументов)

поскольку они будут переопределять переменные среды ОС.


одна вещь, которую я хотел бы добавить после борьбы с этим некоторое время-просто создание объекта конфигурации недостаточно с Heroku, даже с соединителями spring cloud. Вы также должны явно объявить профиль облака (-Dspring.profiles.active=cloud) в вашем Procfile приложения.


Если я правильно помню, у меня была та же проблема и чтение документации Heroku Postgres я обнаружил, что мне нужно указать два дополнительных свойства соединения для источника данных.

мне пришлось настроить следующие свойства:

  • ssl=true
  • sslfactory=org.в PostgreSQL.использование SSL.NonValidatingFactory

вот пример компонента источника данных:

   <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 зависимость от библиотеки.


помимо DATABASE_URL, который всегда есть, Heroku создает 3 переменные среды во время выполнения. Они:

JDBC_DATABASE_URL
JDBC_DATABASE_USERNAME
JDBC_DATABASE_PASSWORD

как вы знаете, Spring Boot автоматически настроит вашу базу данных, если она найдет spring.datasource.* свойства . Вот пример моего приложения.свойства

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, поэтому мне нужно правильные зависимости в my build.gradle:

dependencies {
    compile("org.springframework.boot:spring-boot-starter-data-jpa")
    compile('org.postgresql:postgresql:9.4.1212')
}