Battle One - A Microservices Battle Ground

1. Introduzione

Ultimo aggiornamento: 2020-08-26

Microservices Battle Arena

Hai mai partecipato a una battaglia a palle di neve in cui ti sposti e lanci scherzosamente palle di neve agli altri? Altrimenti, prova un giorno o l'altro! Ma ora, invece di rischiare di essere schiacciati fisicamente, puoi creare un piccolo servizio accessibile in rete (un microservizio) che prenderà parte a un'epica battaglia contro altri microservizi. E poiché ospitiamo questa battaglia di microservizi a SpringOne, i nostri microservizi lanciano foglie anziché palle di neve.

Forse ti starai chiedendo... Ma come fa un microservizio "lancia" di altri microservizi? Un microservizio può ricevere richieste di rete (di solito tramite HTTP) e restituire risposte. C'è un "gestore dell'arena" che invierà al microservizio lo stato attuale dell'arena, dopodiché risponderà con un comando che specifica cosa fare.

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

Come funziona

Dovrai creare un microservizio con qualsiasi tecnologia tu voglia (o scegliere tra i comandi iniziali Java, Kotlin o Scala), quindi eseguirne il deployment su Google Cloud. Una volta eseguito il deployment, dovrai compilare un modulo per comunicarci l'URL del microservizio e noi lo aggiungeremo all'arena.

L'arena contiene tutti i giocatori di una data battaglia. La conferenza SpringOne avrà un'arena. Ogni giocatore rappresenta un microservizio che si muove e lancia le foglie agli altri giocatori.

Circa una volta al secondo, il nostro gestore dell'arena chiamerà il microservizio, inviando l'attuale stato dell'arena (dove si trovano i giocatori) e il microservizio risponderà con un comando indicando cosa fare. Nell'arena puoi spostarti avanti, girare a sinistra o a destra o lanciare una foglia. Una foglia lanciata si sposterà fino a tre spazi nella direzione in cui il giocatore è rivolto. Se una foglia "colpisce" un altro giocatore, il lanciatore ottiene un punto e il giocatore vittima perde un punto. Le dimensioni dello stadio vengono adattate automaticamente in base al numero corrente di giocatori.

Ecco come si presenta un'arena del passato:

20628e6bd442bd11.png

arena di esempio Battle One

Conflitti rotanti

Nell'arena è possibile che più giocatori provino a 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 durante la battaglia, visita l'arena.

API Battle

Per collaborare con il nostro gestore dell'arena, il microservizio dovrà implementare un'API specifica per partecipare all'arena. Il gestore dell'arena invierà lo stato corrente dell'arena in un POST HTTP all'URL che ci hai fornito, 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 essere il codice di stato 200 (OK) con un corpo della risposta contenente la mossa successiva, codificato come un solo carattere maiuscolo di:

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

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

2. Accedi a Google Cloud

Per poter eseguire il deployment del microservizio su Cloud Run, devi accedere a Google Cloud. Applicheremo un credito al tuo account e non dovrai inserire una carta di credito. Di solito è meno problematico utilizzare un account personale (ad es. gmail.com) invece di un account G Suite, perché a volte gli amministratori di G Suite impediscono ai propri utenti di utilizzare determinate funzionalità di Google Cloud. Inoltre, la console web che utilizzeremo dovrebbe funzionare al meglio con Chrome o Firefox, ma potrebbe presentare problemi in Safari.

3. Deployment del microservizio

Puoi creare il tuo microservizio con qualsiasi tecnologia e implementarlo ovunque, purché sia raggiungibile pubblicamente e sia conforme all'API Battle. Ma per semplificare le cose, ti aiuteremo a iniziare da un servizio di esempio ed eseguirne il deployment su Cloud Run.

Scegli il tuo Sample con cui iniziare

Puoi iniziare da due esempi di microservizi di battaglia:

Java e Stivale a molla

Origine

Esegui il deployment in Cloud Run

