Battle Peach – A Microservices Battle Ground

1. Introduction

Dernière mise à jour:12/02/2020

Microservices Battle Arena

Vous est-il déjà arrivé de vous déplacer et de lancer des boules de neige sur d'autres joueurs en vous amusant ? Si ce n'est pas le cas, essayez un jour ! Mais maintenant, au lieu de risquer d'être physiquement bloqué, vous pouvez créer un petit service accessible au réseau (un microservice) qui participera à une bataille épique contre d'autres microservices. Comme nous organisons cette première bataille de microservices à Atlanta, dans l'État de Géorgie, nos microservices produira des pêches au lieu de boules de neige.

Vous vous demandez peut-être... Mais comment un microservice "lance"-t-il une pêche aux autres microservices ? Un microservice peut recevoir des requêtes réseau (généralement via HTTP) et renvoyer des réponses. Il existe un « gestionnaire de l'arène » qui enverra à votre microservice l'état actuel de l'arène, puis il répondra avec une commande spécifiant ce qu'il doit faire.

Bien sûr, l'objectif est de gagner, mais au fil du temps, vous apprendrez à créer et à déployer des microservices sur Google Cloud.

Comment ça marche ?

Vous allez créer un microservice avec la technologie de votre choix (ou choisir parmi des déclencheurs Java, Kotlin ou Scala), puis le déployer sur Google Cloud. Une fois le microservice déployé, vous devrez remplir un formulaire pour nous indiquer l'URL de votre microservice. Nous l'ajouterons ensuite à l'arène.

L'arène contient tous les joueurs d'une bataille donnée. La conférence DevNexus comportera une arène par jour. Chaque joueur représente un microservice qui se déplace et lance des pêches aux autres joueurs.

Environ une fois par seconde, notre responsable de l'arène appelle votre microservice et envoie l'état actuel de l'arène (où se trouvent les joueurs). Votre microservice répond ensuite en indiquant ce qu'il faut faire. Dans l'arène, vous pouvez avancer, tourner à gauche ou à droite, ou lancer une pêche. Une pêche projetée se déplace jusqu'à trois cases dans la direction à laquelle le joueur fait face. Si une pêche "arrive" un autre joueur, le lanceur obtient un point et le joueur touché perd un point. La taille de l'arène est ajustée automatiquement en fonction du nombre actuel de joueurs.

Voici à quoi ressemble l'arène avec trois joueurs inventés:

9e4775d13ff18d4d.png

Exemple d'arène Battle Peach

Conflits tournants

Dans l'arène, il est possible que plusieurs joueurs essaient d'effectuer des actions contradictoires. Par exemple, deux joueurs peuvent essayer de se déplacer dans le même espace. En cas de conflit, le microservice qui offre le temps de réponse le plus rapide l'emporte.

Regarder la bataille

Pour connaître les performances de votre microservice dans la bataille, consultez l'arène en direct.

API Battle

Pour que vous puissiez travailler avec notre responsable de l'arène, votre microservice devra implémenter une API spécifique pour participer à l'arène. Le gestionnaire de l'arène enverra l'état actuel de l'arène dans une requête POST HTTP à l'URL que vous nous avez fournie, avec la structure JSON suivante:

{
  "_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
    }
  }
}

Votre réponse HTTP doit comporter le code d'état 200 (OK) avec un corps de réponse contenant le prochain coup, encodé sous la forme d'un seul caractère majuscule correspondant à l'un des éléments suivants:

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

Le plus important ! Voyons maintenant comment déployer un microservice sur Cloud Run, un service Google Cloud permettant d'exécuter des microservices et d'autres applications.

2. Déployer votre microservice

Vous pouvez créer votre microservice avec n'importe quelle technologie et le déployer n'importe où, à condition qu'il soit accessible publiquement et qu'il soit conforme à l'API Battle. Pour vous faciliter la tâche, vous pouvez commencer avec un exemple de projet qui sélectionne simplement une commande aléatoire.

Choisissez votre échantillon pour commencer

