Pêssego de batalha: um campo de batalha de microsserviços

1. Introdução

Última atualização:12/02/2020

Microservices Battle Arena (em inglês)

Já participou de uma guerra de bolas de neve em que você se move e joga bolas de neve em outras pessoas? Se não, tente um dia! Mas agora, em vez de correr o risco de levar um tapa, você pode criar um serviço pequeno e acessível pela rede (um microsserviço) que vai participar de uma batalha épica contra outros microsserviços. Como estamos organizando essa primeira batalha de microsserviços em Atlanta, Geórgia, nossos microsserviços vão jogar pêssegos em vez de bolas de neve.

Você deve estar se perguntando... Mas como um microsserviço "joga" um pêssego em outros microsserviços? Um microsserviço pode receber solicitações de rede (geralmente por HTTP) e retornar respostas. Há um "gerenciador de arena" que envia ao microsserviço o estado atual da arena. Em seguida, o microsserviço responde com um comando especificando o que fazer.

O objetivo é vencer, mas ao longo do caminho você vai aprender a criar e implantar microsserviços no Google Cloud.

Como funciona

Você vai criar um microsserviço com a tecnologia que quiser (ou escolher entre os iniciadores Java, Kotlin ou Scala) e implantar no Google Cloud. Depois da implantação, você vai preencher um formulário para informar o URL do microsserviço, e nós o adicionaremos à arena.

A arena contém todos os jogadores de uma determinada batalha. Para a conferência DevNexus, haverá uma arena por dia. Cada jogador representa um microsserviço que se move e joga pêssegos nos outros jogadores.

Aproximadamente uma vez por segundo, nosso gerenciador de arena vai chamar seu microsserviço, enviando o estado atual da arena (onde os jogadores estão), e seu microsserviço vai responder com um comando sobre o que fazer. Na arena, você pode avançar, virar à esquerda ou à direita ou jogar um pêssego. Um pêssego lançado viaja até três espaços na direção em que o jogador está olhando. Se um pêssego "atingir" outro jogador, o lançador ganha um ponto e o jogador atingido perde um ponto. O tamanho da arena é ajustado automaticamente para o número atual de jogadores.

Veja como a arena fica com três jogadores inventados:

9e4775d13ff18d4d.png

Exemplo de arena de Battle Peach

Conflitos recorrentes

Na arena, é possível que vários jogadores tentem realizar ações conflitantes. Por exemplo, dois jogadores podem tentar se mover para o mesmo espaço. Em caso de conflito, o microsserviço com o tempo de resposta mais rápido vence.

Assistir a batalha

Para saber como seu microsserviço está se saindo na batalha, confira a arena ao vivo.

API Battle

Para trabalhar com nosso gerenciador de arena, seu microsserviço precisa implementar uma API específica para participar da arena. O gerente da arena vai enviar o estado atual da arena em um HTTP POST para o URL que você fornecer, com a seguinte estrutura 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
    }
  }
}

Sua resposta HTTP precisa ter o código de status 200 (OK) com um corpo contendo sua próxima jogada, codificada como um único caractere maiúsculo de:

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

Isso é tudo! Vamos implantar um microsserviço no Cloud Run, um serviço do Google Cloud para executar microsserviços e outros aplicativos.

2. Como implantar seu microsserviço

É possível criar seu microsserviço com qualquer tecnologia e implantá-lo em qualquer lugar, desde que ele esteja acessível publicamente e em conformidade com a API Battle. Para facilitar, comece com um projeto de exemplo que apenas escolhe um comando aleatório.

Escolha uma amostra para começar

Há três exemplos de microsserviços de batalha para você começar:

Java e Spring Boot

Origem

Implantar no Cloud Run

Java e Quarkus

Origem

Implantar no Cloud Run

Kotlin e Micronaut

Origem

Implantar no Cloud Run

Kotlin e Quarkus

Origem

Implantar no Cloud Run

Scala e Play Framework

Origem

Implantar no Cloud Run

Go

Origem

Implantar no Cloud Run

Depois de decidir qual amostra usar, clique no botão "Implantar no Cloud Run" acima. Isso vai iniciar o Cloud Shell (um console baseado na Web para uma máquina virtual na nuvem), em que a origem será clonada e criada em um pacote implantável (uma imagem de contêiner do Docker), que será enviado para o Google Container Registry e implantado no Cloud Run.

Quando solicitado, especifique a região us-central1.

A captura de tela abaixo mostra a saída do Cloud Shell para a criação e implantação de microsserviços

d88e40430706a32b.png

Verificar se o microsserviço funciona

No Cloud Shell, faça uma solicitação ao microsserviço recém-implantado, substituindo YOUR_SERVICE_URL pelo URL do serviço (que está no Cloud Shell após a linha "Seu aplicativo está ativo aqui"):

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

Você vai encontrar a string de resposta F, L, R ou T.

Pedir inclusão na Arena

Preencha um breve formulário para participar da arena. A parte mais difícil será determinar o que você quer usar como imagem do perfil. Você pode usar a imagem do GitHub ou do LinkedIn, ou vamos escolher um avatar aleatório para você. Depois que analisarmos o envio, seu jogador vai aparecer na arena.

Fazer e implantar mudanças

Antes de fazer mudanças, você precisa configurar algumas informações no Cloud Shell sobre o projeto do GCP e a amostra usada. Primeiro, liste seus projetos do GCP:

gcloud projects list

Você provavelmente tem apenas um projeto. Copie o PROJECT_ID da primeira coluna e cole no comando a seguir, substituindo YOUR_PROJECT_ID pelo ID do projeto real, para definir uma variável de ambiente que será usada em comandos posteriores:

export PROJECT_ID=YOUR_PROJECT_ID

Agora defina outra variável de ambiente para a amostra usada. Assim, em comandos posteriores, podemos especificar o diretório e o nome do serviço corretos:

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

Agora, você pode editar a origem do microsserviço no Cloud Shell. Para abrir o editor baseado na Web do Cloud Shell, execute este comando:

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

Em seguida, você vai encontrar mais instruções para fazer mudanças.

f910c9ef7b51c406.png

Cloud Shell com o editor e o projeto de exemplo aberto

Depois de salvar as mudanças, crie o projeto no Cloud Shell usando o comando pack. Esse comando usa buildpacks para detectar o tipo de projeto, compilá-lo e criar o artefato implantável (uma imagem de contêiner do Docker).

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

Agora que a imagem do contêiner foi criada, use o comando docker (no Cloud Shell) para enviar a imagem ao Container Registry e permitir que ela seja acessada pelo Cloud Run:

docker push gcr.io/$PROJECT_ID/$SAMPLE

Agora implante a nova versão no Cloud Run:

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

Agora a arena vai usar sua nova versão.

3. Parabéns

Parabéns! Você criou e implantou um microsserviço que pode lutar com outros microsserviços. Boa sorte!

Qual é a próxima etapa?

Documentos de referência