كيف أقوم بنشر تطبيق Spring باستخدام Postgresql إلى Heroku باستخدام Spring Boot؟

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

سؤال

أقوم بتقييم Spring 4 على Heroku وأنا معجب جدًا بكليهما حتى الآن.

ومع ذلك، أواجه مشكلة في تشغيل تطبيق Spring Boot على Heroku.كل شيء يعمل بشكل جيد، باستثناء Postgresql (لقد حصلت للتو على Connection Refused الأخطاء).

ستكون المشكلة بالتأكيد تتعلق بكيفية إعداد DataSource لكن حتى الآن كنت أتبع نهج التجربة والخطأ!لست متأكدًا تمامًا من الطريقة التي من المفترض أن أقوم بها بإعداد مصدر البيانات من Heroku DATABASE_URL ولا أستطيع العثور على أي أمثلة.

لقد وجدت سحابة الربيع بالصدفة من خلال البحث في جوجل والذي يبدو واعدًا ولكنه لا يوضح أي شيء عن DATABASE_URL.أيضًا، لم يتم ذكره حتى في Spring.IO لذا أتساءل عما إذا كان خيارًا للاستخدام في الإنتاج؟

هل كانت مفيدة؟

المحلول

يعد Spring Cloud خيارًا جيدًا.لا أعرف سبب عدم إدراجه في Spring.io - ينبغي أن يكون كذلك، ربما لم يخرج من الحضانة بعد أو شيء من هذا القبيل، لكنني استخدمته بنجاح.إذا كنت لا تحب استخدام ذلك، فأعتقد أنه يمكنك على الأرجح تعيين spring.datasource.url إلى القيمة التي يوفرها لك Heroku في env var.

نصائح أخرى

يمكنك استخدام فار التكوين والتي يمكن تهيئتها في علامة تبويب الإعدادات في تطبيقك في Heroku.سيتم عرض Config 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 فورا.ال 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 as -D الحجج)

لأن تلك من شأنها أن تتجاوز متغيرات بيئة نظام التشغيل.

شيء واحد أود إضافته بعد معاناتي مع هذا لفترة من الوقت - مجرد إنشاء كائن تكوين لا يكفي مع Heroku، حتى مع موصلات السحابة الربيعية.يجب عليك أيضًا الإعلان بوضوح عن ملف التعريف السحابي (-Dspring.profiles.active=cloud) في تطبيقك Procfile.

بعيدا 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

فيما يلي مثال لفاصوليا 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 تبعية المكتبة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top