Como es habitual: los antencedentes

Aproximadamente 1 año hace que publiqué una Trilogía de Modernización de Microservicios, que suman más de 150 páginas para tu autoformación y si sumas la del Proyecto Tye casi nos acercamos a las 200 páginas (en GitHub los correspondientes ejemplos):

Donde hablaba desde Dapr hasta el proyecto Tye. Incluso una charla pude dar de Introducción al Project Tye.

Las cosas parece que tienen recurrencia y hace poco he vuelto a un proyecto donde se hace uso de Dapr, y esta es la razón del artículo.

Si quieres rizar el rizo, tambien recomiendo que leas mi libro de Monitorización moderna de aplicaciones.

Así tendrás una nada despreciable cantidad de 300 páginas para leer en estas vacaciones.

El problema

Como me gusta mucho el tema de IoT y el patrón de Actores es un modelo que se usa ampliamente en IoT he creado un pequeño ejemplo funcional para que veáis cómo funciona.

Tambien lo he creado debido a que la ayuda de Dapr no es nada clara y cuesta mucho hacer funcionar el ejemplo, si es que lo logras y lo mismo pasa con la de Microsoft.

Solución

Ir al repositorio de GitHub https://github.com/jmfloreszazo/DaprActorModelWithNet6

En el Readme he dejado los pasos para que puedas lanzar este mini proyecto. Que pondré aquí tambien con alguna foto intermedia.

LLamada de apitwo a apione

Para poder llegar a la imagen anterior, primero debes cargar el proyecto y entender que estamos haciendo o bien lanzar los comando del Readme y luego estudiar el codigo… como más te guste.

Contenedores de Dapr y APIS

El proyecto DarpActorSample.Actor, tiene la interface. Cuando tenga el monográfico de Orelans entenderéis mejor por qué se usa una interface, os adelanto que tiene que ver con Actores Virtuales que es en lo que se basa Dapr.

Y es en el proyecto DarpActorSample.ActorHost donde esta toda la sustancia del proyecto.

La parte más importante es:

Minimal API de apitwo

Y el codigo de Actor que es el siguiente:

public class DoorActor : Actor, IDoorActor, IRemindable
{
    private const string StateName = "door_data";

    public DoorActor(ActorHost host) : base(host)
    {
    }

    protected override async Task OnActivateAsync()
    {
        await base.OnActivateAsync();

        var stateExists = await StateManager.ContainsStateAsync(StateName);
        if (!stateExists)
        {
            var data = new DoorData {IsDoorOpen = true};
            await StateManager.SetStateAsync(StateName, data);
        }
    }

Este es un extracto, pero podrás ver la herencia que es lo más importante para poder hacer funcionar los actores.

Como punto final al código DaprActorSample.Test, que es donde hacemos uso de los actores.

            var actorId = new ActorId("1");
            var doorProxy = ActorProxy.Create<IDoorActor>(actorId, "DoorActor");
            Console.WriteLine("Close Door");
            await doorProxy.DoorClose();
            Console.WriteLine("Open Door");
            await doorProxy.DoorOpen();
            var isOpen = await doorProxy.IsDoorOpen();
            if (isOpen)
            {
                Console.WriteLine("Test: Door is open");
            }

En el readme os cuento que realicéis una desinstalación e instalación de dapr, porque quiero usar zipkin y redis que viene instalado por defecto:

Minimal API de apitwo

Lo que nos permitirá poder usar el dashboard de Dapr y ver que tenemos cargado y lo mas importante, ver como Zipkin está trabajando. Para entrar solo teneis que acceder a la url que os marca el contenedor:

Minimal API de apitwo
Minimal API de apitwo
Minimal API de apitwo
Que te quedaría por hacer.

Tres cosas:

  1. Si quieres depurar con más tranquilidad, coger cualquiera de mis proyectos anteriores que usa docker e incluir un docker compose.
  2. Añadir una dependencia de ejecución, que Test dependa de Host.
  3. Añadir una dependencia a Redis, que este caso usamos las opciones standar de un «dapr install» por simplicidad.