Battle Peach - Un campo di battaglia con i microservizi

1. Introduzione

Ultimo aggiornamento: 12/02/2020

Microservices Battle Arena

Ti è mai capitato di partecipare a una battaglia a palle di neve in cui ti muovi e lanci palle di neve in modo giocoso contro gli altri? In caso contrario, prova a farlo un giorno. Ma ora, invece di rischiare di essere schiaffeggiato fisicamente, puoi creare un piccolo servizio accessibile alla rete (un microservizio) che parteciperà a una battaglia epica contro altri microservizi. E poiché ospitiamo questa prima battaglia di microservizi ad Atlanta, in Georgia, i nostri microservizi lanceranno pesche anziché palle di neve.

Ti starai chiedendo… Ma come fa un microservizio a "lanciare" una pesca ad altri microservizi? Un microservizio può ricevere richieste di rete (di solito tramite HTTP) e restituire risposte. Esiste un "gestore dell'arena" che invia al microservizio lo stato attuale dell'arena e il microservizio risponde con un comando che specifica cosa fare.

Naturalmente l'obiettivo è vincere, ma lungo il percorso imparerai a creare ed eseguire il deployment di microservizi su Google Cloud.

Come funziona

Creerai un microservizio con la tecnologia che preferisci (o scegliendo tra gli starter Java, Kotlin o Scala) e poi lo eseguirai il deployment su Google Cloud. Una volta eseguito il deployment, compila un modulo per comunicarci l'URL del tuo microservizio e lo aggiungeremo all'arena.

L'arena contiene tutti i giocatori per una determinata battaglia. Per la conferenza DevNexus ci sarà un'arena per ogni giorno. Ogni giocatore rappresenta un microservizio che si muove e lancia pesche contro gli altri giocatori.

Circa una volta al secondo, il nostro gestore dell'arena chiamerà il tuo microservizio, inviando lo stato attuale dell'arena (dove si trovano i giocatori) e il tuo microservizio risponderà con un comando su cosa fare. Nell'arena puoi andare avanti, girare a sinistra o a destra o lanciare una pesca. Una pesca lanciata percorrerà fino a tre spazi nella direzione in cui è rivolto il giocatore. Se una pesca "colpisce" un altro giocatore, chi la lancia ottiene un punto e il giocatore colpito ne perde uno. Le dimensioni dell'arena vengono regolate automaticamente in base al numero attuale di giocatori.

Ecco come appare l'arena con tre giocatori inventati:

9e4775d13ff18d4d.png

Esempio di arena Battle Peach

Revolving Conflicts

Nell'arena è possibile che più giocatori tentino di eseguire azioni in conflitto. Ad esempio, due giocatori potrebbero provare a spostarsi nello stesso spazio. In caso di conflitto, vince il microservizio con il tempo di risposta più rapido.

Guardare la battaglia

Per vedere come sta andando il tuo microservizio nella battaglia, dai un'occhiata all'arena live.

API Battle

Per funzionare con il nostro gestore dell'arena, il tuo microservizio dovrà implementare un'API specifica per partecipare all'arena. L'arena manager invierà lo stato attuale dell'arena in un HTTP POST all'URL che ci fornisci, con la seguente struttura JSON:

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

La risposta HTTP deve avere il codice di stato 200 (OK) con un corpo della risposta contenente la tua prossima mossa, codificata come un singolo carattere maiuscolo:

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

E con questo è tutto! Vediamo come eseguire il deployment di un microservizio su Cloud Run, un servizio Google Cloud per l'esecuzione di microservizi e altre applicazioni.

2. Deployment del microservizio

Puoi creare il tuo microservizio con qualsiasi tecnologia ed eseguirne il deployment ovunque, purché sia raggiungibile pubblicamente e conforme all'API Battle. Per semplificare le cose, puoi iniziare con un progetto di esempio che sceglie un comando casuale.

