Spring Boot Anwendungen bei Heroku deployen

1 Kommentar

Spring Boot ist ein Projekt, welches im Kontext von Microservice Architekturen in aller Munde ist. Aber die Implementierung von Services ist nur eine Seite der Medaille. Die Vorteile einer Microservice Architektur lassen sich jedoch nur dann wirklich nutzen, wenn Organisationen den DevOps Gedanke leben und zwischen dem Commiten einer Änderung bis zum Deployment nur wenige Minuten liegen. In diese Kerbe schlagen Anbieter wie Heroku – ein Cloud Platform as a Service (PaaS) Dienst. In diesem Blogpost möchte ich zeigen, wie man eine Spring Boot Anwendung von GitHub direkt nach Heroku deployen und dabei die von Heroku bereitgestelle Postgres Datenbank verwenden kann.

Die spring-boot-heroku-demo Anwendung

Um das Deployment einer Spring Boot Anwendung nach Heroku zu veranschaulichen, habe ich eine sehr einfache Demo Anwendung implementiert. Der Code ist auf meinem GitHub Account verfügbar. Die Anwendung verwendet Spring Data JPA um alle Einträge in einer einzigen Datenbank Tabelle zu lesen und gibt dem Nutzer die Möglichkeit neue Einträge hinzuzufügen. Die Demo Anwendung ist bei Heroku deployt und kann unter spring-boot-heroku-demo.herokuapp.com ausprobiert werden (da ich nur den Free Plan verwende, kann es vorkommen, dass es einige Zeit dauert, bis die Anwendung beim ersten Aufruf reagiert). Der Rest des Blogbeitrags zeigt, wie man seinen eigenen Fork der Anwendung auf dem eigenen Heroku Account deployen kann.

Erzeugen einer neuen Heroku Application

Zunächst muss über das Heroku Dashboard eine neue Application angelegt werden. Dazu muss lediglich ein Name sowie eine Region in der die Anwendung deployt werden soll, angegeben werden.

Neue Anwendung anlegen Dialog bei Heroku

Anlegen einer neuen Application in der Region Europe

Heroku benötigt Informationen darüber, was deployt werden soll. Dies kann über den „Deploy“ Tab in der Application Konfiguration eingestellt werden. Die einfachste Variante für das Deployment ist die Integration mit GitHub. Es gibt jedoch auch genug Dokumentation, welche beschreibt wie von anderen Quellen nach Heroku deployt werden kann. Für dieses Beispiel werden wir einfach einen Fork von der Demo Anwendung bei GitHub anlegen.

Heroku mit einem GitHub Repository verbinden

Nachdem die GitHub Integration bei Heroku aktiviert ist, kann die Heroku Application mit dem Fork bei GitHub Repository verbunden werden. Des Weiteren kann ausgewählt werden welcher Branch deployt werden soll, ob automatisch oder manuell deployt werden soll, ob ein CI Build abgewartet werden soll und ob spezielle Deployments für das Review von Pull Requests durchgeführt werden sollen. Für dieses Beispiel aktivieren wir nur automatische Deployments vom master Branch.

Verbinden einer Heroku Application mit GitHub

Verbinden einer Heroku Application mit einem GitHub Repository

Nachdem das Heroku mit dem GitHub Repository verbunden wurde, kann über den „Deploy Branch“ Button ein manuelles Deployment ausgelöst werden. Nachdem der Build Prozess durchgelaufen ist, kann die Anwendung bereits online betrachtet werden unter http://<Name-der-App>.herokuapp.com/.

Konfigurieren der Datenbank Verbindung zu Heroku’s Postgres Databank

Nach dem initialen Deployment erkennt Spring Boot automatisch welcher Datenspeicher verwenden werden soll. Da wir keine weitere Konfiguration vorgenommen haben, wird eine In-Memory HyperSQL verwendet. Dies ist so in der pom.xml des Projekts definiert. Aus diesem Grund sind alle Daten nach dem nächsten Deployment verloren. Um Daten wirklich zu persistieren, muss die Anwendung mit einer „echten“ Datenbank verbunden werden, welche die Daten über einen Neustart der Anwendung hinweg speichert. Heroku legt für jede Application automatisch eine Postgres Datenbank an. Diese werden wir nutzen um unsere Daten zu speichern. Alle bereits vorhandenen Datenbanken können in der Datenbank übersicht betrachtet werden.

Zur Konfiguration der Datenbankverbindung machen wir uns Spring Boots Fähigkeit zu nutze, Umgebungsvariablen in Konfigurations-properties zu übersetzen. Unsere Anwendung benötigt die folgenden Properties:

spring.datasource.url
spring.datasource.user
spring.datasource.password
spring.datasource.driver-class-name
spring.jpa.database-platform

Außerdem sollte spring.jpa.hibernate.ddl-auto=update gesetzt werden, damit sich Hibernate um das Erzeugen und Aktualisieren der Datenbank kümmert. Wenn Properties in Form von Umgebungsvariablen für Spring Boot definiert werden, müssen diese in Snake Case definiert werden. Übersetzt man die oberen Property Namen in Umgebungsvariablennamen so erhält man:

SPRING_DATASOURCE_URL
SPRING_DATASOURCE_USER
SPRING_DATASOURCE_PASSWORD
SPRING_DATASOURCE_DIRVER-CLASS-NAME

SPRING_JPA_HIBERNATE_DDL-AUTO
SPRING_JPA_DATABASE-PLATFORM

Umgebungsvariablen können bei Heroku im Settings Tab der Application gesetzt werden. Die relevanten Werte für die Datenbankverbindung können aus der Detail Ansicht der Datenbank entnommen werden.

Verbindungsdetails einer Heroku Postgres Datenbank

Verbindungsdetails einer Heroku Postgres Datenbank

Die folgenden Config Vars müssen nun der Heroku Application hinzugefügt werden:

SPRING_DATASOURCE_URL=jdbc:postgresql://<Host>:<Port>/<Database>
SPRING_DATASOURCE_USER=<User>
SPRING_DATASOURCE_PASSWORD=<Password>
SPRING_DATASOURCE_DIRVER-CLASS-NAME=org.postgresql.Driver
SPRING_JPA_HIBERNATE_DDL-AUTO=update
SPRING_JPA_DATABASE-PLATFORM=org.hibernate.dialect.PostgreSQLDialect

wobei <Host>, <Port>, <Database>, <User> und <Password> den Datenbankdetails entnommen werden können. Das ist alles. Nachdem die Anwendung erneut deployt wurde, wird sie die persistente Postgres Datenbank von Heroku verwenden und Daten gehen mehr verloren.

Benedikt Ritter arbeitet seit September 2013 als Software Craftsman bei der codecentric AG. Sein Können bringt er nicht nur in der Berufswelt zum Einsatz: Benedikt ist Member der Apache Software Foundation und Committer beim Apache Commons Projekt.

Share on FacebookGoogle+Share on LinkedInTweet about this on TwitterShare on RedditDigg thisShare on StumbleUpon

Kommentare

  • Die DB-Konfiguration sollte besser über die von Heroku automatisch bereitgestellten Umgebungsvariablen konfiguriert werden (zudem können sich diese ändern).

    spring:
    datasource:
    url: ${JDBC_DATABASE_URL}
    username: ${JDBC_DATABASE_USERNAME}
    password: ${JDBC_DATABASE_PASSWORD}

Kommentieren

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.