Udostępnij przez


Powiązanie danych wyjściowych języka Dapr State dla usługi Azure Functions

Powiązanie danych wyjściowych stanu dapr umożliwia zapisanie wartości w stanie dapr podczas wykonywania funkcji.

Aby uzyskać informacje na temat konfiguracji i szczegółów konfiguracji rozszerzenia Języka Dapr, zobacz Omówienie rozszerzenia Języka Dapr.

Example

Funkcję języka C# można utworzyć przy użyciu jednego z następujących trybów języka C#:

Execution model Description
Model izolowanego pracownika Kod funkcji jest uruchamiany w osobnym procesie roboczym platformy .NET. Używaj z obsługiwanymi wersjami .NET i .NET Framework. Aby dowiedzieć się więcej, zobacz przewodnik dotyczący uruchamiania usługi Azure Functions w języku C# w izolowanym modelu procesu roboczego.
In-process model Kod funkcji jest uruchamiany w tym samym procesie co proces hosta usługi Functions. Obsługuje tylko wersje long term support (LTS) platformy .NET. Aby dowiedzieć się więcej, zobacz Tworzenie funkcji biblioteki klas języka C# przy użyciu usługi Azure Functions.

W poniższym przykładzie pokazano użycie powiązania danych wyjściowych stanu dapr w celu utrwalania nowego stanu w magazynie stanów.

[FunctionName("StateOutputBinding")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = "state/{key}")] HttpRequest req,
    [DaprState("statestore", Key = "{key}")] IAsyncCollector<string> state,
    ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

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

    return new OkResult();
}

Poniższy przykład tworzy "CreateNewOrderHttpTrigger" funkcję przy użyciu DaprStateOutput powiązania z elementem HttpTrigger:

@FunctionName("CreateNewOrderHttpTrigger")
public String run(
        @HttpTrigger(
            name = "req",
            methods = {HttpMethod.POST},
            authLevel = AuthorizationLevel.ANONYMOUS)
            HttpRequestMessage<Optional<String>> request,
        @DaprStateOutput(
            stateStore = "%StateStoreName%",
            key = "product")
        OutputBinding<String> product,
        final ExecutionContext context) {
    context.getLogger().info("Java HTTP trigger (CreateNewOrderHttpTrigger) processed a request.");
}

W poniższym przykładzie powiązanie danych wyjściowych stanu dapr jest sparowane z wyzwalaczem HTTP, który jest zarejestrowany przez app obiekt:

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

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

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

        return { value : 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 daprState output:

{
  "bindings": 
    {
      "type": "daprState",
      "stateStore": "%StateStoreName%",
      "direction": "out",
      "name": "order",
      "key": "order"
    }
}

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

In code:

using namespace System
using namespace Microsoft.Azure.WebJobs
using namespace Microsoft.Extensions.Logging
using namespace Microsoft.Azure.WebJobs.Extensions.Dapr
using namespace Newtonsoft.Json.Linq

param (
    $payload
)

# C# function processed a CreateNewOrder request from the Dapr Runtime.
Write-Host "PowerShell function processed a CreateNewOrder request from the Dapr Runtime."

# Payload must be of the format { "data": { "value": "some value" } }

# Convert the object to a JSON-formatted string with ConvertTo-Json
$jsonString = $payload| ConvertTo-Json

# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name order -Value $payload["data"]

W poniższym przykładzie przedstawiono powiązanie danych wyjściowych języka Dapr State, które używa modelu programowania w języku Python w wersji 2. Aby użyć daprState w kodzie aplikacji funkcji języka Python:

import logging
import json
import azure.functions as func

app = func.FunctionApp()

@app.function_name(name="HttpTriggerFunc")
@app.route(route="req", auth_level=dapp.auth_level.ANONYMOUS)
@app.dapr_state_output(arg_name="state", state_store="statestore", key="newOrder")
def main(req: func.HttpRequest, state: func.Out[str] ) -> str:
    # request body must be passed this way '{\"value\": { \"key\": \"some value\" } }'
    body = req.get_body()
    if body is not None:
        state.set(body.decode('utf-8'))
        logging.info(body.decode('utf-8'))
    else:
        logging.info('req body is none')
    return 'ok'

Attributes

In the in-process model, use the DaprState to define a Dapr state output binding, which supports these parameters:

Parameter Description Można wysłać za pośrednictwem atrybutu Można wysłać za pośrednictwem elementu RequestBody
StateStore Nazwa magazynu stanów do zapisania stanu. ✔️
Key Nazwa klucza do zapisania stanu w magazynie stanów. ✔️ ✔️
Value Required. Przechowywana wartość. ✔️

Annotations

Adnotacja DaprStateOutput umożliwia działanie dostępu do magazynu stanów.

Element Description Można wysłać za pośrednictwem atrybutu Można wysłać za pośrednictwem elementu RequestBody
stateStore Nazwa magazynu stanów do zapisania stanu. ✔️
key Nazwa klucza do zapisania stanu w magazynie stanów. ✔️ ✔️
value Required. Przechowywana wartość. ✔️

Configuration

W poniższej tabeli opisano właściwości konfiguracji powiązania ustawione w kodzie.

Property Description Można wysłać za pośrednictwem atrybutu Można wysłać za pośrednictwem elementu RequestBody
stateStore Nazwa magazynu stanów do zapisania stanu. ✔️
key Nazwa klucza do zapisania stanu w magazynie stanów. ✔️ ✔️
value Required. Przechowywana wartość. ✔️

The following table explains the binding configuration properties that you set in the function.json file.

function.json property Description Można wysłać za pośrednictwem atrybutu Można wysłać za pośrednictwem elementu RequestBody
stateStore Nazwa magazynu stanów do zapisania stanu. ✔️
key Nazwa klucza do zapisania stanu w magazynie stanów. ✔️ ✔️
value Required. Przechowywana wartość. ✔️

W poniższej tabeli opisano właściwości konfiguracji powiązania ustawione @dapp.dapr_state_output w kodzie języka Python.

Property Description Można wysłać za pośrednictwem atrybutu Można wysłać za pośrednictwem elementu RequestBody
stateStore Nazwa magazynu stanów do zapisania stanu. ✔️
key Nazwa klucza do zapisania stanu w magazynie stanów. ✔️ ✔️
value Required. Przechowywana wartość. ✔️

Jeśli właściwości są zdefiniowane zarówno w atrybutach, jak i RequestBody, priorytet jest przypisywany do danych podanych w pliku RequestBody.

See the Example section for complete examples.

Usage

Aby użyć powiązania danych wyjściowych stanu dapr, rozpocznij od skonfigurowania składnika magazynu stanów Dapr. Więcej informacji na temat tego, który składnik ma być używany i jak go skonfigurować, znajdziesz w oficjalnej dokumentacji języka Dapr.

Aby użyć elementu daprState w języku Python w wersji 2, skonfiguruj projekt przy użyciu poprawnych zależności.

  1. Tworzenie i aktywowanie środowiska wirtualnego.

  2. requirements.text W pliku dodaj następujący wiersz:

    azure-functions==1.18.0b3
    
  3. W terminalu zainstaluj bibliotekę języka Python.

    pip install -r .\requirements.txt
    
  4. local.setting.json Zmodyfikuj plik przy użyciu następującej konfiguracji:

    "PYTHON_ISOLATE_WORKER_DEPENDENCIES":1
    

Next steps

Dowiedz się więcej o zarządzaniu stanem dapr.