1. Einführung
Zuletzt aktualisiert: 05.05.2020
Microservices Battle Arena
Hast du schon mal eine Schneeballschlacht erlebt, bei der du dich bewegt und spielerisch Schneebälle auf andere geworfen hast? Wenn nicht, probieren Sie es doch einmal aus. Anstatt jedoch Gefahr zu laufen, körperlich angegriffen zu werden, können Sie einen kleinen, über das Netzwerk zugänglichen Dienst (einen Mikrodienst) erstellen, der an einem epischen Kampf gegen andere Mikrodienste teilnimmt. Und da wir diesen Mikrodienst-Wettbewerb auf der Spring I/O veranstalten, werden unsere Mikrodienste Jamón statt Schneebälle werfen.
Sie fragen sich vielleicht: Aber wie „wirft“ ein Mikrodienst einen Jamón auf andere Mikrodienste? Ein Mikrodienst kann Netzwerkanfragen (in der Regel über HTTP) empfangen und Antworten zurückgeben. Es gibt einen „Arena-Manager“, der Ihrem Mikrodienst den aktuellen Zustand der Arena sendet. Ihr Mikrodienst antwortet dann mit einem Befehl, der angibt, was zu tun ist.
Natürlich ist das Ziel, zu gewinnen, aber auf dem Weg dorthin lernen Sie, wie Sie Mikrodienste in Google Cloud erstellen und bereitstellen.
Funktionsweise
Sie erstellen einen Mikrodienst mit einer beliebigen Technologie (oder wählen einen Starter für Java, Kotlin oder Scala) und stellen den Mikrodienst dann in Google Cloud bereit. Nach der Bereitstellung füllen Sie ein Formular aus, um uns die URL für Ihren Microservice mitzuteilen. Wir fügen ihn dann der Arena hinzu.
Die Arena enthält alle Spieler für einen bestimmten Kampf. Die Spring I/O Bridge-Konferenz hat eine eigene Arena. Jeder Spieler ist ein Mikrodienst, der sich bewegt und Jamón auf die anderen Spieler wirft.
Etwa einmal pro Sekunde ruft unser Arenamanager Ihren Mikrodienst auf und sendet den aktuellen Arenazustand (wo sich die Spieler befinden). Ihr Mikrodienst antwortet mit einem Befehl, was zu tun ist. In der Arena können Sie sich vorwärts bewegen, nach links oder rechts drehen oder einen Jamón werfen. Ein geworfener Jamón fliegt bis zu drei Felder in die Richtung, in die der Spieler blickt. Wenn ein Jamón einen anderen Spieler „trifft“, erhält der Werfer einen Punkt und der getroffene Spieler verliert einen Punkt. Die Größe der Arena wird automatisch an die aktuelle Anzahl der Spieler angepasst.
So sieht die Arena mit drei fiktiven Spielern aus:

