1. Introduction
Dernière mise à jour:06/05/2021
Microservice Rainbow Rumpus
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 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, produisant des arcs-en-ciel au lieu de boules de neige.
Vous vous demandez peut-être... Mais comment un microservice "lance"-t-il un arc-en-ciel pour d'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 les déclencheurs Go, Java, Kotlin, Scala, NodeJS ou Python), puis le déployer sur Google Cloud. Une fois le microservice déployé, vous nous indiquerez l'URL de votre microservice. Nous l'ajouterons ensuite à l'arène.
L'arène contient tous les joueurs d'une bataille donnée. Le Rumpus arc-en-ciel aura ses propres arènes. Chaque joueur représente un microservice qui se déplace et envoie des arcs-en-ciel 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 un arc-en-ciel. Un arc-en-ciel se déplace jusqu'à trois zones dans la direction vers laquelle le joueur fait face. Si l'arc-en-ciel "hit" 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 une ancienne arène:
Exemple d'arène Battle One
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. Se connecter à Google Cloud
Pour pouvoir déployer votre microservice sur Cloud Run, vous devez vous connecter à Google Cloud. Nous appliquerons alors un crédit à votre compte et vous n'aurez pas besoin d'indiquer les informations relatives à votre carte de paiement. Il est généralement moins problématique d'utiliser un compte personnel (par exemple, gmail.com) au lieu d'un compte G Suite, car il arrive que les administrateurs G Suite empêchent leurs utilisateurs d'accéder à certaines fonctionnalités Google Cloud. De plus, la console Web que nous allons utiliser devrait fonctionner parfaitement avec Chrome ou Firefox, mais elle peut présenter des problèmes dans Safari.
3. 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, nous allons vous aider à partir d'un exemple de service et à le déployer sur Cloud Run.
Choisissez votre échantillon pour commencer
Vous pouvez commencer par de nombreux exemples de microservices de type "batt" :
Kotlin et Spring Boot | ||
Kotlin et Micronaut | ||
Kotlin et Quarkus | ||
Java et Spring Boot | ||
Java et Quarkus | ||
Go | ||
Node.js et AdWords Express | ||
Python et Flasque |
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.
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
La chaîne de réponse F
, L
, R
ou T
doit s'afficher.
4. Demander à participer à l'arène
Pour rejoindre la Rumpus arc-en-ciel, vous devrez rejoindre une arène. Ouvrez rainbowrumpus.dev et cliquez sur "Rejoindre" sur une arène dans laquelle vous indiquerez l'URL de votre microservice.
5. 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=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
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.
Cloud Shell avec l'éditeur et l'exemple de projet ouvert
Après avoir enregistré vos modifications, démarrez l'application dans Cloud Shell à l'aide de la commande du fichier README.md
, mais assurez-vous d'abord que vous vous trouvez dans le bon répertoire d'exemple dans Cloud Shell:
cd cloudbowl-microservice-game/samples/$SAMPLE
Une fois l'application en cours d'exécution, ouvrez un nouvel onglet Cloud Shell et testez le service à l'aide de 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
Lorsque vous êtes prêt à déployer 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).
# 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
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 \ --allow-unauthenticated
L'arène utilisera votre nouvelle version !
6. Développer en local (facultatif)
Vous pouvez travailler sur votre projet localement à l'aide de votre propre IDE en procédant comme suit:
- [Dans Cloud Shell] Compressez l'exemple dans un fichier ZIP:
# 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
- [Dans Cloud Shell] Téléchargez le fichier ZIP sur votre ordinateur:
cloudshell download-file cloudbowl-sample.zip
- [Sur votre machine] Décompressez le fichier, puis créez et tester vos modifications
- [Sur votre machine] Installer la gcloud CLI
- [Sur votre machine] Connectez-vous à Google Cloud:
gcloud auth login
- [Sur votre machine] Définissez les variables d'environnement
PROJECT_ID
etSAMPLE
sur les mêmes valeurs que dans Cloud Shell. - [Sur votre machine] Utilisez Cloud Build pour créer le conteneur (à partir du répertoire racine du projet):
gcloud alpha builds submit . \ --pack=image=gcr.io/$PROJECT_ID/$SAMPLE \ --project=$PROJECT_ID
- [Sur votre machine] Déployez le nouveau conteneur:
gcloud run deploy $SAMPLE \ --project=$PROJECT_ID \ --platform=managed \ --region=us-central1 \ --image=gcr.io/$PROJECT_ID/$SAMPLE \ --allow-unauthenticated
7. Livraison continue
Configurer SCM
Configurez GitHub afin de pouvoir collaborer avec votre équipe sur votre microservice:
- Se connecter à GitHub
- Créer un dépôt
- Si vous travaillez sur votre ordinateur local, vous pouvez utiliser l'interface de ligne de commande git (CLI) ou l'application IUG de bureau GitHub (Windows ou Mac). Si vous utilisez Cloud Shell, vous devez utiliser la CLI Git. Pour obtenir le code de votre microservice sur GitHub, suivez les instructions de la CLI ou de GitHub Desktop.
Transférer votre code avec la CLI Git
- Suivez les instructions de Git via https avec un jeton d'accès personnel.
- Sélectionnez "dépôt". champ d'application
- Configuration de Git:
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"
- Définir des variables d'environnement pour l'organisation et le dépôt GitHub (
https://github.com/ORG/REPO
)
export GITHUB_ORG=YOUR_GITHUB_ORG export GITHUB_REPO=YOUR_GITHUB_REPO
- Transférer votre code vers le nouveau dépôt
# 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
- Une fois les modifications effectuées, vous pouvez les valider et les appliquer à GitHub:
git add . git status git diff --staged git commit -am "my changes" git push
Transférer votre code avec le bureau GitHub
- Téléchargez votre code en suivant les instructions de l'étape précédente "Développer en local". atelier
- Installez GitHub Desktop, lancez-le et connectez-vous
- Cloner le dépôt que vous venez de créer
- Ouvrez l'explorateur de fichiers et copiez votre projet dans le nouveau dépôt.
- Validez vos modifications
- Publier votre branche principale sur GitHub
Configurer le déploiement continu Cloud Run
Avec la configuration de SCM sur GitHub, vous pouvez maintenant configurer la livraison continue. Ainsi, chaque fois que de nouveaux commits sont envoyés vers la branche main
, Cloud Build génère et déploie automatiquement les modifications. Vous pouvez également ajouter l'intégration continue, qui exécute vos tests avant le déploiement, mais cette étape a été laissée comme un exercice, car les exemples prêts à l'emploi ne contiennent aucun test.
- Dans la console Cloud, accédez à votre service Cloud Run.
- Cliquez sur le bouton "CONFIGURER LE DÉPLOIEMENT CONTINU" bouton
- Authentifiez-vous avec GitHub et sélectionnez le dépôt de votre microserivce
- Sélectionnez votre dépôt GitHub et définissez la branche sur:
^main$
- Définir le type de compilation pour utiliser Buildpacks
- Cliquez sur "Enregistrer" pour configurer le déploiement continu.
8. Observabilité
Des choses se brisent. L'observabilité nous permet de savoir quand cela se produit et d'en diagnostiquer les causes. Les métriques nous montrent des données sur l'état et l'utilisation de notre service. Les journaux nous indiquent les informations d'instrumentation manuelle émises par notre service. Les alertes nous permettent d'être avertis en cas de problème. Explorons chacun d’eux plus en détail.
Métriques
- Recherchez votre service dans la liste des services Cloud Run.
- Cliquez sur le nom de votre service pour accéder à son tableau de bord des métriques
- Cliquez sur le menu ⋮ d'une métrique, puis sélectionnez "Afficher dans l'explorateur de métriques".
- Vous pouvez désormais modifier les métriques, les filtres, les regroupements et d'autres options des ressources. Par exemple, vous pouvez afficher les latences moyennes de tous les services:
Journaux
Les résultats STDOUT des services sont envoyés au système Google Cloud Logging. Vous pouvez accéder à une vue de journal de base à partir de la page d'administration du service Cloud Run, par exemple:
Dans les journaux Cloud Run, vous pouvez filtrer les journaux par gravité. Pour plus de flexibilité, cliquez sur:
Alertes
- Créez une URL de vérification de la santé pour votre service.
- Pour Spring Boot, ajoutez simplement la dépendance suivante:
org.springframework.boot:spring-boot-starter-actuator
- Créez ou mettez à jour
src/main/resources/application.properties
et désactivez la vérification de l'espace disque:
management.health.diskspace.enabled=false
- Créez une alerte de disponibilité en spécifiant votre protocole, votre nom d'hôte et votre chemin d'accès. Pour Spring Boot, le chemin d'accès est le suivant:
/actuator/health
- Tester l'alerte
- Créer l'alerte
9. Félicitations
Félicitations ! Vous venez de créer et de déployer un microservice qui peut être confronté à d'autres microservices. Bonne chance !