1. Introducción
Última actualización: 12/02/2020
Microservices Battle Arena
¿Alguna vez participaste en una pelea de bolas de nieve en la que te movías y les arrojabas bolas de nieve a otras personas de forma juguetona? Si no es así, pruébalo algún día. Pero ahora, en lugar de arriesgarte a recibir un golpe físico, puedes crear un pequeño servicio accesible a través de la red (un microservicio) que participará en una batalla épica contra otros microservicios. Y, como organizaremos esta primera batalla de microservicios en Atlanta, Georgia, nuestros microservicios arrojarán duraznos en lugar de bolas de nieve.
Tal vez te preguntes… Pero, ¿cómo un microservicio "lanza" un durazno a otros microservicios? Un microservicio puede recibir solicitudes de red (por lo general, a través de HTTP) y devolver respuestas. Hay un "administrador de la arena" que le enviará a tu microservicio el estado actual de la arena, y luego tu microservicio responderá con un comando que especifique qué hacer.
Por supuesto, el objetivo es ganar, pero, en el camino, aprenderás a compilar e implementar microservicios en Google Cloud.
Cómo funciona
Compilarás un microservicio con la tecnología que desees (o elegirás entre los iniciadores de Java, Kotlin o Scala) y, luego, implementarás el microservicio en Google Cloud. Una vez que se implemente, completarás un formulario para informarnos la URL de tu microservicio y, luego, lo agregaremos al estadio.
La arena contiene a todos los jugadores de una batalla determinada. Para la conferencia DevNexus, habrá un estadio por día. Cada jugador representa un microservicio que se mueve y les arroja duraznos a los demás jugadores.
Aproximadamente una vez por segundo, nuestro administrador de la arena llamará a tu microservicio y le enviará el estado actual de la arena (dónde están los jugadores), y tu microservicio responderá con un comando sobre qué hacer. En la arena, puedes avanzar, girar a la izquierda o a la derecha, o lanzar un durazno. Un durazno lanzado viajará hasta tres espacios en la dirección en la que mira el jugador. Si una durazno "golpea" a otro jugador, el lanzador obtiene un punto y el jugador golpeado pierde un punto. El tamaño de la arena se ajusta automáticamente según la cantidad actual de jugadores.
Así se ve el estadio con tres jugadores inventados:

Ejemplo de un estadio de Battle Peach
Conflictos rotativos
En la arena, es posible que varios jugadores intenten realizar acciones contradictorias. Por ejemplo, dos jugadores podrían intentar moverse al mismo espacio. En caso de conflicto, gana el microservicio con el tiempo de respuesta más rápido.
Cómo mirar la batalla
Para ver cómo le va a tu microservicio en la batalla, consulta el estadio en vivo.
API de Battle
Para trabajar con nuestro administrador de la arena, tu microservicio deberá implementar una API específica para participar en la arena. El administrador de la arena enviará el estado actual de la arena en una solicitud HTTP POST a la URL que nos proporciones, con la siguiente estructura 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
}
}
}
Tu respuesta HTTP debe tener el código de estado 200 (OK) con un cuerpo de respuesta que contenga tu próximo movimiento, codificado como un solo carácter en mayúscula de una de las siguientes opciones:
F <- move Forward
R <- turn Right
L <- turn Left
T <- Throw
¡Esto es todo lo que hay sobre este tema! Analicemos la implementación de un microservicio en Cloud Run, un servicio de Google Cloud para ejecutar microservicios y otras aplicaciones.
2. Implementa tu microservicio
Puedes compilar tu microservicio con cualquier tecnología y, luego, implementarlo en cualquier lugar, siempre y cuando sea accesible de forma pública y cumpla con los requisitos de la API de Battle. Para que sea más fácil, puedes comenzar con un proyecto de muestra que solo elija un comando aleatorio.
Elige la muestra con la que quieres comenzar
Existen tres muestras de microservicios de batalla con las que puedes comenzar:
Java y Spring Boot | ||
Java y Quarkus | ||
Kotlin y Micronaut | ||
Kotlin y Quarkus | ||
Scala y Play Framework | ||
Go |
Después de decidir con qué muestra comenzar, haz clic en el botón "Implementar en Cloud Run" que aparece arriba. Se iniciará Cloud Shell (una consola basada en la Web para una máquina virtual en la nube) en la que se clonará el código fuente y, luego, se compilará en un paquete implementable (una imagen de contenedor de Docker), que se subirá a Google Container Registry y, luego, se implementará en Cloud Run.
Cuando se te solicite, especifica la región us-central1.
La siguiente captura de pantalla muestra el resultado de Cloud Shell para la compilación y la implementación de microservicios

