Mikrodienst „Rainbow Rumpus“

1. Einführung

Letzte Aktualisierung: 06.05.2021

Mikrodienst „Rainbow Rumpus“

Haben Sie schon einmal an einem Schneeballschlacht teilgenommen, bei der Sie sich bewegen und andere spielerisch mit Schneebällen bewerfen? Wenn nicht, solltest du es irgendwann ausprobieren. Anstatt das Risiko einzugehen, physisch geschlagen zu werden, können Sie jetzt einen kleinen, netzwerkzugänglichen Dienst (einen Mikrodienst) erstellen, der an einem epischen Kampf gegen andere Mikrodienste teilnimmt und dabei Regenbögen statt Schneebälle wirft.

Du fragst dich vielleicht... Aber wie „wirft“ ein Mikrodienst einen Regenbogen auf andere Mikrodienste? Ein Mikrodienst kann Netzwerkanfragen (normalerweise über HTTP) empfangen und Antworten zurückgeben. Es gibt einen „Arenamanager“, der Ihrem Mikrodienst den aktuellen Status der Arena sendet. Daraufhin antwortet Ihr Mikrodienst mit einem Befehl, der angibt, was zu tun ist.

Natürlich ist das Ziel, zu gewinnen. Auf dem Weg dorthin lernen Sie jedoch, wie Sie Mikrodienste in Google Cloud erstellen und bereitstellen.

Funktionsweise

Sie erstellen einen Mikrodienst mit einer beliebigen Technologie (oder wählen Go, Java, Kotlin, Scala, NodeJS oder Python als Ausgangspunkt aus) und stellen ihn dann in Google Cloud bereit. Nach der Bereitstellung teilen Sie uns die URL Ihres Mikrodiensts mit. Wir fügen ihn dann der Arena hinzu.

Die Arena enthält alle Spieler für ein bestimmtes Duell. Der Regenbogen-Rumpus wird seine eigenen Arenen haben. Jeder Spieler stellt einen Mikrodienst dar, der sich bewegt und die anderen Spieler mit Regenbogen bewirft.

Ungefähr einmal pro Sekunde ruft unser Stadion-Manager Ihren Mikrodienst an und sendet den aktuellen Arena-Status (wo sich die Spieler befinden). Ihr Mikrodienst antwortet dann mit einem Befehl, was zu tun ist. In der Arena kannst du vorwärtsgehen, links oder rechts abbiegen oder einen Regenbogen werfen. Ein Regenbogen zieht sich in die Richtung, in die der Spieler zeigt, bis zu drei Felder. Wenn der Regenbogen 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 eine frühere Arena aus:

20628e6bd442bd11.png

Beispiel: Battle 1-Arena

Wiederkehrende Konflikte

In der Arena kann es vorkommen, dass mehrere Spieler versuchen, sich widersprechende Aktionen auszuführen. Beispielsweise könnten zwei Spieler versuchen, in denselben Bereich zu wechseln. Bei einem Konflikt erhält der Mikrodienst mit der kürzesten Antwortzeit den Zuschlag.

Die Schlacht ansehen

In der Live-Arena sehen Sie, wie Ihr Mikrodienst abschneidet.

Battle API

Damit Ihr Mikrodienst mit unserem Arena Manager zusammenarbeiten kann, muss er eine bestimmte API implementieren, um an der Arena teilnehmen zu können. Der Stadion-Manager sendet den aktuellen Arena-Status in einer HTTP-POST-Anfrage mit der folgenden JSON-Struktur an die von dir angegebene URL:

