Extensión Dapr para Azure Functions

Importante

La extensión Dapr para Azure Functions se encuentra actualmente en versión preliminar y solo se admite en entornos de Azure Container Apps.

La extensión Dapr para Azure Functions es un conjunto de herramientas y servicios que permiten a los desarrolladores integrar fácilmente Azure Functions con la plataforma Distributed Application Runtime (Dapr).

Azure Functions es un servicio de proceso controlado por eventos que proporciona un conjunto de desencadenadores y enlaces para conectarse fácilmente con otros servicios de Azure. Dapr proporciona un conjunto de bloques de compilación y procedimientos recomendados para compilar aplicaciones distribuidas, incluidos microservicios, administración de estado, mensajería pub/sub, etc.

Con la integración entre Dapr y Functions, puede compilar funciones que reaccionen a eventos de Dapr o sistemas externos.

Acción Dirección Tipo
Desencadenador en un enlace de entrada de Dapr N/D daprBindingTrigger
Desencadenador en una invocación del servicio Dapr N/D daprServiceInvocationTrigger
Desencadenador en una suscripción de tema de Dapr N/D daprTopicTrigger
Extracción en estado Dapr para una ejecución In daprState
Extracción de secretos de Dapr para una ejecución In daprSecret
Guardar un valor en un estado Dapr Fuera daprState
Invocación de otra aplicación Dapr Fuera daprInvoke
Publicación de un mensaje en un tema de Dapr Fuera daprPublish
Envío de un valor a un enlace de salida de Dapr Fuera daprBinding

Instalación de la extensión

El paquete NuGet de extensión que instale depende del modo de C# en proceso o proceso de trabajo aislado está usando en la aplicación de funciones:

Esta extensión está disponible instalando el Paquete NuGet, versión 0.17.0-preview01.

Mediante la CLI de .NET:

dotnet add package Microsoft.Azure.WebJobs.Extensions.Dapr --prerelease

Instalación del conjunto

Puede agregar la extensión de vista previa agregando o reemplazando el código siguiente en el archivo host.json:

{
  "version": "2.0",
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle.Preview",
    "version": "[4.*, 5.0.0)"
  }
}

Habilitación de Dapr

Puede configurar Dapr mediante varios [argumentos y anotaciones][dapr-args] en función del contexto de tiempo de ejecución. Puede configurar Dapr para Azure Functions a través de dos canales:

  • Plantillas de infraestructura como código (IaC), como en las plantillas de Bicep o Azure Resource Manager (ARM)
  • Azure Portal

Al usar una plantilla de IaC, especifique los argumentos siguientes en la sección properties de la definición de recursos de la aplicación de contenedor.

DaprConfig: {
  enabled: true
  appId: '${envResourceNamePrefix}-funcapp'
  appPort: 3001
  httpReadBufferSize: ''
  httpMaxRequestSize: ''
  logLevel: ''
  enableApiLogging: true
}

Los valores de configuración de Dapr anteriores se consideran cambios en el ámbito de la aplicación. Al ejecutar una aplicación de contenedor en modo de revisión múltiple, los cambios en esta configuración no crearán una nueva revisión. En su lugar, se reiniciarán todas las revisiones existentes para asegurarse de que están configuradas con los valores más recientes.

Al configurar Dapr mediante Azure Portal, vaya a la aplicación de funciones y seleccione Dapr en el menú de la izquierda:

Screenshot demonstrating where to find Dapr enablement for a Function App in the Azure portal.

Puertos y agentes de escucha de Dapr

Al desencadenar una función desde Dapr, la extensión expone automáticamente el puerto 3001 para escuchar las solicitudes entrantes desde el sidecar de Dapr.

Importante

El puerto 3001 solo se expone y escucha si se define un desencadenador Dapr en la aplicación de funciones. Cuando se usa Dapr, el sidecar espera a recibir una respuesta del puerto definido antes de completar la creación de instancias. No defina la anotacióndapr.io/port o --app-port a menos que tenga un desencadenador. Si lo hace, puede bloquear la aplicación desde el sidecar de Dapr.

Si solo usa enlaces de entrada y salida, no es necesario exponer ni definir el puerto 3001.

De forma predeterminada, cuando Azure Functions intenta comunicarse con Dapr, llama a Dapr a través del puerto resuelto desde la variable de entorno DAPR_HTTP_PORT. Si esa variable es null, el valor predeterminado es el puerto 3500.

Puede invalidar la dirección Dapr usada por los enlaces de entrada y salida estableciendo la propiedad DaprAddress en el enlace function.json (o el atributo). De manera predeterminada, usa http://localhost:{DAPR_HTTP_PORT}.

La aplicación de funciones todavía expone otro puerto y punto de conexión para cosas como desencadenadores HTTP, que de manera predeterminada local es 7071, pero en un contenedor, el valor predeterminado es 80.

Tipos de enlaces

Los tipos de enlace admitidos para .NET dependen de la versión de extensión y del modo de ejecución de C#, que puede ser uno de los siguientes:

Un biblioteca de clases en proceso es una función de C# compilada que se ejecuta en el mismo proceso que Functions Runtime.

La extensión Dapr admite tipos de parámetros según la tabla siguiente.

Enlace Tipos de parámetro
Desencadenador de Dapr daprBindingTrigger
daprServiceInvocationTrigger
daprTopicTrigger
Entrada de Dapr daprState
daprSecret
Salida de Dapr daprState
daprInvoke
daprPublish
daprBinding

Para obtener ejemplos de uso de estos tipos, consulte el repositorio de GitHub de la extensión.

Prueba de la extensión Dapr para Azure Functions