Beispiel für die Battle Jamón-Arena
Wiederkehrende Konflikte
In der Arena kann es vorkommen, dass mehrere Spieler versuchen, widersprüchliche Aktionen auszuführen. Beispielsweise könnten zwei Spieler versuchen, sich auf dasselbe Feld zu bewegen. Im Falle eines Konflikts gewinnt der Microservice mit der schnellsten Reaktionszeit.
Battle ansehen
Hier geht es zur Live-Arena, in der Sie sehen können, wie sich Ihr Mikrodienst im Wettbewerb schlägt.
Battle API
Damit Ihr Mikrodienst mit unserem Arenamanager zusammenarbeiten kann, muss er eine bestimmte API implementieren, um an der Arena teilzunehmen. Der Arenamanager sendet den aktuellen Arenazustand in einem HTTP-POST an die von Ihnen angegebene URL mit der folgenden JSON-Struktur:
{
"_links": {
"self": {
"href": "https://YOUR_SERVICE_URL"
}
},
"arena": {
"dims": [4,3], // width, height
"state": {
"https://A_PLAYERS_URL": {
"x": 0, // zero-based x position, where 0 = left
"y": 0, // zero-based y position, where 0 = top
"direction": "N", // N = North, W = West, S = South, E = East
"wasHit": false,
"score": 0
}
... // also you and the other players
}
}
}
Ihre HTTP-Antwort muss den Statuscode 200 (OK) haben und einen Antworttext enthalten, der Ihren nächsten Zug als einzelnen Großbuchstaben codiert:
F <- move Forward
R <- turn Right
L <- turn Left
T <- Throw
Das ist keine Kunst! Wir sehen uns jetzt an, wie Sie einen Mikrodienst in Cloud Run bereitstellen, einem Google Cloud-Dienst zum Ausführen von Mikrodiensten und anderen Anwendungen.
2. In Google Cloud anmelden
Damit Sie Ihren Mikrodienst in Cloud Run bereitstellen können, müssen Sie sich in Google Cloud anmelden. Wir schreiben Ihrem Konto ein Guthaben gut und Sie müssen keine Kreditkarte angeben. Es ist in der Regel weniger problematisch, ein privates Konto (z.B. gmail.com) anstelle eines G Suite-Kontos zu verwenden, da G Suite-Administratoren ihre Nutzer manchmal daran hindern, bestimmte Google Cloud-Funktionen zu verwenden. Außerdem sollte die Webkonsole, die wir verwenden, in Chrome oder Firefox gut funktionieren, in Safari kann es jedoch zu Problemen kommen.
3. Mikrodienst bereitstellen
Sie können Ihren Mikrodienst mit jeder beliebigen Technologie erstellen und überall bereitstellen, solange er öffentlich erreichbar ist und der Battle API entspricht. Um Ihnen den Einstieg zu erleichtern, helfen wir Ihnen, mit einem Beispieldienst zu beginnen und ihn in Cloud Run bereitzustellen.
Wählen Sie eine Probe aus, mit der Sie beginnen möchten
Es gibt zwei Beispiele für den Mikrodienst „battle“, die Sie als Ausgangspunkt verwenden können:
Java und Spring Boot | ||
Kotlin und Spring Boot |
Nachdem Sie sich für ein Beispiel entschieden haben, klicken Sie oben auf die Schaltfläche „In Cloud Run bereitstellen“. Dadurch wird Cloud Shell gestartet, eine webbasierte Konsole für eine virtuelle Maschine in der Cloud. Dort wird die Quelle geklont und dann in ein bereitstellbares Paket (ein Docker-Container-Image) umgewandelt, das in Google Container Registry hochgeladen und dann in Cloud Run bereitgestellt wird.
Geben Sie auf Aufforderung die Region us-central1 an.
Der Screenshot unten zeigt die Cloud Shell-Ausgabe für das Erstellen und Bereitstellen von Mikrodiensten.

