Partilhar via


Dapr Invoke vinculação de saída para o Azure Functions

A ligação de saída de invocação do Dapr permite que você invoque outro aplicativo Dapr durante a execução de uma função.

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

Exemplo

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

Modelo de execução Description
Modelo de trabalhador isolado Seu código de função é executado em um processo de trabalho .NET separado. Use com versões suportadas do .NET e .NET Framework. Para saber mais, consulte Desenvolver funções de processo de trabalho isoladas do .NET.
Modelo em processo Seu código de função é executado no mesmo processo que o processo de host de funções. Suporta apenas versões LTS (Long Term Support) do .NET. Para saber mais, consulte Desenvolver funções de biblioteca de classes .NET.

O exemplo a seguir demonstra o uso de uma ligaçã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-izado. Neste exemplo, a função atua 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 ligação de saída de invocação Dapr é emparelhada com um gatilho app HTTP, que é registrado pelo 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 };
    }
});

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

Aqui está o arquivo function.json para daprInvoke:

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

Para obter mais informações sobre function.json propriedades do arquivo, 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 ligação de saída Dapr Invoke, que usa o modelo de programação Python v2. Para usar daprInvoke no código do aplicativo de função 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 DaprInvoke atributo para definir uma ligação de saída de invocação Dapr, que suporta estes parâmetros:

Parâmetro Description Pode ser enviado via Atributo Pode ser enviado via RequestBody
AppId O ID do aplicativo Dapr a ser invocado. ✔️ ✔️
MethodName O nome do método do aplicativo a ser invocado. ✔️ ✔️
Verbo Http Opcional. Verbo HTTP para usar do aplicativo a ser invocado. A predefinição é POST. ✔️ ✔️
Corpo Obrigatório. O corpo do pedido. ✔️

Anotações

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

Elemento Description Pode ser enviado via Atributo Pode ser enviado via RequestBody
appId O ID do aplicativo envolvido na associação de invocação. ✔️ ✔️
methodName O nome da variável de método. ✔️ ✔️
httpVerbo Postar ou receber. ✔️ ✔️
corpo Obrigatório. O corpo do pedido. ✔️

Configuração

A tabela a seguir explica as propriedades de configuração de vinculação definidas no código.

Property Description Pode ser enviado via Atributo Pode ser enviado via RequestBody
appId O ID do aplicativo envolvido na associação de invocação. ✔️ ✔️
Metodologia Postar ou receber. ✔️ ✔️
corpo Obrigatório. O corpo do pedido. ✔️

A tabela a seguir explica as propriedades de configuração de vinculação definidas no arquivo function.json.

function.json propriedade Description Pode ser enviado via Atributo Pode ser enviado via RequestBody
appId O ID do aplicativo envolvido na associação de invocação. ✔️ ✔️
methodName O nome da variável de método. ✔️ ✔️
httpVerbo Postar ou receber. ✔️ ✔️
corpo Obrigatório. O corpo do pedido. ✔️

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

Property Description Pode ser enviado via Atributo Pode ser enviado via RequestBody
app_id O ID do aplicativo envolvido na associação de invocação. ✔️ ✔️
method_name O nome da variável de método. ✔️ ✔️
http_verb Defina como post ou get. ✔️ ✔️
corpo Obrigatório. O corpo do pedido. ✔️

Se as propriedades forem definidas em Atributos e RequestBody, será dada prioridade aos dados fornecidos em RequestBody.

Consulte a seção Exemplo para obter exemplos completos.

Utilização

Para usar a vinculaçã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 o daprInvoke em Python v2, configure seu projeto com as dependências corretas.

  1. Crie e ative um ambiente virtual.

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

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

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

    "PYTHON_ISOLATE_WORKER_DEPENDENCIES":1
    

Próximos passos

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