Battle Peach – A Microservices Battle Ground

1. Introduction

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

Microservices Battle Arena

Avez-vous déjà participé à une bataille de boules de neige où vous vous déplacez et lancez des boules de neige sur les autres joueurs ? Si ce n'est pas le cas, essayez-le un jour ! Mais au lieu de risquer de vous faire taper sur les doigts, vous pouvez créer un petit service accessible au réseau (un microservice) qui participera à une bataille épique contre d'autres microservices. Et comme nous organisons cette première bataille de microservices à Atlanta, en Géorgie, nos microservices lanceront des pêches au lieu de boules de neige.

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

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

Fonctionnement

Vous allez créer un microservice avec la technologie de votre choix (ou choisir parmi les starters Java, Kotlin ou Scala), puis le déployer sur Google Cloud. Une fois déployé, vous remplirez 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 même bataille. Pour la conférence DevNexus, il y aura une arène par jour. Chaque joueur représente un microservice qui se déplace et lance des pêches sur les autres joueurs.

Environ une fois par seconde, notre gestionnaire d'arène appellera votre microservice, en envoyant l'état actuel de l'arène (où se trouvent les joueurs). Votre microservice répondra avec une commande 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 lancée peut parcourir jusqu'à trois cases dans la direction où le joueur est orienté. Si une pêche "touche" un autre joueur, celui qui l'a lancée gagne un point et celui qui l'a reçue en perd un. La taille de l'arène s'ajuste automatiquement au nombre actuel de joueurs.

Voici à quoi ressemble l'arène avec trois joueurs fictifs :

9e4775d13ff18d4d.png

Exemple d'arène Battle Peach

Conflits récurrents

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

Regarder la bataille

Pour voir comment votre microservice se comporte dans la bataille, consultez l'arène en direct !

API Battle

Pour fonctionner avec notre gestionnaire d'arène, votre microservice devra implémenter une API spécifique pour participer à l'arène. Le gestionnaire d'arène enverra l'état actuel de l'arène dans une requête HTTP POST à l'URL que vous nous fournissez, 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 être le code d'état 200 (OK) avec un corps de réponse contenant votre prochain coup, encodé sous la forme d'un seul caractère majuscule parmi les suivants :

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

Le plus important ! Déployons 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 conforme à l'API Battle. Pour commencer facilement, vous pouvez utiliser un exemple de projet qui sélectionne simplement une commande aléatoire.

Choisir un échantillon pour commencer

Vous pouvez commencer avec trois exemples de microservices de combat :

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 Play Framework

Source

Déployer sur Cloud Run

Go

Source

Déployer sur Cloud Run

Une fois que vous avez choisi l'exemple avec lequel commencer, cliquez sur le bouton "Deploy on Cloud Run" (Déployer sur Cloud Run) ci-dessus. Cela lancera Cloud Shell (une console Web pour une machine virtuelle dans le cloud) où la source sera clonée, puis intégrée dans un package déployable (une image de conteneur Docker), qui sera ensuite importé dans Google Container Registry, puis déployé sur Cloud Run.

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

La capture d'écran ci-dessous montre la sortie Cloud Shell pour la compilation et le déploiement de microservices.

d88e40430706a32b.png

Vérifier que le microservice fonctionne

Dans Cloud Shell, vous pouvez envoyer une requête à votre microservice nouvellement déployé, en remplaçant YOUR_SERVICE_URL par l'URL de votre service (qui se trouve dans Cloud Shell après la ligne "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

La chaîne de réponse F, L, R ou T devrait s'afficher.

Demander à être inclus dans l'Arena

Pour participer à l'arène, vous devez remplir un bref formulaire. Le plus difficile sera de déterminer ce que vous souhaitez utiliser comme image de profil. Vous pouvez utiliser votre image GitHub ou LinkedIn, ou nous choisirons un avatar aléatoire pour vous. Une fois que nous aurons examiné votre demande, votre joueur apparaîtra dans l'arène.

Apporter et déployer des modifications

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

gcloud projects list

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

export PROJECT_ID=YOUR_PROJECT_ID

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

# 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 dans Cloud Shell. Pour ouvrir l'éditeur Web Cloud Shell, exécutez la commande suivante :

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

Vous verrez alors d'autres instructions pour effectuer des modifications.

f910c9ef7b51c406.png

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

Après avoir enregistré vos modifications, compilez votre projet dans Cloud Shell à l'aide de la commande pack. Cette commande utilise des 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 l'importer dans Google Container Registry afin qu'elle puisse ensuite être accessible par Cloud Run :

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 désormais votre nouvelle version.

3. Félicitations

Félicitations, vous avez réussi à créer et à déployer un microservice qui peut affronter d'autres microservices ! Bonne chance !

Et ensuite ?

Documents de référence