Aprenda a usar la extensión Dapr para Azure Functions mediante los ejemplos proporcionados.

Ejemplos Descripción
Guía de inicio rápido Introducción al uso del enlace de publicación/sub de Dapr y HttpTrigger.
Dapr Kafka Aprenda a usar la extensión Dapr de Azure Functions con el componente Dapr enlaces de Kafka.
.NET en curso Aprenda a usar el modelo en proceso de Azure Functions para integrarse con varios componentes de Dapr en .NET, como invocación de servicios, pub/sub, enlaces y administración de estado.
.NET aislado Integración con componentes de Dapr en .NET mediante el modelo de ejecución fuera de proceso (OOP) de Azure Functions.

Prueba de la extensión Dapr para Azure Functions

Aprenda a usar la extensión Dapr para Azure Functions mediante los ejemplos proporcionados.

Ejemplos Descripción
Java Functions Aprenda a usar la extensión Dapr de Azure Functions mediante Java.

Prueba de la extensión Dapr para Azure Functions

Aprenda a usar la extensión Dapr para Azure Functions mediante los ejemplos proporcionados.

Ejemplos Descripción
Guía de inicio rápido Introducción al uso del enlace de publicación/sub de Dapr y HttpTrigger.
Dapr Kafka Aprenda a usar la extensión Dapr de Azure Functions con el componente Dapr enlaces de Kafka.
JavaScript Ejecute una aplicación de funciones Dapr de JavaScript e integre con la invocación del servicio Dapr, Pub/sub, Bindings y State Management mediante Azure Functions.

Prueba de la extensión Dapr para Azure Functions

Aprenda a usar la extensión Dapr para Azure Functions mediante los ejemplos proporcionados.

Ejemplos Descripción
Funciones de PowerShell Aprenda a usar la extensión Dapr de Azure Functions con PowerShell.

Prueba de la extensión Dapr para Azure Functions

Aprenda a usar la extensión Dapr para Azure Functions mediante los ejemplos proporcionados.

Ejemplos Descripción
Dapr Kafka Aprenda a usar la extensión Dapr de Azure Functions con el componente Dapr enlaces de Kafka.
Python v1 Ejecute una aplicación de Python con Dapr-ized y use el modelo de programación de Python v1 de Azure Functions para integrarse con componentes de Dapr.
Python v2 Inicie una aplicación Dapr mediante el modelo de programación de Python v2 de Azure Functions para integrarse con los componentes de Dapr.

Solución de problemas

En esta sección se describe cómo solucionar problemas que pueden producirse al usar la extensión Dapr para Azure Functions.

Asegúrese de que Dapr está habilitado en el entorno

Si usa enlaces y desencadenadores de Dapr en Azure Functions y Dapr no está habilitado en su entorno, puede recibir el mensaje de error: Dapr sidecar isn't present. Please see (https://aka.ms/azure-functions-dapr-sidecar-missing) for more information. Para habilitar Dapr en su entorno:

  • Si la función de Azure se implementa en Azure Container Apps, consulte las instrucciones de habilitación de Dapr para la extensión Dapr para Azure Functions.

  • Si la función de Azure se implementa en Kubernetes, compruebe que la configuración de YAML de la implementación tiene las anotaciones siguientes:

    annotations:
      ...
      dapr.io/enabled: "true"
      dapr.io/app-id: "functionapp"
      # You should only set app-port if you are using a Dapr trigger in your code.
      dapr.io/app-port: "<DAPR_APP_PORT>"
      ...
    
  • Si ejecuta la función de Azure localmente, ejecute el siguiente comando para asegurarse de que ejecuta la aplicación de funciones con Dapr:

    dapr run --app-id functionapp --app-port <DAPR_APP_PORT>  --components-path <COMPONENTS_PATH> -- func host start 
    

Comprobación del valor de app-port en la configuración de Dapr

La extensión Dapr para Azure Functions inicia un servidor HTTP en el puerto 3001 de forma predeterminada. Puede configurar este puerto mediante la variable de DAPR_APP_PORT entorno.

Si proporciona un valor de puerto de aplicación incorrecto al ejecutar una aplicación de Azure Functions, puede recibir el mensaje de error: The Dapr sidecar is configured to listen on port {portInt}, but the app server is running on port {appPort}. This may cause unexpected behavior. For more information, visit [this link](https://aka.ms/azfunc-dapr-app-config-error). Para resolver este mensaje de error:

  1. En la configuración de Dapr de la aplicación contenedora:

    • Si usa un desencadenador Dapr en el código, compruebe que el puerto de la aplicación está establecido 3001 en o en el valor de la DAPR_APP_PORT variable de entorno.

    • Si no usa un desencadenador Dapr en el código, compruebe que el puerto de la aplicación no está establecido. Debería estar vacío.

  2. Compruebe que proporcione el valor de puerto de aplicación correcto en la configuración de Dapr.

    • Si usa Azure Container Apps, especifique el puerto de la aplicación en Bicep:

      DaprConfig: {
         ...
         appPort: <DAPR_APP_PORT>
         ...
      }
      
    • Si usa un entorno de Kubernetes, establezca la dapr.io/app-port anotación:

      annotations:
         ...
         dapr.io/app-port: "<DAPR_APP_PORT>"
         ...
      
    • Si está desarrollando localmente, compruebe que establece --app-port al ejecutar la aplicación de funciones con Dapr:

      dapr run --app-id functionapp --app-port <DAPR_APP_PORT> --components-path <COMPONENTS_PATH> -- func host start 
      

Pasos siguientes

Más información acerca de Dapr.