Introducción a Dapr .NET SDK (5/N): Bindings/Triggers


Y seguimos con la serie de posts sobre #Dapr incluso en vacaciones. En este articulo vamos a ver como hacer uso de los Bindins tando de entrada com ode salida (input y output respectivametne. Como en los casos anteriores vamos a ver ejemplos de componente en Azure. Para este caso usaresmos Azure Storage Queues.

A continuación, el listado completo de posts relacionados sobre los que iré trabajando y publicando:

  1. Introducción a Dapr .NET SDK (1/N) y Service-to-service invocation
  2. Introducción a Dapr .NET SDK (2/N): State management
  3. Introducción a Dapr .NET SDK (3/N): Secrets
  4. Introducción a Dapr .NET SDK (4/N): Pub/Sub
  5. [ -> ] Introducción a Dapr .NET SDK (5/N): Bindings y Triggers
  6. Introducción a Dapr .NET SDK (6/N): Debugging (VSCode y VS) + Sidekick
  7. Introducción a Dapr .NET SDK (7/N): Docker Compose and HTTPS
  8. Introducción a Dapr .NET SDK (8/N): Kubernetes mode

Input Binding

Como punto de partida, lo hacemos creando una nueva Storage Account en Azure y creando una cola (Azure Queue Storage) con el el nombre «queuedemo1«, por ejemplo.

Una vez disponemos de nuestra cola en Azure, continuamos con los siguientes pasos. Como siempre, el código de ejemplo podemos encontrarlo aquí, en mi github

Crear un proyecto de tipo Web Api (webapi) y añadir la referencia (paquete nuget) «Dapr.AspNetCore«.

Actualizar el controller como sigue, asegurando que el nombre del controller es «bindingeventdemo» y el método post no contiene ningun nombre especifacdo. Es decir, el método POST debe coincidir con el metodo POST predeterminado del controller.

[ApiController]
[Route("bindingeventdemo")]
public class WeatherForecastController : ControllerBase
{
    private readonly ILogger<WeatherForecastController> _logger;
    public WeatherForecastController(ILogger<WeatherForecastController> logger)
    {
        _logger = logger;
    }
    [HttpPost]
    public void ProcessEvent(WeatherForecast forecast)
    {
        _logger.LogInformation("Binding event received from Azure Storage Queue !!!");
        _logger.LogInformation(
            $"-> Today ({forecast.Date.DayOfWeek}) will have {forecast.TemperatureC}C.");
    }
}

Al ejecutar la aplicación, nuestro swagger será el siguiente:

Añadir un nuevo componente Dapr: «azure.storage.queue-binding.yaml«, asegurando nuevamente que el nombre (metadata.name), se corresponde con el mismo nombre que hemos dado al controller («bindingeventdemo«).

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: bindingeventdemo1
  namespace: default
spec:
  type: bindings.azure.storagequeues
  version: v1
  metadata:
  - name: storageAccount
    value: "<AZURE-STORAGE-ACCOUNT-NAMNE>"
  - name: storageAccessKey
    value: "<AZURE-STORAGE-ACCOUNT-KEY>"
  - name: queue
    value: "<QUEUE-NAME>"
  - name: ttlInSeconds
    value: "60"

Sustituir en este componente los valores proporcionados con la Azure Storage Account, obtenidos a parir del Poral de Azure:

Para finalizar, ejecutamos la aplicación mediante la siguiente línea de comandos:

dapr run --app-id bindingeventdemo1 --app-port 5000 --dapr-http-port 3500 --dapr-grpc-port 50000 --components-path ./dapr/components -- dotnet run -p ./ApiApp/ApiApp.csproj

Desde el Azure Storate Explorer en el portal de Azure, o bien usando la aplicación de escritorio Azure Storage Explorer, añadimos un nuevo mensaje a la cola.

Usando Azure Storage Explorer (web) para enviar mensajes a la cola

Y, voilá, la aplicación recibe el mensaje y se ejecuta arrojando la siguiente salida:

Output Binding

Para la ejecución de bindings de salida (o output binding), basta con enviar un mensaje, utilizando para ello el método InvokeBindingAsyc de una instancia DaprClient. Para nuestro ejemplo, el valor del «Binding Name» ha de coincidir, y, por tanto, tiene que tener el valor «bindingeventdemo«.

La siguiente clase «OuputBindingSample .cs» muestra el ejemplo de ello:

public class OuputBindingSample : Example
{
    private static readonly string bindingName = "bindingeventdemo";
        
    // Allow output binding operations: create, get, delete, list
    private static readonly string operation = "create"; 
    public override string DisplayName => "Using de Output Binding";
    public override async Task RunAsync(CancellationToken cancellationToken)
    {
        using var client = new DaprClientBuilder().Build();

        var data = new WeatherForecast()
        {
            Date = DateTime.Today,
            TemperatureC = 12,
            Summary = "Sunny"
        };
        await client.InvokeBindingAsync(
                        bindingName,
                        operation,
                        data,
                        cancellationToken: cancellationToken);
        Console.WriteLine("Message has been sent !");
    }
}

A continuación ejecutamos nuevamente la instrucción anterior para que el API permanezca escuchando.

Y, ejecutamos también la aplicación de consola con un simple «dotnet run». Observaremos que el mensaje es enviado a la cola «queuedemo1» y el Binding/Trigger del API se disparará automáticamente con una salida similar a la anterior.

Importante: Los tipos de operaciones permitidas para el segundo parámetro («operation«) del método «InvokeBindingAsync» son: create, get, delete y list.

Happy #Dapr codding !!!

Referencias:

8 comentarios sobre “Introducción a Dapr .NET SDK (5/N): Bindings/Triggers

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.