Compartilhar via


Associações de saída do Dapr Invoke para o Azure Functions

A associação de saída de invocação do Dapr permite invocar outro aplicativo Dapr durante uma execução de função.

Para obter informações sobre instalação e detalhes de configuração da extensão Dapr, consulte a Visão geral da extensão do Dapr.

Exemplo

A função C# pode ser criada usando um dos seguintes modos C#:

Modelo de execução Descrição
Modelo de trabalho isolado O código de função é executado em um processo de trabalho do .NET separado. Use com versões com suporte do .NET e do .NET Framework. Para saber mais, confira Desenvolver funções de processo de trabalho isolado no .NET.
Modelo em processo Seu código de função é executado no mesmo processo que o processo de host do Functions. Dá suporte apenas a versões LTS (suporte de longo prazo) do .NET. Para saber mais, confira Desenvolver funções de biblioteca de classes do .NET.

O exemplo a seguir demonstra o uso de uma associação de saída de invocação do Dapr para executar uma operação de invocação de serviço do Dapr hospedada em outro aplicativo dapr.ized. Neste exemplo, a função age como um proxy.

[FunctionName("InvokeOutputBinding")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", Route = "invoke/{appId}/{methodName}")] HttpRequest req,
    [DaprInvoke(AppId = "{appId}", MethodName = "{methodName}", HttpVerb = "post")] IAsyncCollector<InvokeMethodParameters> output,
    ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();

    var outputContent = new InvokeMethodParameters
    {
        Body = requestBody
    };

    await output.AddAsync(outputContent);

    return new OkResult();
}

O exemplo a seguir cria uma função "InvokeOutputBinding" usando a associação DaprInvokeOutput com um HttpTrigger:

@FunctionName("InvokeOutputBinding")
public String run(
        @HttpTrigger(
            name = "req",
            methods = {HttpMethod.GET, HttpMethod.POST},
            authLevel = AuthorizationLevel.ANONYMOUS,
            route = "invoke/{appId}/{methodName}")
            HttpRequestMessage<Optional<String>> request,
        @DaprInvokeOutput(
            appId = "{appId}", 
            methodName = "{methodName}", 
            httpVerb = "post")
        OutputBinding<String> payload,
        final ExecutionContext context)

No exemplo a seguir, a associação de saída de invocação de Dapr é emparelhada com um gatilho HTTP, que é registrado pelo objeto app:

const { app, trigger } = require('@azure/functions');

app.generic('InvokeOutputBinding', {
    trigger: trigger.generic({
        type: 'httpTrigger',
        authLevel: 'anonymous',
        methods: ['POST'],
        route: "invoke/{appId}/{methodName}",
        name: "req"
    }),
    return: daprInvokeOutput,
    handler: async (request, context) => {
        context.log("Node HTTP trigger function processed a request.");

        const payload = await request.text();
        context.log(JSON.stringify(payload));

        return { body: payload };
    }
});

Os exemplos a seguir mostram gatilhos do Dapr em um arquivo function.json e o código do PowerShell que usa essas associações.

Aqui está o arquivo function.json para o daprInvoke:

{
  "bindings":
    {
      "type": "daprInvoke",
      "direction": "out",
      "appId": "{appId}",
      "methodName": "{methodName}",
      "httpVerb": "post",
      "name": "payload"
    }
}

Para obter mais informações sobre as propriedades do arquivo function.json, consulte a seção Configuração.

No código:

using namespace System.Net

# Input bindings are passed in via param block.
param($req, $TriggerMetadata)

# Write to the Azure Functions log stream.
Write-Host "Powershell InvokeOutputBinding processed a request."

$req_body = $req.Body

$invoke_output_binding_req_body = @{
    "body" = $req_body
}

# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name payload -Value $invoke_output_binding_req_body

Push-OutputBinding -Name res -Value ([HttpResponseContext]@{
    StatusCode = [HttpStatusCode]::OK
    Body = $req_body
})

O exemplo a seguir mostra uma associação de saída de invocação do Dapr, que usa o modelo de programação do Python v2. Para usar o código daprInvoke do aplicativo de funções do Python:

import logging
import json
import azure.functions as func

app = func.FunctionApp()

