Hallo zusammen,
als Entwickler wissen wir, dass eine Anwendung zu schreiben nur die halbe Miete ist. Die andere Hälfte besteht darin, sie zuverlässig zu verpacken, auszurollen und zu betreiben. Hier kommt der Microservice-Stack mit Spring Boot, Docker und Kubernetes ins Spiel.
In diesem Guide bauen wir einen einfachen Spring Boot Microservice und machen ihn in zwei Schritten produktionsreif: Zuerst verpacken wir ihn in ein Docker-Image für die lokale Ausführung. Dann heben wir ihn auf die nächste Stufe und deployen ihn auf Kubernetes.
Der Artikel ist so aufgebaut, dass ihr den ersten Teil auch ohne Kubernetes-Cluster nachvollziehen könnt.
Anmerkung: Der Code wurde zu Testzwecken mit Warp erzeugt. Daher kann es zu leichten Diskrepanzen zwischen den Ausschnitten in diesem Post und dem tatsächlichen Code im Repository kommen.
Teil 1: Dein Spring Boot Microservice mit Docker
1. Die Anwendung schreiben
Wir starten mit einer simplen REST-API, die eine Begrüßung zurückgibt.
Benötigte Dependencies:
- Spring Web
- Spring Boot DevTools
- Lombok
Erstelle ein neues Spring Boot Projekt mit diesen Dependencies und füge folgende Klassen hinzu:
src/main/java/com/example/demo/controller/GreetingController.java
package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class GreetingController {
@GetMapping("/hello")
public String sayHello(@RequestParam(value = "name", defaultValue = "World") String name) {
return String.format("Hello, %s!", name);
}
}
Dieser Controller erstellt einen Endpunkt /hello
, der einen optionalen Namen-Parameter akzeptiert. Wenn kein Name übergeben wird, wird standardmäßig “World” verwendet.
2. Die Dockerfile
erstellen
Damit wir unsere Anwendung mit Docker ausführen können, benötigen wir eine Dockerfile
. Lege diese Datei im Wurzelverzeichnis deines Projekts ab.
Dockerfile
# Wir nutzen das offizielle OpenJDK 17-JDK-Image als Basis
FROM openjdk:17-jdk-slim
# Metadaten fuer unser Image
LABEL authors="Julian Paul"
LABEL description="Mein erster Spring Boot Microservice"
# Wir definieren ein Argument fuer den JAR-Dateinamen
ARG JAR_FILE=target/*.jar
# Kopiere die kompilierte JAR-Datei in den Container
COPY ${JAR_FILE} app.jar
# Definiere das Arbeitsverzeichnis
WORKDIR /
# Starte die Anwendung, wenn der Container laeuft
ENTRYPOINT ["java", "-jar", "app.jar"]
Diese Dockerfile
ist schlank und effizient. Sie kopiert die fertig kompilierte JAR-Datei in das Image, was den Build-Prozess beschleunigt, da die Kompilierung außerhalb von Docker erfolgt.
3. Die Anwendung bauen und als Docker-Image verpacken
Öffne ein Terminal in deinem Projektverzeichnis.
Spring Boot Anwendung bauen:
./mvnw package
Dieser Befehl kompiliert den Code, führt die Tests aus und erstellt die
.jar
-Datei imtarget/
-Verzeichnis.Docker-Image bauen:
docker build -t my-microservice .
Mit
docker build
bauen wir das Image aus derDockerfile
.-t my-microservice
taggt das Image mit dem Namenmy-microservice
und.
gibt an, dass dieDockerfile
im aktuellen Verzeichnis liegt.Docker-Container ausführen:
docker run -p 8080:8080 my-microservice
docker run
startet einen Container.-p 8080:8080
bildet den Port 8080 des Containers auf den Port 8080 deines lokalen Rechners ab.my-microservice
ist der Name des Images, das wir gerade gebaut haben.
Wenn alles geklappt hat, ist eure Anwendung jetzt unter http://localhost:8080/hello erreichbar.
Teil 2: Deployment auf Kubernetes
Wenn dein Microservice produktiv gehen soll, brauchst du eine skalierbare Plattform. Kubernetes ist dafür der Goldstandard.
Wichtig: Für diesen Teil brauchst du ein laufendes Kubernetes-Cluster (z.B. mit Minikube, Docker Desktop oder einem Cloud-Anbieter wie AWS EKS, Google GKE).
1. Das Docker-Image in eine Registry pushen
Damit Kubernetes dein Image finden kann, muss es in einer Registry gespeichert sein. Wir verwenden hierzu Docker Hub.
Bei Docker Hub einloggen:
docker login
Image taggen:
docker tag my-microservice:latest dein-dockerhub-username/my-microservice:v1
Ersetze
dein-dockerhub-username
mit deinem tatsächlichen Docker Hub Username.Image pushen:
docker push dein-dockerhub-username/my-microservice:v1
2. Das Deployment-Manifest schreiben
Ein Deployment-Manifest beschreibt, wie Kubernetes deine Anwendung ausrollen soll. Erstelle eine Datei namens deployment.yaml
.
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-microservice-deployment
labels:
app: my-microservice
spec:
replicas: 1 # Starte mit einer Instanz (Pod)
selector:
matchLabels:
app: my-microservice
template:
metadata:
labels:
app: my-microservice
spec:
containers:
- name: my-microservice
image: dein-dockerhub-username/my-microservice:v1 # Hier dein Image-Pfad
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: my-microservice-service
spec:
selector:
app: my-microservice
type: LoadBalancer # Oder NodePort, je nach Umgebung
ports:
- protocol: TCP
port: 8080
targetPort: 8080
- Deployment: Stellt sicher, dass immer die angegebene Anzahl an Pod-Instanzen läuft.
- Service: Erlaubt den Zugriff auf deine Pods, indem es Anfragen an sie weiterleitet. Der Typ
LoadBalancer
erstellt eine externe IP-Adresse (in Cloud-Umgebungen). Für lokale Setups wie Minikube istNodePort
oft einfacher.
3. Deployment auf Kubernetes ausführen
Öffne ein Terminal mit Zugang zu deinem Cluster und wende das Manifest an:
kubectl apply -f deployment.yaml
Das kubectl
Tool liest deine deployment.yaml
und weist Kubernetes an, deine Anwendung auszurollen.
4. Die Anwendung auf Kubernetes aufrufen
Finde die externe IP-Adresse deines Service:
kubectl get services my-microservice-service
Unter der Spalte EXTERNAL-IP
findest du die Adresse, unter der deine Anwendung erreichbar ist.
Fazit
Glückwunsch! Du hast soeben deine erste Spring Boot Anwendung in ein Docker-Image verpackt und auf Kubernetes deployed. Dies ist der grundlegende Stack für moderne Microservices. Von hier aus kannst du dein Wissen vertiefen und fortgeschrittene Konzepte wie ConfigMaps, Secrets, Ingress und Helm Charts erkunden.
Benötigte Dependencies
Für das Spring Boot Projekt im pom.xml
(Maven) oder build.gradle
(Gradle) benötigst du die folgenden Dependencies:
Maven (pom.xml
)
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
Gradle (build.gradle
)
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
}