Ejemplo de Zeebe con Spring Boot en Docker
En esta entrada sobre ejemplo de Zeebe con Spring Boot en Docker vamos a ver el uso de este workflow para la orquestación de microservicios junto con Spring Boot. En el ejemplo que veremos a continuación ejecutaremos Zeebe con docker, aunque también mostramos como ejecutarlo en Kubernetes con Helm.
¿Qué es Zeebe?
Zeebe, es un motor de flujo de trabajo que nos va a permitir gestionar múltiples procesos de negocio y orquestar servicios en una arquitectura de microservicios. Zeebe es un sistema distribuido creado por Camunda, es un sistema distribuido sin un sistema central.
Además Zeebe se adapta a las aplicaciones cloud native para poder cumplir con los requisitos de escalado en un escenario de baja latencia y un alto rendimiento.
Existen diferentes clientes de conexión para distintos lenguajes por lo que se puede hacer uso en arquitecturas políglotas.
¿ Cómo funciona Zeebe ?
Como hemos comentado Zeebe nos va a permitir crear un workflow de trabajo en donde se define la secuencia y las condiciones en las que nuestros microservicios van a ser llamados.
Zeebe puede escalarse sin problema, por lo que el flujo de llamadas y trabajos puede ser aumentado, para poder realizar un buen número de ejecuciones por segundo. Zeebe es tolerante al fallo y utiliza el patrón event log como medida para un disaster recovery, en el que podría restaurar los eventos y llamadas completamente si fuera necesario.
Para lograr esta orquestación zeebe tiene dos componentes principales:
- Brokers: Se encargan de la ejecución de las instancias de los flujos definidos.
- Gateway: Punto de entrada a la aplicación y poder interactúar con los workflow.
Además puedes tener exporter, para externalizar todas las operaciones realizadas, por lo general es Elasticsearch pero puedes configurar y añadir el que necesites.
Otra pieza a tener en cuenta dentro de la arquitectura es el uso de los workers, que son Jobs que realizan peticiones de trabajo con un intervalo de tiempo programado.
Ejemplo de Zeebe con Spring Boot
A continuación vamos a crear un ejemplo de Zeebe con Spring Boot en Kubernetes. El workflow del ejemplo consistirá en un sistema de alerta de control en una casa. En el caso en el que se este produciendo un robo se avisará a la policía y acabaran en prisión y en otro caso se llamará a una ambulacia por si ha habido un accidente doméstico.
Arrancar Zeebe
Para arrancar Zeebe para nuestro ejemplo podemos hacerlo a través de Kubernetes con la ayuda de Helm o simplemente con un docker. Para nuestro ejemplo vamos a tomar la opción de Docker por tenerlo todo configurado y no tener que exponer los servicios.
Arrancar Zeebe con Kubernetes
- Arrancar tu clúster de Kubernetes (por ejemplo Minikube)
- Usar Helm para instalar Zeebe. El uso de Helm es lo más cómodo y rápido.
- Verificar la instalación con: Kubectl get pods.
> helm repo add camunda https://helm.camunda.io > helm repo update > helm install refactorizando camunda/camunda-platform
Si queremos cambiar el número de instancias podemos aplicar lo siguiente:
> helm install refactorizando camunda/camunda-platform --set zeebe-gateway.replicas=1 --set zeebe.clusterSize=1 --set zeebe.replicationFactor=1 --set zeebe.partitionCount=1
En la instalación de helm anterior nos hemos asegurado de crear únicamente una replica e instancia tanto de zeebe como de gateway. Se puede mirar en la documentación más configuraciones.
Arrancar Zeebe con Docker
Para arrancar Zeebe y los diferentes servicios asociados vamos a hacer uso de docker para ello:
Descargar el docker-compose.yaml de aquí: https://github.com/camunda/camunda-platform/blob/main/docker-compose.yaml
docker-compose up -d
En el docker compose que vamos a instalar tendremos la instalación de keycloak cuya password y user es demo/demo, que será necesaria para entrar al operator y ver el flujo.
Arrancar Zeebe con los binarios
Y la última manera que tenemos de arrancar zeebe es descarngando el proyecto de aquí: zeebe.
Configurar Spring Boot con Zeebe
Pasos para crear un proyecto en Spring Boot con Zeebe
- Para definir el workflow puedes hacer uso de Zeebe Modeler.
- Crea y despliega instancias de tus workflows con zbctl.
- Crear proyecto Spring Boot con la dependencia de Zeebe y crear los workers.
- Enviar la info a una Base de Datos.
- Usar Zeebe Operate para monitorizar las instancias de Workflow.
Definir Workflow con Zeebe Modeler
Podemos descargarnos Zeebe Modeler para hacer los flujos de nuestro sistema:
Uso de zbctl para cargar el workflow definido
Podemos descargarnos de aquí el cliente zbctl para interactúar con el clúster.
Con nuestro docker compose running vamos a ejecutar el siguiente comando con zbctl.
> zbctl status --insecure
Deploy del workflow
Vamos a hacer un deploy del flujo que hemos creado con zeebe modeler. Para ello ejecutamos el siguiente comando:
zbctl deploy alert-process.bpmn --insecure
Una vez hemos creado el proceso en nuestro clúster de zeebe es el momento de crear las instancias. Vamos a crear dos instancias con los dos flujos posibles:
> zbctl create instance ALERT_PROCESS --variables "{\"alertReason\" : \"thieve\"}" --insecure
y el otro flujo
> zbctl create instance ALERT_PROCESS --variables "{\"alertReason\" : \"injured\"}" --insecure
Analizar instancias creadas a través del operador
Cuando hemos ejecutado nuestro docker compose se ha creado el servicio operator, este servicio nos va a ayudar a ver el flujo y las instancias definidas. Para acceder ejecutamos http://localhost:8081. La contraseña que va a pedir nuestro keycloak desplegado es demo/demo.
Una vez dentro podremos ver antes de lanzar nuestra aplicación Spring Boot como se han creado las instancias y una vez lanzada la aplicación, los procesos terminado.
Dependencia Maven
Lo primero que tenemos que hacer para poder usar Zeebe con una aplicación Spring Boot es añadir su dependencia Maven:
<dependency> <groupId>io.zeebe.spring</groupId> <artifactId>spring-zeebe-starter</artifactId> <version>${zeebe.version}</version> </dependency>
Creación de Worker
A continuación crearemos los workers de Zeebe haciendo uso de la anotación @ZeebeWorker.
Vamos a crear tres workers siguiendo el modelo que hemos creado, classify, hospital y prison.
Estos workers se ejecutaran en función del modelado establecido y de los datos de entrada introducidos al workflow
El cliente de Java nos proporciona un worker para gestionar el polling para los jobs disponibles. De esta manera evitamos tener que realizar esta gestión y únicamente nos centramos en la codificación de los jobs activos.
@ZeebeWorker(type = "hospital", name = "main-worker") public void hospitalCoordination(final JobClient client, final ActivatedJob job) { logJob(job); client.newCompleteCommand(job.getKey()).send().join(); }
Activación de Zeebe en tu aplicación Spring Boot
Para poder hacer uso de Zeebe en tu aplicación Spring Boot tendrás que realizar la activación de Zeebe a través de la siguiente anotación @EnableZeebeClient.
Configuración en propieades de Zeebe
En función de donde tengas desplegado Zeebe tendrás que configurarlo en tu fichero de propiedades:
zeebe.client.broker.contactPoint: 127.0.0.1:26500
La comunicación del cliente con el clúster será a través de gRPC
Conclusión
En esta entrada sobre ejemplo de Zeebe con Spring Boot en Docker, hemos visto como podemos hacer uso de Zeebe para una orquestación de flujos de trabajo. Zeebe nos va ayudar y a facilitar crear una orquestación de microservicios. Si quieres ver el ejemplo de Spring Boot puedes echar un ojo aquí.
Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com o también nos puedes contactar por nuestras redes sociales Facebook o twitter y te ayudaremos encantados!