Ejemplo de Zeebe con Spring Boot en Docker

Ejemplo Zeebe con Spring Boot

Ejemplo Zeebe con Spring Boot


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.

Arquitectura de Zeebe | Ejemplo de Zeebe con Spring Boot en Docker
Zeebe arquitectura

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:

Modelado de sistema de alarma | Ejemplo de Zeebe con Spring Boot en Docker
Modelado de sistema de alarma

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
Estado del clúster de Zeebe
Estado del clúster de Zeebe

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!


Deja una respuesta

Tu dirección de correo electrónico no será publicada.