Spring Boot를 사용하여 Postgresql을 사용하여 Heroku에 Spring 앱을 배포하는 방법은 무엇입니까?
-
21-12-2019 - |
문제
나는 Heroku에서 Spring 4를 평가하고 있으며 지금까지 두 가지 모두에 매우 깊은 인상을 받았습니다.
그러나 Spring Boot 앱을 Heroku에서 실행하는 데 문제가 있습니다.PostgreSQL을 제외한 모든 것이 잘 작동합니다. Connection Refused
오류).
문제는 확실히 내가 설정하는 방법과 관련이 있습니다. DataSource
하지만 지금까지 저는 시행착오 방식을 따라왔습니다!Heroku에서 데이터 소스를 어떻게 설정해야 하는지 잘 모르겠습니다. DATABASE_URL
어떤 예도 찾을 수 없습니다.
나는 발견했다 봄구름 우연히 Google에서 검색해 보니 유망해 보이지만 이에 대해 아무 것도 설명하지 않습니다. DATABASE_URL
.그리고 Spring.IO에는 언급도 안되어 있는데 프로덕션 용도로 사용할 수 있는 옵션인지 궁금합니다.
해결책
Spring Cloud는 좋은 선택입니다.spring.io에 왜 등재되지 않았는지 모르겠습니다. 아마도 아직 인큐베이션이 완전히 끝나지 않았을 수도 있지만 성공적으로 사용했습니다.이 기능을 사용하는 것이 마음에 들지 않으면 그냥 설정해도 될 것 같습니다. spring.datasource.url
Heroku가 env var에서 제공하는 가치에.
다른 팁
당신이 사용할 수있는 구성 변수 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 포스트그레스 관리 패널.연결하려는 데이터베이스를 선택하면 해당 값이 표시됩니다. 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에는 특정 외부 구성을 읽는 순서.그래서 없는지 확인해야합니다
- 명령줄 인수(다음을 통해 전달됨) 프로필)
- java:comp/env의 JNDI 속성(Heroku에서 해당 속성이 어디서 나오는지 알 수 없음)
- Java 시스템 속성(Procfile을 통해 다음과 같이 전달될 수도 있음)
-D
인수)
이는 OS 환경 변수를 재정의하기 때문입니다.
한동안 이 문제로 어려움을 겪은 후 추가하고 싶은 한 가지 - Spring Cloud 커넥터를 사용하더라도 Heroku에서는 구성 개체를 만드는 것만으로는 충분하지 않습니다.또한 클라우드 프로필(-Dspring.profiles.active=cloud
) 애플리케이션 프로필에 있습니다.
와는 별개로 DATABASE_URL
, 항상 존재하는 Heroku는 런타임에 3개의 환경 변수를 생성합니다.그들은:
JDBC_DATABASE_URL
JDBC_DATABASE_USERNAME
JDBC_DATABASE_PASSWORD
아시다시피 Spring Boot는 데이터베이스를 찾으면 자동으로 데이터베이스를 구성합니다. spring.datasource.*
당신의 속성 application.properties
파일.다음은 내 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
최대 절전 모드/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 문서를 통해 읽는 것이 었습니다. DataSource에 대한 두 가지 추가 연결 속성을 지정해야한다는 것을 알았습니다.
다음 속성을 구성해야했습니다.
- 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 라이브러리 종속성을 추가해야합니다.