Java >> Java Tutorial >  >> Tag >> Spring

Bereitstellen der Spring Boot-Anwendung für Heroku

Heroku ist eine Plattform als Service (PAAS), die Entwicklern hilft, Anwendungen auf einer Cloud-Plattform zu erstellen, bereitzustellen und auszuführen. Die Bereitstellung der Spring Boot-Anwendung für Heroku ist ein unkomplizierter Prozess. Diesen Vorgang beschreibe ich in diesem Beitrag. Es gibt tatsächlich mehrere Möglichkeiten, eine Spring-Boot-Anwendung bereitzustellen. Der einfachste Weg, die Anwendung bereitzustellen, besteht darin, eine von Maven erstellte JAR-Datei zu verwenden und diese JAR-Datei auf dem Heroku-Server auszuführen.

In meinem vorherigen Beitrag habe ich gezeigt, wie Sie Spring Session in Ihrer Spring Boot-Anwendung verwenden.

Bevor ich eine dieser beiden Methoden zum Bereitstellen der Anwendung zeige, gehen wir davon aus, dass Sie ein Konto auf Heroku.com erstellt haben. Wenn nicht, erstellen Sie zuerst ein Konto und laden Sie Heroku-CLI herunter (Befehlszeilenschnittstelle). Ich gehe auch davon aus, dass Sie git heruntergeladen und installiert haben.

Erste Bereitstellung mit Heroku

Nachdem Sie das Heroku-Konto und die Befehlszeilenschnittstelle heruntergeladen haben, beginnen wir mit der Bereitstellung der Spring Boot-App mit Repository.

Erstellen Sie ein Anwendungsverzeichnis in Ihrer Entwicklungsumgebung.


git init
git add .
git commit -m "first commit"

Jetzt können Sie entweder eine App in Heroku über die Webschnittstelle ODER über die Heroku-Befehlszeilenschnittstelle erstellen.

heroku create rentersfeedback würde die Anwendung in Heroku erstellen.

Als Teil dieses Beitrags stelle ich eine Alpha-Version meiner Anwendung rentersfeedback.com bereit

Sobald Sie den Quellcode im Verzeichnis hinzugefügt haben, können wir das Repository nach heroku pushen. Jedes Mal, wenn Sie das Repository an Heroku übertragen, erstellt der Builder von Heroku die Anwendung und startet sie.

git push heroku master

Trotz dieses anfänglichen Vorstoßes ist die Anwendung noch nicht einsatzbereit.

Datenbankkonfiguration

Für diese Anwendung verwende ich Postgres Datenbank. Heroku bietet mehrere Möglichkeiten, eine Datenbank als Add-On hinzuzufügen.

Sobald die Postgres-Datenbank hinzugefügt wurde, gehen Sie zu settings -> view credentials Dadurch erhalten wir Datenbank-Anmeldeinformationen.

Jetzt können wir über pgAdmin Postgres Administration auf den Datenbankserver zugreifen und Datenbanken und Datenbanktabellen für unsere Anwendung erstellen.

Zurück in der Heroku-Weboberfläche, wenn Sie zur Anwendung settings gehen Seite, klicken Sie auf reveal Config Vars und richten Sie die folgenden Variablen ein


SPRING_DATASOURCE_URL= 
SPRING_DATASOURCE_USERNAME= 
SPRING_DATASOURCE_PASSWORD= 
SPRING_DATASOURCE_DRIVER-CLASS-NAME=org.postgresql.Driver 
SPRING_DATASOURCE_TYPE=org.apache.tomcat.jdbc.pool.DataSource 
SPRING_JPA_DATABASE-PLATFORM=org.hibernate.dialect.PostgreSQLDialect

Wie Sie sehen können, verwenden wir den Datenquellentyp als Tomcat-JDBC-Pool und nicht den Standard hikariCP die Spring Boot bietet. Um sicherzustellen, dass dies funktioniert, müssen wir eine Abhängigkeit von tomcat-jdbc hinzufügen wie folgt:


compile('org.apache.tomcat:tomcat-jdbc:9.0.29') 
compile('org.postgresql:postgresql:42.2.8')

Wenn Sie den Datenquellentyp nicht als tomcat-jdbc angeben , gibt Heroku einen Fehler für Postgres aus Datenbank wie folgt:

Caused by: java.lang.RuntimeException: Driver org.postgresql.Driver claims to not accept jdbcUrl

