1. Einführung
Zuletzt aktualisiert:06.05.2021
Mikrodienst „Rainbow Rumpus“
Warst du schon einmal in einer Schneeballschlacht, bei der du dich bewegst und andere auf spielerische Weise mit Schneebällen bewirbst? Wenn nicht, probiere es eines Tages! Anstatt jedoch das Risiko zu riskieren, physisch angegriffen zu werden, können Sie einen kleinen, mit dem Netzwerk zugänglichen Dienst (einen Mikrodienst) entwickeln, der sich an einem epischen Kampf gegen andere Mikrodienste beteiligen und Regenbogen anstelle von Schneebällen wirft.
Du fragst dich vielleicht... Aber wie „wirft“ ein Mikrodienst bei anderen Mikrodiensten einen Regenbogen? Ein Mikrodienst kann Netzwerkanfragen empfangen (normalerweise über HTTP) und Antworten zurückgeben. Es gibt einen „Arena-Manager“ der den aktuellen Status der Arena an Ihren Mikrodienst sendet. Anschließend antwortet der Mikrodienst mit einem Befehl, der angibt, was zu tun ist.
Natürlich besteht das Ziel darin, zu gewinnen. Aber im Laufe dieses Kurses lernen Sie, wie Sie Mikrodienste in Google Cloud erstellen und bereitstellen.
Funktionsweise
Sie erstellen einen Mikrodienst mit einer beliebigen Technologie (oder wählen Sie zwischen den Startprogrammen Go, Java, Kotlin, Scala, NodeJS oder Python) und stellen den Mikrodienst dann in Google Cloud bereit. Nach der Bereitstellung teilen Sie uns die URL Ihres Mikrodienstes mit. Wir fügen ihn dann der Arena hinzu.
In der Arena befinden sich alle Spieler für eine bestimmte Schlacht. 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 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:
Beispiel: Battle 1-Arena
Sich drehende Konflikte
Dabei kann es vorkommen, dass mehrere Spieler versuchen, gegensätzliche Aktionen auszuführen. Zwei Spieler könnten beispielsweise versuchen, sich in denselben Raum zu bewegen. Bei einem Konflikt erhält der Mikrodienst mit der kürzesten Antwortzeit den Zuschlag.
Die Schlacht ansehen
In der Live-Arena können Sie sehen, wie Ihr Mikrodienst im Kampf abschneidet.
Battle API
Damit Sie mit unserem Stadion-Manager zusammenarbeiten können, muss Ihr Mikrodienst eine bestimmte API für die Teilnahme an diesem Stadion implementieren. 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 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 den 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 von uns verwendete Webkonsole mit Chrome oder Firefox problemlos funktionieren, in Safari könnten jedoch Probleme auftreten.
3. Mikrodienst bereitstellen
Sie können Ihren Mikrodienst mit jeder Technologie erstellen und überall bereitstellen, solange er öffentlich zugänglich ist und der Battle API entspricht. Der Einfachheit halber helfen wir Ihnen aber, mit einem Beispieldienst zu beginnen und ihn in Cloud Run bereitzustellen.
Leseprobe auswählen
Es gibt zahlreiche Beispiele für Kampfmikrodienste, mit denen Sie beginnen können:
Kotlin und Frühlingsstiefel | ||
Kotlin und Micronaut | ||
Kotlin und Quarkus | ||
Java und Frühlingsstiefel | ||
Java und Quarkus | ||
Ok | ||
Node.js und Express | ||
Python und Flachmann |
Nachdem Sie sich für ein Beispiel entschieden haben, klicken Sie auf „In Cloud Run bereitstellen“. Schaltfläche oben. Dadurch wird Cloud Shell gestartet, eine webbasierte Konsole auf einer virtuellen Maschine in der Cloud. Hier wird die Quelle geklont. Anschließend wird die Quelle in ein bereitstellbares Paket (ein Docker-Container-Image) eingebunden, das in Google Container Registry hochgeladen und dann in Cloud Run bereitgestellt wird.
Geben Sie die Region us-central1
an, wenn Sie dazu aufgefordert werden.
Der folgende Screenshot zeigt die Cloud Shell-Ausgabe für den Build und die Bereitstellung des Mikrodienstes.
Prüfen, ob der Mikrodienst funktioniert
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 dem Rainbow Rumpus beitreten möchtest, musst du einer Arena beitreten. Öffnen Sie rainbowrumpus.dev und klicken Sie in einer Arena auf „Join“, in der Sie Ihre Mikrodienst-URL angeben.
5. Marke und Änderungen bereitstellen
Bevor Sie Änderungen vornehmen können, müssen Sie in Cloud Shell 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
Jetzt können Sie die Quelle für den Mikrodienst in Cloud Shell bearbeiten. Führen Sie den folgenden Befehl aus, um den webbasierten Editor von Cloud Shell zu öffnen:
cloudshell edit cloudbowl-microservice-game/samples/$SAMPLE/README.md
Daraufhin werden weitere Anweisungen zum Vornehmen von Änderungen angezeigt.
Cloud Shell mit dem Editor und geöffnetem Beispielprojekt
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 ermittelt mithilfe von Buildpacks den Projekttyp, kompiliert ihn und erstellt das bereitstellbare Artefakt (ein Docker-Container-Image).
# 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
Für die Arena wird nun deine neue Version verwendet.
6. Lokal entwickeln (optional)
Sie können mit Ihrer eigenen IDE lokal an Ihrem Projekt arbeiten. Gehen Sie dazu so vor:
- [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
- [In Cloud Shell] Laden Sie die ZIP-Datei auf Ihren Computer herunter:
cloudshell download-file cloudbowl-sample.zip
- [Auf Ihrem Computer] Entpacken Sie die Datei und erstellen Sie & Änderungen testen
- [Auf Ihrem Computer] gcloud CLI installieren
- [Auf Ihrem Computer] Melden Sie sich in Google Cloud an:
gcloud auth login
- [Auf Ihrem Computer] Legen Sie für die Umgebungsvariablen
PROJECT_ID
undSAMPLE
dieselben Werte wie in Cloud Shell fest. - [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
- [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 ein, damit Sie mit Ihrem Team an Ihrem Mikrodienst zusammenarbeiten können:
- In GitHub anmelden
- Neues Repository erstellen
- 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 CLI verwenden. Um den Code Ihres Mikrodienstes auf GitHub abzurufen, folgen Sie entweder der Befehlszeile oder der Anleitung auf GitHub Desktop.
Code mit der Git-CLI per Push übertragen
- Folgen Sie der Anleitung für Git über https mit einem persönlichen Zugriffstoken.
- Wählen Sie „Repository“ aus Umfang
- 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"
- Umgebungsvariablen für die GitHub-Organisation und das Repository (
https://github.com/ORG/REPO
) festlegen
export GITHUB_ORG=YOUR_GITHUB_ORG export GITHUB_REPO=YOUR_GITHUB_REPO
- Code in das neue Repository übertragen
# 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
- 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
- Laden Sie Ihren Code entsprechend der Anleitung aus dem vorherigen Abschnitt "Lokal entwickeln" herunter. Lab
- GitHub Desktop installieren, starten und anmelden
- Neu erstelltes Repository klonen
- Öffnen Sie den Datei-Explorer und kopieren Sie Ihr Projekt in das neue Repository
- Commit für Änderungen durchführen
- Hauptzweig auf GitHub veröffentlichen
Kontinuierliche Bereitstellung in Cloud Run einrichten
Wenn Sie SCM auf GitHub eingerichtet haben, können Sie jetzt Continuous Delivery einrichten. Jedes Mal, wenn neue Commits an den main
-Zweig gesendet werden, erstellt Cloud Build die Änderungen automatisch und stellt sie bereit. Sie können auch die kontinuierliche Integration hinzufügen, mit 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.
- Rufen Sie in der Cloud Console Ihren Cloud Run-Dienst auf.
- Klicken Sie auf „SET UP CONTINUOUS DEPLOYMENT“ (Kontinuierliche Bereitstellung einrichten) Schaltfläche
- Bei GitHub authentifizieren und Repository Ihres Mikrodiensts auswählen
- Wählen Sie Ihr GitHub-Repository aus und legen Sie den Branch auf
^main$
fest:
- Build-Typ für die Verwendung von Buildpacks festlegen
- Klicken Sie auf „Speichern“, um die kontinuierliche Bereitstellung einzurichten.
8. Beobachtbarkeit
Da kommt etwas kaputt. Durch Beobachtbarkeit können wir herausfinden, wann das passiert und 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. Durch Benachrichtigungen werden wir informiert, wenn etwas schiefgeht. Sehen wir uns diese genauer an.
Messwerte
- Suchen Sie Ihren Dienst in der Liste der Cloud Run-Dienste.
- Klicken Sie auf den Namen des Dienstes, um das Messwert-Dashboard aufzurufen.
- Klicken Sie auf das Menü eines Messwerts ⋮ und wählen Sie dann „Im Metrics Explorer ansehen“ aus.
- Sie können jetzt Ressourcenmesswerte, Filter, Gruppierungen und andere Optionen ändern. Beispielsweise können Sie sich die durchschnittlichen Dienstlatenzen für alle Dienste ansehen:
Logs
Die von Diensten ausgegebene STDOUT-Ausgabe wird an das Google Cloud Logging-System gesendet. Über die Verwaltungsseite des Cloud Run-Dienstes können Sie auf eine einfache Logansicht zugreifen, z. B.:
In den Cloud Run-Logs können Sie nach Schweregrad filtern und die Logs filtern. Klicke hier, um mehr Flexibilität zu erhalten:
Benachrichtigungen
- Erstellen Sie eine Heathcheck-URL für Ihren Dienst.
- Fügen Sie für Spring Boot einfach die folgende Abhängigkeit hinzu:
org.springframework.boot:spring-boot-starter-actuator
- Erstellen oder aktualisieren Sie den
src/main/resources/application.properties
und deaktivieren Sie die Speicherplatzprüfung:
management.health.diskspace.enabled=false
- Erstellen Sie eine Verfügbarkeitswarnung und geben Sie das Protokoll, den Hostnamen und den Pfad an. Für Spring Boot lautet der Pfad:
/actuator/health
- Benachrichtigung testen
- Benachrichtigung erstellen
9. Glückwunsch
Herzlichen Glückwunsch! Sie haben erfolgreich einen Mikrodienst erstellt und bereitgestellt, der mit anderen Mikrodiensten konkurrieren kann. Viel Erfolg!