Battle Peach – A Microservices Battle Ground

1. Einführung

Zuletzt aktualisiert:12.02.2020

Kampfarena für Mikrodienste

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 gehackt zu werden, können Sie einen kleinen, über das Netzwerk zugänglichen Dienst (einen Mikrodienst) entwickeln, der sich an einem epischen Kampf gegen andere Mikrodienste beteiligen wird. Und da wir diese erste Mikrodienstschlacht in Atlanta, Georgia, veranstalten, werfen unsere Mikrodienste Pfirsiche statt Schneebälle.

Du fragst dich vielleicht... Aber wie „wirft“ ein Mikrodienst mit anderen Mikrodiensten beschäftigen? 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 Java-, Kotlin- oder Scala-Starter aus) und stellen den Mikrodienst dann in Google Cloud bereit. Nach der Bereitstellung füllen Sie ein Formular aus, um uns die URL Ihres Mikrodienstes mitzuteilen. Wir fügen ihn dann der Arena hinzu.

In der Arena befinden sich alle Spieler für eine bestimmte Schlacht. Für die DevNexus-Konferenz wird es an jedem Tag eine Arena geben. Jeder Spieler repräsentiert einen Mikrodienst, der sich bewegt und die anderen Spieler mit Pfirsichen wirft.

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 Pfirsich werfen. Ein geworfener Pfirsich bewegt sich in der Richtung des Spielers auf bis zu drei Felder. Wenn eine Pfirsiche 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:

9e4775d13ff18d4d.png

Beispiel für eine Battle Peach 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. 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 können Sie mit einem Beispielprojekt beginnen, in dem Sie einfach einen zufälligen Befehl auswählen.

Leseprobe auswählen

Es gibt drei Beispiele für Battle-Microservice, mit denen Sie beginnen können:

Java und Frühlingsstiefel

Quelle

In Cloud Run bereitstellen

Java und Quarkus

Quelle

In Cloud Run bereitstellen

Kotlin und Micronaut

Quelle

In Cloud Run bereitstellen

Kotlin und Quarkus

Quelle

In Cloud Run bereitstellen

Scala & Google Play-Framework

Quelle

In Cloud Run bereitstellen

Ok

Quelle

In Cloud Run bereitstellen

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.

d88e40430706a32b.png

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.

Aufnahme in die Arena beantragen

Damit du in der Arena teilnehmen kannst, musst du ein kurzes Formular ausfüllen. Der schwierigste Teil besteht darin, zu entscheiden, was du für dein Profilbild verwenden möchtest. Sie können entweder Ihr GitHub-Bild oder Ihr LinkedIn-Bild verwenden oder wir wählen einfach einen zufälligen Avatar für Sie aus. Sobald wir die Einreichung geprüft haben, erscheint dein Spieler in der Arena.

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=java-springboot
export SAMPLE=kotlin-micronaut
export SAMPLE=scala-play

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.

f910c9ef7b51c406.png

Cloud Shell mit dem Editor und geöffnetem Beispielprojekt

Nachdem Sie die Änderungen gespeichert haben, erstellen Sie Ihr 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).

pack build gcr.io/$PROJECT_ID/$SAMPLE \
  --path cloudbowl-microservice-game/samples/$SAMPLE \
  --builder heroku/buildpacks

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\
          --memory=512Mi\
          --allow-unauthenticated

Für die Arena wird nun deine neue Version verwendet.

3. Glückwunsch

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

Was liegt als Nächstes an?

Referenzdokumente