Partager via


Liaison de sortie Dapr Invoke pour Azure Functions

La liaison de sortie Dapr Invoke vous permet d’appeler une autre application Dapr pendant l’exécution d’une fonction.

Pour plus d’informations sur l’installation et la configuration de l’extension Dapr, consultez la vue d’ensemble de l’extension Dapr.

Exemple

Une fonction C# peut être créée à l’aide de l’un des modes C# suivants :

Modèle d’exécution Description
Modèle de worker isolé Le code de votre fonction s’exécute dans un processus Worker .NET distinct. Utilisez avec les versions prises en charge de .NET et .NET Framework. Pour plus d’informations, consultez Développer les fonctions de processus Worker isolé .NET.
Modèle in-process Le code de votre fonction s’exécute dans le même processus que le processus hôte Functions. Prend uniquement en charge les versions LTS (Long Term Support) de .NET. Pour plus d’informations, consultez Développer des fonctions de bibliothèque de classes .NET.

L’exemple suivant montre l’utilisation d’une liaison de sortie Dapr Invoke pour effectuer une opération d’appel de service Dapr hébergée dans une autre application « Dapr-isée ». Dans cet exemple, la fonction fait office de 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();
}

L’exemple suivant crée une fonction "InvokeOutputBinding" à l’aide de la liaison DaprInvokeOutput avec un 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)

Dans l’exemple suivant, la liaison de sortie d’appel Dapr est associée à un déclencheur HTTP, qui est inscrit par l’objet 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 };
    }
});

Les exemples suivants montrent les déclencheurs Dapr dans un fichier function.json et le code PowerShell qui utilise ces liaisons.

Voici le fichier function.json pour daprInvoke :

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

Pour plus d’informations sur les propriétés du fichier function.json, consultez la section Configuration.

Dans le 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
})

L’exemple suivant montre une liaison de sortie Dapr Invoke, qui utilise le modèle de programmation Python v2. Pour utiliser daprInvoke dans le code de votre application de fonction 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'

Attributs

Dans le modèle in-process, utilisez l’attribut DaprInvoke pour définir une liaison de sortie Dapr Invoke, qui prend en charge ces paramètres :

Paramètre Description Peut être envoyé via l’attribut Peut être envoyé via RequestBody
AppId ID d’application Dapr à appeler. ✔️ ✔️
MethodName Nom de la méthode de l’application à appeler. ✔️ ✔️
HttpVerb facultatif. Verbe HTTP à utiliser pour l’application à appeler. La valeur par défaut est POST. ✔️ ✔️
Corps Obligatoire. Corps de la requête. ✔️

Annotations

L’annotation DaprInvokeOutput vous permet d’avoir votre fonction qui appelle et écoute une liaison de sortie.

Élément Description Peut être envoyé via l’attribut Peut être envoyé via RequestBody
ID_application ID de l’application impliquée dans la liaison d’appel. ✔️ ✔️
methodName Nom de la variable de méthode. ✔️ ✔️
httpVerb Post ou get. ✔️ ✔️
corps Obligatoire. Corps de la requête. ✔️

Configuration

Le tableau suivant décrit les propriétés de configuration de liaison que vous définissez dans le code.

Propriété Description Peut être envoyé via l’attribut Peut être envoyé via RequestBody
ID_application ID de l’application impliquée dans la liaison d’appel. ✔️ ✔️
methods Post ou get. ✔️ ✔️
corps Obligatoire. Corps de la requête. ✔️

Le tableau suivant décrit les propriétés de configuration de liaison que vous définissez dans le fichier function.json.

Propriété function.json Description Peut être envoyé via l’attribut Peut être envoyé via RequestBody
ID_application ID de l’application impliquée dans la liaison d’appel. ✔️ ✔️
methodName Nom de la variable de méthode. ✔️ ✔️
httpVerb Post ou get. ✔️ ✔️
corps Obligatoire. Corps de la requête. ✔️

Le tableau suivant explique les propriétés de configuration de liaison pour @dapp.dapr_invoke_output que vous définissez dans votre code Python.

Propriété Description Peut être envoyé via l’attribut Peut être envoyé via RequestBody
app_id ID de l’application impliquée dans la liaison d’appel. ✔️ ✔️
method_name Nom de la variable de méthode. ✔️ ✔️
http_verb Définissez post sur get. ✔️ ✔️
corps Obligatoire. Corps de la requête. ✔️

Si les propriétés sont définies dans les attributs et RequestBody, la priorité est attribuée aux données fournies dans RequestBody.

Pour obtenir des exemples complets, consultez la section Exemple.

Usage

Pour utiliser la liaison de sortie d’appel du service Dapr, explorez plus en détail comment utiliser l’appel du service Dapr dans la documentation officielle de Dapr.

Pour utiliser daprInvoke dans Python v2, configurez votre projet avec les dépendances appropriées.

  1. Créer et activer un environnement virtuel.

  2. Dans votre fichier requirements.text, ajoutez la ligne suivante :

    azure-functions==1.18.0b3
    
  3. Dans le terminal, installez la bibliothèque Python.

    pip install -r .\requirements.txt
    
  4. Modifiez votre fichier local.setting.json avec la configuration suivante :

    "PYTHON_ISOLATE_WORKER_DEPENDENCIES":1
    

Étapes suivantes

En savoir plus sur l’appel du service Dapr.