Battle Peach – A Microservices Battle Ground

1. Einführung

Zuletzt aktualisiert: 12.02.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. Da wir diesen ersten Mikrodienst-Wettbewerb in Atlanta, Georgia, veranstalten, werfen unsere Mikrodienste Pfirsiche statt Schneebälle.

Sie fragen sich vielleicht: Wie „wirft“ ein Mikrodienst aber einen Pfirsich 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. Für die DevNexus-Konferenz gibt es für jeden Tag eine Arena. Jeder Spieler stellt einen Mikrodienst dar, der sich bewegt und Pfirsiche 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 Pfirsich werfen. Ein geworfener Pfirsich fliegt bis zu drei Felder in die Richtung, in die der Spieler blickt. Wenn eine Pfirsich 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:

9e4775d13ff18d4d.png

Beispiel für eine Battle Peach-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. 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. Für den Anfang können Sie ein Beispielprojekt verwenden, das einfach einen zufälligen Befehl auswählt.

Wählen Sie eine Probe aus, mit der Sie beginnen möchten

Es gibt drei Beispiele für den Mikrodienst „battle“, die Sie als Ausgangspunkt verwenden können:

Java und Spring Boot

Quelle

In Cloud Run bereitstellen

Java & Quarkus

Quelle

In Cloud Run bereitstellen

Kotlin und Micronaut

Quelle

In Cloud Run bereitstellen

Kotlin und Quarkus

Quelle

In Cloud Run bereitstellen

Scala und Play Framework

Quelle

In Cloud Run bereitstellen

Ok

Quelle

In Cloud Run bereitstellen

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.

d88e40430706a32b.png

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.

Aufnahme in die Arena beantragen

Sie müssen ein kurzes Formular ausfüllen, um in die Arena aufgenommen zu werden. Die größte Herausforderung wird sein, zu entscheiden, was Sie als Profilbild verwenden möchten. Sie können entweder Ihr GitHub- oder LinkedIn-Bild verwenden oder wir wählen einen zufälligen Avatar für Sie aus. Nachdem wir den Beitrag geprüft haben, wird dein Player in der Arena angezeigt.

Ä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-micronaut
export SAMPLE=scala-play

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.

f910c9ef7b51c406.png

Cloud Shell mit dem Editor und dem geöffneten Beispielprojekt

Nachdem Sie die Änderungen gespeichert haben, erstellen Sie das 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 heroku/buildpacks

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.

3. Glückwunsch

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

Nächste Schritte

Referenzdokumente