Как развернуть приложение Spring с помощью Postgresql в Heroku с помощью Spring Boot?
-
21-12-2019 - |
Вопрос
Я оцениваю Spring 4 на Heroku и пока очень впечатлен обоими.
Однако у меня возникли проблемы с запуском приложения Spring Boot на Heroku.Все работает нормально, кроме Postgresql (я просто получаю Connection Refused
ошибки).
Проблема наверняка будет связана с тем, как я настраиваю DataSource
но до сих пор я просто следовал методу проб и ошибок!Я не совсем уверен, как мне настроить источник данных из Heroku. DATABASE_URL
и я не могу найти примеров.
я нашел весеннее облако случайно, выполнив поиск в Google, который выглядит многообещающе, но ничего не объясняет о DATABASE_URL
.Кроме того, он даже не упоминается в Spring.IO, поэтому мне интересно, возможен ли вообще этот вариант для промышленного использования?
Решение
Весеннее облако — хороший вариант.Я не знаю, почему он не указан в 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 имеет особую порядок чтения внешней конфигурации.Поэтому вы должны убедиться, что их нет.
- Аргументы командной строки (передаваемые через Прокфайл)
- Атрибуты JNDI из java:comp/env (не знаю, откуда они могут взяться в 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
файл.Вот пример моего приложения.свойства
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, я обнаружил, что мне нужно указать два дополнительных свойства подключения для источника данных.
Мне пришлось настроить следующие свойства:
- SSL=истина
- sslfactory=org.postgresql.ssl.NonValidatingFactory
Вот пример bean-компонента DataSource:
<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 зависимость от библиотеки.