Scegliere un campione con cui iniziare

Esistono tre esempi di microservizi di battaglia da cui puoi iniziare:

Java e Spring Boot

Origine

Esegui il deployment su Cloud Run

Java e Quarkus

Origine

Esegui il deployment su Cloud Run

Kotlin e Micronaut

Origine

Esegui il deployment su Cloud Run

Kotlin e Quarkus

Origine

Esegui il deployment su Cloud Run

Scala e Play Framework

Origine

Esegui il deployment su Cloud Run

Go

Origine

Esegui il deployment su Cloud Run

Dopo aver deciso con quale esempio iniziare, fai clic sul pulsante "Esegui il deployment su Cloud Run" qui sopra. Verrà avviata Cloud Shell (una console basata sul web per una macchina virtuale nel cloud) in cui verrà clonato il codice sorgente, quindi verrà creato un pacchetto di cui è possibile eseguire il deployment (un'immagine container Docker), che verrà poi caricato in Google Container Registry e di cui verrà eseguito il deployment su Cloud Run.

Quando ti viene chiesto, specifica la regione us-central1.

Lo screenshot seguente mostra l'output di Cloud Shell per la creazione e il deployment di microservizi

d88e40430706a32b.png

Verificare che il microservizio funzioni

In Cloud Shell puoi inviare una richiesta al microservizio appena di cui è stato eseguito il deployment, sostituendo YOUR_SERVICE_URL con l'URL del servizio (che si trova in Cloud Shell dopo la riga "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

Dovresti visualizzare la stringa di risposta F, L, R o T.

Richiedere l'inclusione nell'arena

Per essere incluso nell'arena, devi compilare un breve modulo. La parte più difficile sarà decidere cosa usare come immagine del profilo. Puoi utilizzare l'immagine di GitHub, l'immagine di LinkedIn o scegliere un avatar casuale. Una volta esaminata la richiesta, il tuo giocatore verrà visualizzato nell'arena.

Apportare e implementare le modifiche

Prima di poter apportare modifiche, devi configurare alcune informazioni in Cloud Shell sul progetto Google Cloud e sul campione che hai utilizzato. Innanzitutto, elenca i tuoi progetti Google Cloud:

gcloud projects list

Probabilmente hai un solo progetto. Copia PROJECT_ID dalla prima colonna e incollalo nel comando seguente (sostituendo YOUR_PROJECT_ID con l'ID progetto effettivo) per impostare una variabile di ambiente che utilizzeremo nei comandi successivi:

export PROJECT_ID=YOUR_PROJECT_ID

Ora imposta un'altra variabile di ambiente per l'esempio che hai utilizzato, in modo che nei comandi successivi possiamo specificare la directory e il nome del servizio corretti:

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

Ora puoi modificare l'origine del tuo microservizio da Cloud Shell. Per aprire l'editor web di Cloud Shell, esegui questo comando:

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

Verranno visualizzate ulteriori istruzioni per apportare le modifiche.

f910c9ef7b51c406.png

Cloud Shell con l'editor con il progetto di esempio aperto

Dopo aver salvato le modifiche, crea il progetto in Cloud Shell utilizzando il comando pack. Questo comando utilizza Buildpacks per rilevare il tipo di progetto, compilarlo e creare l'artefatto di cui è possibile eseguire il deployment (un'immagine container Docker).

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

Ora che l'immagine container è stata creata, utilizza il comando docker (in Cloud Shell) per eseguire il push dell'immagine container in Google Container Registry in modo che possa essere accessibile da Cloud Run:

docker push gcr.io/$PROJECT_ID/$SAMPLE

Ora esegui il deployment della nuova versione su Cloud Run:

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

Ora l'arena utilizzerà la nuova versione.

3. Complimenti

Congratulazioni, hai creato e implementato correttamente un microservizio che può competere con altri microservizi. In bocca al lupo!

Passaggi successivi

Documentazione di riferimento