Как развернуть приложение 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')
}