Dadurch wird unsere Spring Boot-App dazu gebracht, mit der Postgres-Datenbank zu arbeiten, während sie auf Heroku bereitgestellt wird.

Konfiguration von Gradle zum Erstellen einer JAR-Datei

Daher unterstützt Heroku standardmäßig Maven. Wenn Sie Gradle zum Erstellen Ihrer Anwendung verwenden möchten, können Sie die folgenden Richtlinien verwenden.

Wenn Sie diese Änderungen nun an heroku übertragen und die Anwendung erstellen, gibt die Anwendung beim Start den folgenden Fehler aus



2019-11-30T17:05:46.096985+00:00 heroku[api]: Deploy 291326d by [email protected] 
2019-11-30T17:05:46.097021+00:00 heroku[api]: Release v9 created by [email protected] 
2019-11-30T17:05:46.378258+00:00 heroku[slug-compiler]: Slug compilation started 
2019-11-30T17:05:46.378269+00:00 heroku[slug-compiler]: Slug compilation finished 
2019-11-30T17:05:46.755655+00:00 heroku[web.1]: State changed from crashed to starting 
2019-11-30T17:05:53.121398+00:00 heroku[web.1]: Starting process with command `java -Dserver.port=5000 -jar build/libs/myapp.jar` 
2019-11-30T17:05:54.260741+00:00 app[web.1]: Error: Unable to access jarfile build/libs/myapp.jar 
2019-11-30T17:05:54.784064+00:00 heroku[web.1]: State changed from starting to crashed 
2019-11-30T17:05:54.773714+00:00 heroku[web.1]: Process exited with status 1


Um dieses Problem zu lösen, füge ich meinem Gradle-Skript eine Aufgabe hinzu, die eine JAR-Datei erstellt, wenn ich die Anwendung bereitstelle.


apply plugin: 'java' 

task stage(type: Copy, dependsOn: [clean, build]) { 
    from jar.archivePath into project.rootDir rename { 'app.jar' } 
} 

stage.mustRunAfter(clean) 

clean.doLast { 
   project.file('app.jar').delete() 
}

application.properties einrichten

Wir haben unsere Anwendung bereitgestellt, die Datenbank konfiguriert und das Skript erstellt. Wenn die Spring Boot-Anwendung startet, greift sie normalerweise auf alle erforderlichen Variablen von application.properties zu . Also werde ich diese Datei wie folgt einrichten:



# ==================================================================================== 
# = DATASOURCE 
# ==================================================================================== 
spring.datasource.url=${SPRING_DATASOURCE_URL} 
spring.datasource.username = ${SPRING_DATASOURCE_USERNAME} 
spring.datasource.password=${SPRING_DATASOURCE_PASSWORD} 
spring.datasource.driver-class-name=${SPRING_DATASOURCE_DRIVER-CLASS-NAME} 
spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect = ${SPRING_JPA_DATABASE-PLATFORM} 
spring.datasource.type=${SPRING_DATASOURCE_TYPE} 
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true 
# ==================================================================================== 
# = Server SSL 
# ==================================================================================== 
server.port = 7443 
security.require-ssl=true


Einrichten einer benutzerdefinierten Domain

Heroku bietet mit SSL eine einfache Option. Wenn Sie sich also dafür entscheiden, ist es mit Let’s encrypt ein einfacher Ansatz, das SSL-Zertifikat automatisch zu verwalten.

Um nun die benutzerdefinierte Domäne einzurichten, fügen Sie Ihre Domäne hinzu und heroku stellt den Ziel-DNS-Server bereit. Für Ihren entsprechenden Domänenanbieter fügen Sie die DNS-Einstellung für CNAME (für www) und ANAME (Stammdomäne) hinzu. Warten Sie einige Stunden, bis diese Einstellung vorgenommen wird.

Auf die Anwendung zugreifen

Wir können jetzt auf die Anwendung zugreifen. Sobald Sie alle erforderlichen Änderungen an das Heroku-Repository übertragen haben, erstellt Heroku die Anwendung und startet sie.

Wenn wir jetzt auf rentersfeedback.com zugreifen, können wir die Anwendung wie folgt sehen:

Mieter-Feedback

Referenzen

  1. Bereitstellen der Spring-Boot-Anwendung für Heroku – Spring-Boot-App bereitstellen
  2. Bereitstellen der Gradle-Anwendung in Heroku – Gradle-Anwendungen in Heroku
  3. Benutzerdefinierte Domänen in Heroku – Benutzerdefinierte Domänen in Heroku


Java-Tag