Compartilhar via


Associação de saída de invocação de dapr para o Azure Functions

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

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

Example

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

Execution model Description
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, consulte Guia para executar o C# Azure Functions no modelo de trabalho isolado.
In-process model 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 da biblioteca de classes C# usando o Azure Functions.

O exemplo a seguir demonstra o uso de uma associação de saída de invocação de Dapr para executar uma operação de invocação de serviço 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 "InvokeOutputBinding" função usando a DaprInvokeOutput associação 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 app objeto:

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 };
    }
});

The following examples show Dapr triggers in a function.json file and PowerShell code that uses those bindings.

Here's the function.json file for daprInvoke:

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

For more information about function.json file properties, see the Configuration section.

In code:

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 Depr Invoke, que usa o modelo de programação do Python v2. Para usar daprInvoke em seu código 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'

Attributes

In the in-process model, use the DaprInvoke attribute to define a Dapr invoke output binding, which supports these parameters:

Parameter Description 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 Optional. Verbo HTTP para usar o aplicativo a ser invocado. O padrão é POST. ✔️ ✔️
Body Required. O corpo da solicitação. ✔️

Annotations

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

Element Description 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 Postar ou obter. ✔️ ✔️
body Required. O corpo da solicitação. ✔️

Configuration

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

Property Description 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 Postar ou obter. ✔️ ✔️
body Required. 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.

function.json property Description 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 Postar ou obter. ✔️ ✔️
body Required. 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.

Property Description 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. ✔️ ✔️
body Required. O corpo da solicitação. ✔️

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

See the Example section for complete examples.

Usage

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. Modifique seu arquivo local.setting.json com a seguinte configuração:

    "PYTHON_ISOLATE_WORKER_DEPENDENCIES":1
    

Next steps

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