Spring Boot를 사용하여 Postgresql을 사용하여 Heroku에 Spring 앱을 배포하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com//questions/23041164

문제

나는 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 라이브러리 종속성을 추가해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top