Vous pouvez commencer par trois exemples de microservices de type "batt" :

Java et Spring Boot

Source

Déployer sur Cloud Run

Java et Quarkus

Source

Déployer sur Cloud Run

Kotlin et Micronaut

Source

Déployer sur Cloud Run

Kotlin et Quarkus

Source

Déployer sur Cloud Run

Scala et Framework Play

Source

Déployer sur Cloud Run

Go

Source

Déployer sur Cloud Run

Après avoir choisi l'exemple par lequel commencer, cliquez sur "Déployer sur Cloud Run" bouton ci-dessus. Cette opération lance Cloud Shell (une console Web sur une machine virtuelle dans le cloud). La source est clonée, puis intégrée dans un package déployable (une image de conteneur Docker), qui est ensuite importé dans Google Container Registry et déployé sur Cloud Run.

Lorsque vous y êtes invité, spécifiez la région us-central1.

La capture d'écran ci-dessous montre le résultat de Cloud Shell pour la création et le déploiement de microservices.

d88e40430706a32b.png

Vérifier que le microservice fonctionne

Dans Cloud Shell, vous pouvez envoyer une requête au microservice que vous venez de déployer, en remplaçant YOUR_SERVICE_URL par l'URL de votre service (qui se trouve dans Cloud Shell après la ligne "Votre application est désormais active ici"):

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

Vous devriez voir la chaîne de réponse F, L, R ou T.

Demander à participer à l'arène

Vous devez remplir un court formulaire pour pouvoir participer à l'arène. Le plus difficile consiste à déterminer quelle image de profil vous souhaitez utiliser. Vous pouvez utiliser votre image GitHub ou LinkedIn, ou nous choisirons simplement un avatar aléatoire pour vous. Une fois que nous aurons examiné votre demande, votre joueur figurera dans l'arène.

Marque et Déployer les modifications

Avant de pouvoir apporter des modifications, vous devez configurer certaines informations dans Cloud Shell sur le projet GCP et l'exemple utilisé. Commencez par répertorier vos projets GCP:

gcloud projects list

Vous n'avez probablement qu'un seul projet. Copiez la valeur PROJECT_ID de la première colonne et collez-la dans la commande suivante (en remplaçant YOUR_PROJECT_ID par l'ID de votre projet) afin de définir une variable d'environnement que nous utiliserons dans les commandes suivantes:

export PROJECT_ID=YOUR_PROJECT_ID

Définissez maintenant une autre variable d'environnement pour l'exemple que vous avez utilisé. Ainsi, dans les commandes ultérieures, nous pourrons spécifier le répertoire et le nom de service corrects:

# Copy and paste ONLY ONE of these
export SAMPLE=java-springboot
export SAMPLE=kotlin-micronaut
export SAMPLE=scala-play

Vous pouvez maintenant modifier la source de votre microservice depuis Cloud Shell. Pour ouvrir l'éditeur Web de Cloud Shell, exécutez la commande suivante:

cloudshell edit cloudbowl-microservice-game/samples/$SAMPLE/README.md

Des instructions supplémentaires s'affichent alors pour vous permettre d'apporter des modifications.

f910c9ef7b51c406.png

Cloud Shell avec l'éditeur et l'exemple de projet ouvert

Après avoir enregistré vos modifications, créez votre projet dans Cloud Shell à l'aide de la commande pack. Cette commande utilise Buildpacks pour détecter le type de projet, le compiler et créer l'artefact déployable (une image de conteneur Docker).

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

Maintenant que votre image de conteneur a été créée, utilisez la commande Docker (dans Cloud Shell) pour la transférer vers Google Container Registry afin que Cloud Run puisse y accéder:

docker push gcr.io/$PROJECT_ID/$SAMPLE

Déployez maintenant la nouvelle version sur Cloud Run:

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

L'arène utilisera votre nouvelle version !

3. Félicitations

Félicitations ! Vous venez de créer et de déployer un microservice qui peut être confronté à d'autres microservices. Bonne chance !

Et ensuite ?

Documents de référence