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.
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.
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:
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");
}
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:
Que te quedaría por hacer.
Tres cosas:
- Si quieres depurar con más tranquilidad, coger cualquiera de mis proyectos anteriores que usa docker e incluir un docker compose.
- Añadir una dependencia de ejecución, que Test dependa de Host.
- Añadir una dependencia a Redis, que este caso usamos las opciones standar de un «dapr install» por simplicidad.