{
  "_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) mit einem Antworttext enthalten, der Ihren nächsten Zug enthält, in Form eines einzelnen Großbuchstabens mit einem der folgenden Zeichen:

F <- move Forward
R <- turn Right
L <- turn Left
T <- Throw

Das ist keine Kunst! Sehen wir uns an, wie ein Mikrodienst in Cloud Run bereitgestellt wird, 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 einen Betrag gut und Sie müssen keine Kreditkartendaten angeben. Normalerweise ist es weniger problematisch, ein privates Konto (z.B. gmail.com) anstelle eines G Suite-Kontos zu verwenden, da G Suite-Administratoren manchmal verhindern, dass Nutzer bestimmte Google Cloud-Funktionen verwenden. Außerdem sollte die Webkonsole, die wir verwenden werden, in Chrome oder Firefox gut funktionieren, aber möglicherweise Probleme in Safari verursachen.

3. Mikrodienst bereitstellen

Sie können Ihren Mikrodienst mit beliebiger Technologie erstellen und überall bereitstellen, solange er öffentlich erreichbar ist und der Battle API entspricht. Der Einfachheit halber helfen wir Ihnen aber, mit einem Beispieldienst zu beginnen und ihn in Cloud Run bereitzustellen.

Zuerst ein Beispiel auswählen

Es gibt zahlreiche Beispiele für Battle-Mikrodienste, die Sie als Ausgangspunkt verwenden können:

Kotlin und Frühlingsstiefel

Quelle

Kotlin und Micronaut

Quelle

Kotlin und Quarkus

Quelle

Java und Spring Boot

Quelle

Java und Quarkus

Quelle

Ok

Quelle

Node.js und Express

Quelle

Python und Flask

Quelle

Nachdem Sie sich für ein Beispiel entschieden haben, klicken Sie oben auf die Schaltfläche „In Cloud Run bereitstellen“. Dadurch wird Cloud Shell (eine webbasierte Konsole für eine virtuelle Maschine in der Cloud) gestartet, in der die Quelle geklont und dann in ein bereitstellbares Paket (ein Docker-Container-Image) eingebunden wird. Dieses wird dann in die Google Container Registry hochgeladen und in Cloud Run bereitgestellt.

Geben Sie auf Aufforderung die us-central1-Region an.

Der folgende Screenshot zeigt die Cloud Shell-Ausgabe für den Build und die Bereitstellung des Mikrodienstes.

d88e40430706a32b.png

Funktion des Mikrodiensts prüfen

In Cloud Shell können Sie eine Anfrage an den neu bereitgestellten Mikrodienst senden. Ersetzen Sie dabei YOUR_SERVICE_URL durch die URL Ihres Dienstes (diese befindet sich in Cloud Shell nach der Zeile "Your application is now live here"):

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 du am Rainbow Rumpus teilnehmen möchtest, musst du einer Arena beitreten. Öffnen Sie rainbowrumpus.dev und klicken Sie in einer Arena auf „Join“ (Beitreten), um Ihre Mikrodienst-URL anzugeben.

5. Marke und Änderungen 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:

export PROJECT_ID=YOUR_PROJECT_ID

Legen Sie nun eine weitere Umgebungsvariable für das von Ihnen 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=kotlin-micronaut
export SAMPLE=kotlin-quarkus
export SAMPLE=kotlin-springboot
export SAMPLE=java-quarkus
export SAMPLE=java-springboot
export SAMPLE=go
export SAMPLE=nodejs
export SAMPLE=python

Sie können die Quelle für Ihren Mikrodienst jetzt 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

Daraufhin werden weitere Anweisungen zum Vornehmen von Änderungen angezeigt.

f910c9ef7b51c406.png

Cloud Shell mit dem Editor, in dem das Beispielprojekt geöffnet ist

Nachdem Sie die Änderungen gespeichert haben, starten Sie die Anwendung in Cloud Shell mit dem Befehl aus der Datei README.md. Prüfen Sie jedoch zuerst, ob Sie sich im richtigen Beispielverzeichnis in Cloud Shell befinden:

cd cloudbowl-microservice-game/samples/$SAMPLE

Sobald die Anwendung ausgeführt wird, öffnen Sie einen neuen Cloud Shell-Tab und testen 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 die Änderungen bereitstellen möchten, erstellen Sie das Projekt mit dem Befehl pack in Cloud Shell. Dieser Befehl verwendet Buildpacks, um den Projekttyp zu erkennen, ihn zu kompilieren und das bereitstellbare Artefakt (ein Docker-Container-Image) zu erstellen.

# Make sure you are in a Cloud Shell tab where you set the PROJECT_ID
# and SAMPLE env vars. Otherwise, set them again.
pack build gcr.io/$PROJECT_ID/$SAMPLE \
  --path ~/cloudbowl-microservice-game/samples/$SAMPLE \
  --builder gcr.io/buildpacks/builder

Nachdem Sie das Container-Image erstellt haben, übertragen Sie es mit dem Docker-Befehl in Cloud Shell in die Google Container Registry, damit Cloud Run darauf zugreifen kann:

docker push gcr.io/$PROJECT_ID/$SAMPLE

Stellen Sie jetzt die neue Version in Cloud Run bereit:

gcloud run deploy $SAMPLE \
          --project=$PROJECT_ID \
          --platform=managed \
          --region=us-central1 \
          --image=gcr.io/$PROJECT_ID/$SAMPLE \
          --allow-unauthenticated

Die Arena verwendet jetzt Ihre neue Version.

6. Lokal entwickeln (optional)

Sie können mit Ihrer eigenen IDE lokal an Ihrem Projekt arbeiten. Gehen Sie dazu so vor:

  1. [In Cloud Shell] Komprimieren Sie das Beispiel:
# Make sure the SAMPLE env var is still set. If not, re-set it.
cd ~/cloudbowl-microservice-game/samples
zip -r cloudbowl-sample.zip $SAMPLE
  1. [In Cloud Shell] Laden Sie die ZIP-Datei auf Ihren Computer herunter:
cloudshell download-file cloudbowl-sample.zip
  1. [Auf Ihrem Computer] Entpacken Sie die Datei und nehmen Sie die Änderungen vor. Testen Sie sie anschließend.
  2. [Auf Ihrem Computer] gcloud CLI installieren
  3. [Auf Ihrem Computer] Melden Sie sich in Google Cloud an:
gcloud auth login
  1. [Auf Ihrem Computer] Legen Sie für die Umgebungsvariablen PROJECT_ID und SAMPLE dieselben Werte wie in Cloud Shell fest.
  2. [Auf Ihrem Computer] Verwenden Sie Cloud Build, um den Container zu erstellen (aus dem Stammverzeichnis des Projekts):
gcloud alpha builds submit . \
  --pack=image=gcr.io/$PROJECT_ID/$SAMPLE \
  --project=$PROJECT_ID
  1. [Auf Ihrem Computer] Stellen Sie den neuen Container bereit:
gcloud run deploy $SAMPLE \
  --project=$PROJECT_ID \
  --platform=managed \
  --region=us-central1 \
  --image=gcr.io/$PROJECT_ID/$SAMPLE \
  --allow-unauthenticated

7. Continuous Delivery

SCM einrichten

Richten Sie GitHub so ein, dass Sie mit Ihrem Team an Ihrem Microservice zusammenarbeiten können:

  1. In GitHub anmelden
  2. Neues Repository erstellen
  3. Wenn Sie auf Ihrem lokalen Computer arbeiten, können Sie entweder die Git-Befehlszeile (CLI) oder die GitHub Desktop-GUI-Anwendung (Windows oder Mac) verwenden. Wenn Sie Cloud Shell verwenden, müssen Sie die git-Befehlszeile verwenden. Folgen Sie der Anleitung für die Befehlszeile oder GitHub Desktop, um den Code Ihres Microservices auf GitHub zu erhalten.

Code mit der Git-CLI per Push übertragen

  1. Folgen Sie der Anleitung für Git über HTTPS mit einem persönlichen Zugriffstoken.
  2. Wählen Sie den Bereich „Repository“ aus.
  3. So richten Sie Git ein:
git config --global credential.helper \
  'cache --timeout=172800'
git config --global push.default current
git config --global user.email "YOUR@EMAIL"
git config --global user.name "YOUR NAME"
  1. Umgebungsvariablen für die GitHub-Organisation und das GitHub-Repository festlegen (https://github.com/ORG/REPO)
export GITHUB_ORG=YOUR_GITHUB_ORG
export GITHUB_REPO=YOUR_GITHUB_REPO
  1. Code in das neue Repository pushen
# Make sure the SAMPLE env var is still set. If not, re-set it.
cd ~/cloudbowl-microservice-game/samples/$SAMPLE
git init
git add .
git commit -m init
git remote add origin https://github.com/$GITHUB_ORG/$GITHUB_REPO.git
git branch -M main

# This will now ask for your GitHub username & password
# for the password use the personal access token
git push -u origin main
  1. Nachdem Sie Änderungen vorgenommen haben, können Sie einen Commit durchführen und die Änderungen per Push an GitHub übertragen:
git add .
git status
git diff --staged
git commit -am "my changes"
git push

Code mit GitHub Desktop per Push übertragen

  1. Laden Sie Ihren Code entsprechend der Anleitung aus dem vorherigen Abschnitt "Lokal entwickeln" herunter. Lab
  2. GitHub Desktop installieren, starten und anmelden
  3. Neu erstelltes Repository klonen

cf7f38c7c86a91cd.png

  1. Öffnen Sie den Datei-Explorer und kopieren Sie Ihr Projekt in das neue Repository
  2. Änderungen committen

5f3c1552e30ad7c5.png

  1. Hauptzweig auf GitHub veröffentlichen

Kontinuierliche Bereitstellung in Cloud Run einrichten

Mit Ihrer SCM-Einrichtung auf GitHub können Sie jetzt Continuous Delivery einrichten, damit jedes Mal, wenn neue Commits an den Branch main gepusht werden, die Änderungen automatisch von Cloud Build erstellt und bereitgestellt werden. Sie können auch die kontinuierliche Integration hinzufügen, bei der Ihre Tests vor der Bereitstellung ausgeführt werden. Dieser Schritt bleibt jedoch als Übung für Sie erhalten, da die vorkonfigurierten Beispiele keine Tests enthalten.

  1. Rufen Sie in der Cloud Console Ihren Cloud Run-Dienst auf.
  2. Klicken Sie auf „SET UP CONTINUOUS DEPLOYMENT“ (Kontinuierliche Bereitstellung einrichten) Schaltfläche
  3. Mit GitHub authentifizieren und das Repository Ihres Microservices auswählen

a3b5692f178869bc.png

  1. Wählen Sie Ihr GitHub-Repository aus und legen Sie den Branch auf ^main$ fest:

338f1c00f33d2f65.png

  1. Build-Typ für die Verwendung von Buildpacks festlegen
  2. Klicken Sie auf „Speichern“, um die kontinuierliche Bereitstellung einzurichten.

8. Beobachtbarkeit

Da kommt etwas kaputt. Durch Beobachtbarkeit erfahren wir, wann das passiert, und können herausfinden, warum. Messwerte liefern uns Daten über den Zustand und die Nutzung unseres Dienstes. In den Protokollen sehen Sie die manuell instrumentierten Informationen, die von unserem Dienst ausgegeben werden. Mithilfe von Benachrichtigungen werden wir informiert, wenn etwas schiefgeht. Sehen wir uns diese genauer an.

Messwerte

  1. Suchen Sie in der Liste der Cloud Run-Dienste nach Ihrem Dienst.
  2. Klicken Sie auf den Namen des Dienstes, um das Dashboard mit den Messwerten aufzurufen.

8491b8ec6bc5b4db.png

  1. Klicken Sie auf das Menü eines Messwerts und wählen Sie dann „Im Metrics Explorer ansehen“ aus.
  2. Sie können jetzt Ressourcenmesswerte, Filter, Gruppierungen und andere Optionen ändern. So können Sie beispielsweise die durchschnittlichen Dienstlatenzen für alle Dienste aufrufen:

f0d666d8f4221d45.png

Logs

Die von Diensten ausgegebene STDOUT-Ausgabe wird an das Google Cloud Logging-System gesendet. Auf der Seite „Verwaltung“ des Cloud Run-Dienstes können Sie auf eine einfache Protokollansicht zugreifen, z. B.:

40058a82c9299cff.png

In den Cloud Run-Logs können Sie nach Schweregrad filtern und die Logs filtern. Klicke hier, um mehr Flexibilität zu erhalten: 186fdb0e6d39a6ca.png

Benachrichtigungen

  1. Erstellen Sie eine Healthcheck-URL für Ihren Dienst.
  2. Fügen Sie für Spring Boot einfach die folgende Abhängigkeit hinzu:
org.springframework.boot:spring-boot-starter-actuator
  1. Erstellen oder aktualisieren Sie die src/main/resources/application.properties und deaktivieren Sie die Prüfung des Speicherplatzes:
management.health.diskspace.enabled=false
  1. Erstellen Sie eine Verfügbarkeitswarnung und geben Sie dabei das Protokoll, den Hostnamen und den Pfad an. Für Spring Boot lautet der Pfad: /actuator/health
  2. Benachrichtigung testen

6948d13b263bf573.png

  1. Benachrichtigung erstellen

9. Glückwunsch

Herzlichen Glückwunsch! Sie haben erfolgreich einen Mikrodienst erstellt und bereitgestellt, der mit anderen Mikrodiensten konkurrieren kann. Viel Erfolg!

Referenzdokumente