Extensão Dapr para Azure Functions

Importante

A Extensão Dapr para Azure Functions está atualmente em versão prévia e só tem suporte em ambientes de Aplicativos de Contêiner do Azure.

A Extensão Dapr para Azure Functions é um conjunto de ferramentas e serviços que permitem que os desenvolvedores integrem facilmente o Azure Functions à plataforma do Dapr (Distributed Apps Runtime).

O Azure Functions é um serviço de computação controlado por eventos que fornece um conjunto de gatilhos e associações para facilitar a conexão com outros serviços do Azure. O Dapr fornece um conjunto de blocos de construção e melhores práticas para a criação de aplicativos distribuídos, incluindo microsserviços, gerenciamento de estado, mensagens pub/sub e muito mais.

Com a integração entre o Dapr e o Functions, você pode criar funções que reagem a eventos do Dapr ou de sistemas externos.

Ação Direção Tipo
Disparar em uma associação de entrada do Dapr N/D daprBindingTrigger
Disparar em uma invocação de serviço do Dapr N/D daprServiceInvocationTrigger
Disparar em uma assinatura de tópico do Dapr N/D daprTopicTrigger
Efetuar pull no estado do Dapr para uma execução In daprState
Efetuar pull nos segredos do Dapr para uma execução In daprSecret
Salvar um valor em um estado do Dapr Saída daprState
Invocar outro aplicativo do Dapr Saída daprInvoke
Publicar uma mensagem em um tópico do Dapr Saída daprPublish
Enviar um valor a uma associação de saída do Dapr Saída daprBinding

Instalar a extensão

O pacote NuGet de extensão instalado depende do processo ou do processo de trabalho isolado do C# que você estiver usando no seu aplicativo de funções:

Essa extensão está disponível instalando o pacote NuGet, versão 0.17.0-preview01.

Usando a CLI do .NET:

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

Instalar pacote

É possível adicionar a extensão de versão prévia adicionando ou substituindo o seguinte código no arquivo host.json:

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

Habilitação do Dapr

Você pode configurar o Dapr usando vários [argumentos e anotações] [dapr-args] com base no contexto de runtime. Você pode configurar o Dapr para o Azure Functions por dois canais:

  • Modelos de IaC (infraestrutura como código), como em modelos do Bicep ou do ARM (Azure Resource Manager)
  • O portal do Azure

Ao usar um modelo de IaC, especifique os seguintes argumentos na seção properties da definição de recurso do aplicativo de contêiner.

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

Os valores de configuração do Dapr acima são considerados alterações no escopo do aplicativo. Quando você executa um aplicativo de contêiner em vários modos de revisão, as alterações nessas configurações não criarão uma nova revisão. Em vez disso, todas as revisões existentes serão reiniciadas para garantir que elas estejam configuradas com os valores mais atualizados.

Ao configurar o Dapr usando o portal do Azure, navegue até seu aplicativo de funções e selecione Dapr no menu esquerdo:

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

Portas e ouvintes do Dapr

Quando você está disparando uma função do Dapr, a extensão expõe a porta 3001 automaticamente para escutar solicitações recebidas do sidecar do Dapr.

Importante

A porta 3001 só será exposta e escutada se um gatilho do Dapr for definido no aplicativo de funções. Ao usar o Dapr, o sidecar aguarda o recebimento de uma resposta da porta definida antes de concluir a instanciação. Não definir a anotação dapr.io/port nem --app-port, a menos que você tenha um gatilho. Isso pode bloquear seu aplicativo do sidecar do Dapr.

Se você estiver usando apenas associações de entrada e saída, a porta 3001 não precisará ser exposta nem definida.

Por padrão, quando o Azure Functions tenta se comunicar com o Dapr, ele chama o Dapr pela porta resolvida usando a variável de ambiente DAPR_HTTP_PORT. Se essa variável for nula, ela usará como padrão a porta 3500.

Você pode substituir o endereço do Dapr usado por associações de entrada e saída definindo a propriedade DaprAddress no function.json para a associação (ou o atributo). Por padrão, ele usa http://localhost:{DAPR_HTTP_PORT}.

O aplicativo de funções ainda expõe outra porta e ponto de extremidade para itens como gatilhos de HTTP, que localmente é 7071 por padrão. Mas em um contêiner, o padrão é 80.

Tipos de associação

Os tipos de associação com suporte para .NET dependem da versão da extensão e do modo de execução do C#, que pode ser um dos seguintes:

Uma biblioteca de classes em processo é uma função C# compilada no mesmo processo que o runtime do Functions.

A extensão do Dapr dá suporte a tipos de parâmetro de acordo com a tabela abaixo.

Associação Tipos de parâmetro
Gatilho do Dapr daprBindingTrigger
daprServiceInvocationTrigger
daprTopicTrigger
Entrada do Dapr daprState
daprSecret
Saída do Dapr daprState
daprInvoke
daprPublish
daprBinding

Para obter exemplos de como usar esses tipos, confira o repositório GitHub da extensão.

