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.
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 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.
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://.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.username
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_USERNAME
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.
Die folgenden Config Vars müssen nun der Heroku Application hinzugefügt werden:
SPRING_DATASOURCE_URL=jdbc:postgresql://<Host>:<Port>/<Database>
SPRING_DATASOURCE_USERNAME=<User>
SPRING_DATASOURCE_PASSWORD=<Password>
SPRING_DATASOURCE_DRIVER-CLASS-NAME=org.postgresql.Driver
SPRING_JPA_HIBERNATE_DDL-AUTO=update
SPRING_JPA_DATABASE-PLATFORM=org.hibernate.dialect.PostgreSQLDialect
wobei , , , und 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 nicht mehr verloren.
Weitere Beiträge
von Benedikt Ritter
Dein Job bei codecentric?
Jobs
Agile Developer und Consultant (w/d/m)
Alle Standorte
Weitere Artikel in diesem Themenbereich
Entdecke spannende weiterführende Themen und lass dich von der codecentric Welt inspirieren.
Gemeinsam bessere Projekte umsetzen.
Wir helfen deinem Unternehmen.
Du stehst vor einer großen IT-Herausforderung? Wir sorgen für eine maßgeschneiderte Unterstützung. Informiere dich jetzt.
Hilf uns, noch besser zu werden.
Wir sind immer auf der Suche nach neuen Talenten. Auch für dich ist die passende Stelle dabei.
Blog-Autor*in
Benedikt Ritter
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.