Kotlin e Stivale a molla

Origine

Esegui il deployment in Cloud Run

Dopo aver deciso con quale esempio iniziare, fai clic sul pulsante "Deploy on Cloud Run" pulsante qui sopra. Verrà avviato Cloud Shell (una console basata sul web in una macchina virtuale nel cloud) in cui l'origine verrà clonata e creata in un pacchetto di cui è possibile eseguire il deployment (un'immagine container Docker), che verrà poi caricato in Google Container Registry e sottoposto a deployment in Cloud Run.

Quando richiesto, specifica la regione us-central1.

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

d88e40430706a32b.png

Verifica che il microservizio funzioni

In Cloud Shell puoi inviare una richiesta al microservizio di cui hai appena eseguito il deployment, sostituendo YOUR_SERVICE_URL con l'URL del tuo servizio (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 vedere la stringa di risposta F, L, R o T.

4. Richiedi l'inclusione nell'arena

Per essere incluso nell'arena, devi inviare un messaggio al canale #3-sponsor-google-cloud Slack con il tuo nome, l'URL del servizio Cloud Run e, facoltativamente, il tuo nome utente GitHub per l'avatar o la foto del profilo. Una volta convalidate le informazioni, il giocatore verrà visualizzato nell'arena.

5. Crea e Esegui il deployment delle modifiche

Prima di poter apportare modifiche, devi configurare alcune informazioni in Cloud Shell sul progetto Google Cloud e sull'esempio che hai utilizzato. Per prima cosa, elenca i tuoi progetti Google Cloud:

gcloud projects list

Probabilmente hai un solo progetto. Copia il valore PROJECT_ID dalla prima colonna e incollalo nel comando seguente (sostituendo YOUR_PROJECT_ID con il tuo 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 potremo specificare la directory e il nome del servizio corretti:

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

Ora puoi modificare l'origine del microservizio da Cloud Shell. Per aprire l'editor basato sul 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, avvia l'applicazione in Cloud Shell:

cd cloudbowl-microservice-game/samples/$SAMPLE
./mvnw spring-boot:run

Quando l'applicazione è in esecuzione, apri una nuova scheda di Cloud Shell e testa il servizio utilizzando 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

Quando è tutto pronto per eseguire il deployment delle modifiche, crea il tuo 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 gcr.io/buildpacks/builder

Ora che l'immagine container è stata creata, utilizza il comando docker (in Cloud Shell) per eseguire il push dell'immagine container al Container Registry di Google in modo che sia 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 tua nuova versione!

6. Sviluppo locale

Per lavorare al tuo progetto localmente nel tuo IDE, segui questi passaggi:

  1. [In Cloud Shell] Comprimi l'esempio:

cd ~/cloudbowl-microservice-game/samples; zip -r cloudbowl-sample.zip $SAMPLE

  1. [In Cloud Shell] Scarica il file ZIP sulla tua macchina:

cloudshell download-file cloudbowl-sample.zip

  1. [Sul computer] Decomprimi il file, quindi crea e testa le modifiche
  2. [Sul tuo computer] Installa gcloud CLI
  3. [Sul tuo computer] Accedi a Google Cloud:

gcloud auth login

  1. [Sulla macchina] Imposta le variabili di ambiente PROJECT_ID e SAMPLE sugli stessi valori di Cloud Shell.
  2. [Sulla macchina] Usa Cloud Build per creare il container (dalla directory principale del progetto):

gcloud alpha builds submit . --pack=image=gcr.io/$PROJECT_ID/$SAMPLE

  1. [Sul tuo computer] Esegui il deployment del nuovo container:

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

7. Complimenti

Complimenti, hai creato ed eseguito correttamente il deployment di un microservizio in grado di funzionare con altri microservizi. In bocca al lupo!

Continua a imparare

Documenti di riferimento

8. Domande frequenti

Perché il mio microservizio non compare nell'arena?