@app.function_name(name="InvokeOutputBinding")
@app.route(route="invoke/{appId}/{methodName}", auth_level=dapp.auth_level.ANONYMOUS)
@app.dapr_invoke_output(arg_name = "payload", app_id = "{appId}", method_name = "{methodName}", http_verb = "post")
def main(req: func.HttpRequest, payload: func.Out[str] ) -> str:
    # request body must be passed this way "{\"body\":{\"value\":{\"key\":\"some value\"}}}" to use the InvokeOutputBinding, all the data must be enclosed in body property.
    logging.info('Python function processed a InvokeOutputBinding request from the Dapr Runtime.')

    body = req.get_body()
    logging.info(body)
    if body is not None:
        payload.set(body)
    else:
        logging.info('req body is none')
    return 'ok'

Atributos

No modelo em processo, use o atributo DaprInvoke para definir uma associação de saída de invocação do Dapr, que dá suporte a esses parâmetros:

Parâmetro Descrição Pode ser enviado por meio de Atributo Pode ser enviado por meio de RequestBody
AppId A ID do aplicativo Dapr a ser invocada. ✔️ ✔️
MethodName O nome do método do aplicativo a ser invocado. ✔️ ✔️
HttpVerb Opcional. Verbo HTTP para usar o aplicativo a ser invocado. O padrão é POST. ✔️ ✔️
Corpo Obrigatório. O corpo da solicitação. ✔️

Anotações

A anotação DaprInvokeOutput permite que você faça com que sua função invoque e ouça uma associação de saída.

Elemento Descrição Pode ser enviado por meio de Atributo Pode ser enviado por meio de RequestBody
appId A ID do aplicativo envolvido na associação de invocação. ✔️ ✔️
methodName O nome da variável de método. ✔️ ✔️
httpVerb Post ou get. ✔️ ✔️
Corpo Obrigatório. O corpo da solicitação. ✔️

Configuração

A tabela a seguir explica as propriedades de configuração de associação que você definiu no código.

Propriedade Descrição Pode ser enviado por meio de Atributo Pode ser enviado por meio de RequestBody
appId A ID do aplicativo envolvido na associação de invocação. ✔️ ✔️
methods Post ou get. ✔️ ✔️
Corpo Obrigatório. O corpo da solicitação. ✔️

A tabela a seguir explica as propriedades de configuração de associação que você define no arquivo function.json.

Propriedade function.json Descrição Pode ser enviado por meio de Atributo Pode ser enviado por meio de RequestBody
appId A ID do aplicativo envolvido na associação de invocação. ✔️ ✔️
methodName O nome da variável de método. ✔️ ✔️
httpVerb Post ou get. ✔️ ✔️
Corpo Obrigatório. O corpo da solicitação. ✔️

A tabela a seguir explica as propriedades de configuração de associação para @dapp.dapr_invoke_output definidas no código do Python.

Propriedade Descrição Pode ser enviado por meio de Atributo Pode ser enviado por meio de RequestBody
app_id A ID do aplicativo envolvido na associação de invocação. ✔️ ✔️
method_name O nome da variável de método. ✔️ ✔️
http_verb Definir como post ou get. ✔️ ✔️
Corpo Obrigatório. O corpo da solicitação. ✔️

Se as propriedades forem definidas em Atributos e RequestBody, a prioridade será fornecida aos dados disponíveis em RequestBody.

Consulte a Seção de exemplo para obter exemplos completos.

Uso

Para usar a associação de saída de invocação do serviço Dapr, saiba mais sobre como usar a invocação do serviço Dapr na documentação oficial do Dapr.

Para usar a opção daprInvoke no Python v2, configure seu projeto com as dependências corretas.

  1. Criar e ativar um ambiente virtual.

  2. No arquivo requirements.text, adicione a seguinte linha:

    azure-functions==1.18.0b3
    
  3. No terminal, instale a biblioteca do Python.

    pip install -r .\requirements.txt
    
  4. Altere o arquivo local.setting.json com a configuração a seguir:

    "PYTHON_ISOLATE_WORKER_DEPENDENCIES":1
    

Próximas etapas

Saiba mais sobre a invocação do serviço do Dapr.