Funktionsweise des Mikrodienstes prüfen
In Cloud Shell können Sie eine Anfrage an Ihren neu bereitgestellten Microservice senden. Ersetzen Sie dazu YOUR_SERVICE_URL durch die URL für Ihren Dienst (die in Cloud Shell nach der Zeile „Your application is now live here“ angezeigt wird):
curl -d '{
"_links": {
"self": {
"href": "https://foo.com"
}
},
"arena": {
"dims": [4,3],
"state": {
"https://foo.com": {
"x": 0,
"y": 0,
"direction": "N",
"wasHit": false,
"score": 0
}
}
}
}' -H "Content-Type: application/json" -X POST -w "\n" \
https://YOUR_SERVICE_URL
Sie sollten den Antwortstring F, L, R oder T sehen.
4. Aufnahme in die Arena beantragen
Wenn Sie in der Arena vertreten sein möchten, müssen Sie eine Nachricht mit Ihrem Namen, der Cloud Run-Dienst-URL und optional Ihrem GitHub-Nutzernamen für das Avatar-/Profilfoto an den #battle-jamon-Channel senden. Sobald wir die Informationen bestätigt haben, wird dein Player in der Arena angezeigt.
5. Änderungen vornehmen und bereitstellen
Bevor Sie Änderungen vornehmen können, müssen Sie in Cloud Shell einige Informationen zum GCP-Projekt und zum verwendeten Beispiel einrichten. Listen Sie zuerst Ihre GCP-Projekte auf:
gcloud projects list
Sie haben wahrscheinlich nur ein Projekt. Kopieren Sie die PROJECT_ID aus der ersten Spalte und fügen Sie sie in den folgenden Befehl ein. Ersetzen Sie dabei YOUR_PROJECT_ID durch Ihre tatsächliche Projekt-ID, um eine Umgebungsvariable festzulegen, die wir in späteren Befehlen verwenden werden:
export PROJECT_ID=YOUR_PROJECT_ID
Legen Sie nun eine weitere Umgebungsvariable für das verwendete Beispiel fest, damit wir in späteren Befehlen das richtige Verzeichnis und den richtigen Dienstnamen angeben können:
# Copy and paste ONLY ONE of these export SAMPLE=java-springboot export SAMPLE=kotlin-springboot
Jetzt können Sie den Quellcode für Ihren Mikrodienst in Cloud Shell bearbeiten. Führen Sie den folgenden Befehl aus, um den webbasierten Cloud Shell-Editor zu öffnen:
cloudshell edit cloudbowl-microservice-game/samples/$SAMPLE/README.md
Sie sehen dann weitere Anleitungen zum Vornehmen von Änderungen.

Cloud Shell mit dem Editor und dem geöffneten Beispielprojekt
Nachdem Sie Ihre Änderungen gespeichert haben, starten Sie die Anwendung in Cloud Shell:
cd cloudbowl-microservice-game/samples/$SAMPLE ./mvnw spring-boot:run
Sobald die Anwendung ausgeführt wird, öffnen Sie einen neuen Cloud Shell-Tab und testen Sie den Dienst mit curl:
curl -d '{
"_links": {
"self": {
"href": "https://foo.com"
}
},
"arena": {
"dims": [4,3],
"state": {
"https://foo.com": {
"x": 0,
"y": 0,
"direction": "N",
"wasHit": false,
"score": 0
}
}
}
}' -H "Content-Type: application/json" -X POST -w "\n" \
http://localhost:8080
Wenn Sie bereit sind, Ihre Änderungen bereitzustellen, erstellen Sie Ihr Projekt in Cloud Shell mit dem Befehl pack. Mit diesem Befehl werden Buildpacks verwendet, um den Projekttyp zu erkennen, das Projekt zu kompilieren und das bereitstellbare Artefakt (ein Docker-Container-Image) zu erstellen.
pack build gcr.io/$PROJECT_ID/$SAMPLE \ --path ~/cloudbowl-microservice-game/samples/$SAMPLE \ --builder gcr.io/buildpacks/builder
Nachdem Ihr Container-Image erstellt wurde, können Sie es mit dem Docker-Befehl (in Cloud Shell) in die Google Container Registry übertragen, damit Cloud Run darauf zugreifen kann:
docker push gcr.io/$PROJECT_ID/$SAMPLE
Stellen Sie die neue Version jetzt in Cloud Run bereit:
gcloud run deploy $SAMPLE\
--project=$PROJECT_ID\
--platform=managed\
--region=us-central1\
--image=gcr.io/$PROJECT_ID/$SAMPLE\
--memory=512Mi\
--allow-unauthenticated
Jetzt wird in der Arena Ihre neue Version verwendet.
6. Glückwunsch
Herzlichen Glückwunsch! Sie haben erfolgreich einen Mikrodienst erstellt und bereitgestellt, der sich mit anderen Mikrodiensten messen kann. Viel Erfolg!
Weiterlernen
Referenzdokumente
7. FAQ
Warum wird mein Microservice nicht in der Arena angezeigt?
Wie läuft das Finale ab?
Wie funktioniert die Arena vor dem finalen Kampf?
Wie kann ich gewinnen?
Kann ich lokal entwickeln?