Experimentar a extensão do Dapr no Azure Functions

Saiba como usar a extensão do Dapr no Azure Functions pelos exemplos fornecidos.

Exemplos Descrição
Início rápido Introdução ao uso da associação de pub/sub do Dapr e HttpTrigger.
Dapr Kafka Saiba como usar a extensão do Dapr do Azure Functions com o componente do Dapr de associações do Kafka.
.NET em processo Saiba como usar o modelo em processo do Azure Functions para integrar com vários componentes do Dapr no .NET, como Invocação de Serviço, Pub/sub, Associações e Gerenciamento de Estado.
Isolado do .NET Integrar com componentes do Dapr no .NET usando o modelo de execução OOP (fora de processo) do Azure Functions.

Experimentar a extensão do Dapr no Azure Functions

Saiba como usar a extensão do Dapr no Azure Functions pelos exemplos fornecidos.

Exemplos Descrição
Funções do Java Saiba como usar a extensão do Dapr do Azure Functions com Java.

Experimentar a extensão do Dapr no Azure Functions

Saiba como usar a extensão do Dapr no Azure Functions pelos exemplos fornecidos.

Exemplos Descrição
Início rápido Introdução ao uso da associação de pub/sub do Dapr e HttpTrigger.
Dapr Kafka Saiba como usar a extensão do Dapr do Azure Functions com o componente do Dapr de associações do Kafka.
JavaScript Execute um aplicativo de função do Dapr do JavaScript e integre a Invocação de Serviço, Pub/sub, Associações e Gerenciamento de Estado do Dapr usando o Azure Functions.

Experimentar a extensão do Dapr no Azure Functions

Saiba como usar a extensão do Dapr no Azure Functions pelos exemplos fornecidos.

Exemplos Descrição
Funções do PowerShell Saiba como usar a extensão do Dapr do Azure Functions com PowerShell.

Experimentar a extensão do Dapr no Azure Functions

Saiba como usar a extensão do Dapr no Azure Functions pelos exemplos fornecidos.

Exemplos Descrição
Dapr Kafka Saiba como usar a extensão do Dapr do Azure Functions com o componente do Dapr de associações do Kafka.
Python v1 Execute um aplicativo Python do tipo Dapr e use o modelo de programação Python v1 do Azure Functions para integrar aos componentes do Dapr.
Python v2 Inicie um aplicativo Dapr usando o modelo de programação Python v2 do Azure Functions para integrar aos componentes do Dapr.

Solução de problemas

Esta seção descreve como solucionar problemas que podem ocorrer ao usar a extensão Dapr para o Azure Functions.

Verifique se o Dapr está habilitado em seu ambiente

Se você estiver usando associações e gatilhos do Dapr no Azure Functions e o Dapr não estiver habilitado em seu ambiente, poderá receber a mensagem de erro: Para habilitar o Dapr em seu ambiente: Dapr sidecar isn't present. Please see (https://aka.ms/azure-functions-dapr-sidecar-missing) for more information.

  • Se sua Função do Azure for implantada nos Aplicativos de Contêiner do Azure, consulte as instruções de habilitação do Dapr para a extensão do Dapr para o Azure Functions.

  • Se sua Função do Azure for implantada no Kubernetes, verifique se a configuração YAML da implantação tem as seguintes anotações:

    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>"
      ...
    
  • Se você estiver executando sua Função do Azure localmente, execute o seguinte comando para garantir que está executando o aplicativo de função com o Dapr:

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

Verificar o valor da porta do aplicativo na configuração do Dapr

A extensão Dapr para o Azure Functions inicia um servidor HTTP na porta 3001 por padrão. Você pode configurar essa porta usando a DAPR_APP_PORT variável de ambiente.

Se você fornecer um valor de porta de aplicativo incorreto ao executar um aplicativo do Azure Functions, poderá receber a mensagem de erro: Para resolver essa mensagem de erro: 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).

  1. Nas configurações de Dapr do aplicativo de contêiner:

    • Se você estiver usando um gatilho Dapr em seu código, verifique se a porta do aplicativo está definida como 3001 ou para o DAPR_APP_PORT valor da variável de ambiente.

    • Se você não estiver usando um gatilho Dapr em seu código, verifique se a porta do aplicativo não está definida. Ele deve estar vazio.

  2. Verifique se você fornece o valor correto da porta do aplicativo na configuração do Dapr.

    • Se você estiver usando os Aplicativos de Contêiner do Azure, especifique a porta do aplicativo no Bicep:

      DaprConfig: {
         ...
         appPort: <DAPR_APP_PORT>
         ...
      }
      
    • Se você estiver usando um ambiente Kubernetes, defina a dapr.io/app-port anotação:

      annotations:
         ...
         dapr.io/app-port: "<DAPR_APP_PORT>"
         ...
      
    • Se você estiver desenvolvendo localmente, verifique se você definiu --app-port ao executar o aplicativo de função com o Dapr:

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

Próximas etapas

Saiba mais sobre o Dapr.