Verifica que el microservicio funcione
En Cloud Shell, puedes realizar una solicitud a tu microservicio recién implementado. Para ello, reemplaza YOUR_SERVICE_URL por la URL de tu servicio (que se encuentra en Cloud Shell después de la línea "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
Deberías ver la cadena de respuesta de F, L, R o T.
Solicita la inclusión en la Arena
Para participar en la arena, debes completar un formulario breve. Lo más difícil será determinar qué quieres usar como imagen de perfil. Puedes usar la imagen de GitHub o LinkedIn, o bien elegiremos un avatar aleatorio para ti. Una vez que revisemos el envío, tu jugador aparecerá en la arena.
Realiza e implementa cambios
Antes de realizar cambios, debes configurar cierta información en Cloud Shell sobre el proyecto de GCP y la muestra que usaste. Primero, enumera tus proyectos de GCP:
gcloud projects list
Es probable que solo tengas un proyecto. Copia el PROJECT_ID de la primera columna y pégalo en el siguiente comando (reemplaza YOUR_PROJECT_ID por tu ID del proyecto real) para establecer una variable de entorno que usaremos en comandos posteriores:
export PROJECT_ID=YOUR_PROJECT_ID
Ahora, configura otra variable de entorno para la muestra que usaste, de modo que, en comandos posteriores, podamos especificar el directorio y el nombre del servicio correctos:
# Copy and paste ONLY ONE of these export SAMPLE=java-springboot export SAMPLE=kotlin-micronaut export SAMPLE=scala-play
Ahora puedes editar el código fuente de tu microservicio desde Cloud Shell. Para abrir el editor basado en la Web de Cloud Shell, ejecuta este comando:
cloudshell edit cloudbowl-microservice-game/samples/$SAMPLE/README.md
Luego, verás más instrucciones para realizar cambios.

Cloud Shell con el editor y el proyecto de muestra abierto
Después de guardar los cambios, compila tu proyecto en Cloud Shell con el comando pack. Este comando usa paquetes de compilación para detectar el tipo de proyecto, compilarlo y crear el artefacto implementable (una imagen de contenedor de Docker).
pack build gcr.io/$PROJECT_ID/$SAMPLE \ --path cloudbowl-microservice-game/samples/$SAMPLE \ --builder heroku/buildpacks
Ahora que se creó la imagen de contenedor, usa el comando docker (en Cloud Shell) para enviar la imagen de contenedor a Google Container Registry, de modo que Cloud Run pueda acceder a ella:
docker push gcr.io/$PROJECT_ID/$SAMPLE
Ahora implementa la versión nueva en Cloud Run:
gcloud run deploy $SAMPLE\
--project=$PROJECT_ID\
--platform=managed\
--region=us-central1\
--image=gcr.io/$PROJECT_ID/$SAMPLE\
--memory=512Mi\
--allow-unauthenticated
Ahora, el estadio usará tu nueva versión.
3. Felicitaciones
¡Felicitaciones! Compilaste e implementaste correctamente un microservicio que puede luchar con otros microservicios. ¡Buena suerte!
¿Qué sigue?
- Agrega el seguimiento distribuido a tu app de Spring Boot
- Usa AI Platform para que tu microservicio sea muy inteligente