Udostępnij za pośrednictwem


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.

Przykład

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

Model wykonania opis
Model izolowanego procesu roboczego Kod funkcji jest uruchamiany w osobnym procesie roboczym platformy .NET. Używaj z obsługiwanymi wersjami platform .NET i .NET Framework. Aby dowiedzieć się więcej, zobacz Develop .NET isolated worker process functions (Tworzenie izolowanych funkcji procesów roboczych platformy .NET).
Model w procesie 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 platformy .NET.

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

W poniższych przykładach pokazano wyzwalacze języka Dapr w pliku function.json i kodzie programu PowerShell, który używa tych powiązań.

Oto plik function.json danych daprState wyjściowych:

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

Aby uzyskać więcej informacji na temat function.json właściwości pliku, zobacz sekcję Konfiguracja.

W kodzie:

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'

Atrybuty

W modelu przetwarzania użyj DaprState polecenia , aby zdefiniować powiązanie wyjściowe stanu Dapr, które obsługuje następujące parametry:

Parametr Opis 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. ✔️
Klawisz Nazwa klucza do zapisania stanu w magazynie stanów. ✔️ ✔️
Wartość Wymagany. Przechowywana wartość. ✔️

Adnotacje

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

Element opis 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. ✔️ ✔️
wartość Wymagany. Przechowywana wartość. ✔️

Konfigurowanie

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

Właściwości opis 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. ✔️ ✔️
wartość Wymagany. Przechowywana wartość. ✔️

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

właściwość function.json opis 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. ✔️ ✔️
wartość Wymagany. Przechowywana wartość. ✔️

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

Właściwości opis 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. ✔️ ✔️
wartość Wymagany. 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.

Zobacz sekcję Przykład, aby zapoznać się z kompletnymi przykładami.

Użycie

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
    

Następne kroki

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