共用方式為


適用於 Azure Functions 的 Dapr 延伸模組

適用於 Azure Functions 的 Dapr 延伸模組是一組可讓開發人員輕鬆地整合 Azure Functions 與分散式應用程式執行階段 (Dapr) 平台的工具和服務。

Azure Functions 是事件驅動的計算服務,會提供一組可與其他 Azure 服務輕鬆連線的觸發程序和繫結。 Dapr 則會提供一組建置組塊和用於建置分散式應用程式的最佳做法,包括微服務、狀態管理、發佈/訂閱傳訊等等。

透過 Dapr 與 Azure Functions 的整合,您可以建置會針對來自 Dapr 或外部系統的事件做出回應的函式。

動作 方向 類型
針對 Dapr 輸入繫結來觸發 N/A daprBindingTrigger (部分機器翻譯)
針對 Dapr 服務叫用來觸發 N/A daprServiceInvocationTrigger (部分機器翻譯)
針對 Dapr 主題訂用帳戶來觸發 N/A daprTopicTrigger (部分機器翻譯)
提取某個執行的 Dapr 狀態 In daprState (部分機器翻譯)
提取某個執行的 Dapr 祕密 In daprSecret (部分機器翻譯)
將值儲存至 Dapr 狀態 daprState (部分機器翻譯)
叫用另一個 Dapr 應用程式 daprInvoke (部分機器翻譯)
將訊息發佈至 Dapr 主題 daprPublish (部分機器翻譯)
將值傳送至 Dapr 輸出繫結 daprBinding (部分機器翻譯)

安裝擴充功能

您安裝的延伸模組 NuGet 套件取決於您在函式應用程式中使用的 C# 模式內含式 (部分機器翻譯) 或隔離式背景工作處理序 (部分機器翻譯):

透過安裝 NuGet 套件 (英文) 1.0.0 版即可取得此延伸模組。

使用 .NET CLI:

dotnet add package Microsoft.Azure.WebJobs.Extensions.Dapr

安裝搭售方案

您可以在 host.json 檔案中新增或取代下列程式碼,以新增延伸模組:

{
  "version": "2.0",
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[4.*, 5.0.0)"
  }
}

Dapr 啟動

您可以根據執行階段內容,使用各種 [引數和註釋][dapr-args] 來設定 Dapr。 您可以透過兩個通道為 Azure Functions 設定 Dapr:

  • 基礎結構即程式碼 (IaC) 範本,如 Bicep 或 Azure Resource Manager(ARM) 範本所示
  • Azure 入口網站

使用 IaC 範本時,請在容器應用程式資源定義的 properties 區段中指定下列引數。

DaprConfig: {
  enabled: true
  appId: '${envResourceNamePrefix}-funcapp'
  appPort: 3001
  httpReadBufferSize: ''
  httpMaxRequestSize: ''
  logLevel: ''
  enableApiLogging: true
}

上述 Dapr 設定值會被視為應用程式範圍變更。 當您在多個修訂模式中執行容器應用程式時,這些設定的變更將不會建立新的修訂。 相反地,所有現有的修訂都會重新啟動,以確保它們已設定最新的值。

使用 Azure 入口網站來設定 Dapr 時,請瀏覽至您的函式應用程式,然後從左側功能表中選取 [Dapr]

螢幕擷取畫面:示範可在 Azure 入口網站中的何處找到函式應用程式的 Dapr 啟用。

Dapr 連接埠和接聽程式

當您從 Dapr 觸發函式時,此延伸模組會自動公開連接埠 3001 以接聽來自 Dapr 側車的傳入要求。

重要

只有在函式應用程式中定義了 Dapr 觸發程序時,系統才會公開和接聽連接埠 3001。 使用 Dapr 時,側車會先等候接收來自所定義連接埠的回應,再完成具現化。 除非您有觸發程序,否則「請勿」定義 dapr.io/port 註釋或 --app-port。 這麼做可能會讓應用程式遭到鎖定而無法與 Dapr 側車通訊。

如果您只使用輸入和輸出繫結,則不需要公開或定義連接埠 3001

根據預設,當 Azure Functions 嘗試與 Dapr 通訊時,其會透過從環境變數 DAPR_HTTP_PORT 解析出來的連接埠呼叫 Dapr。 如果該變數為 null,則其會預設為連接埠 3500

您可以在 function.json 中設定繫結 (或屬性 (attribute)) 的 DaprAddress 屬性 (property),以覆寫輸入和輸出繫結所使用的 Dapr 位址。 依預設,其會使用 http://localhost:{DAPR_HTTP_PORT}

函式應用程式仍會為 HTTP 觸發程序等項目公開另一個連接埠和端點,其在本機會預設為 7071,但在容器中,則會預設為 80

繫結型別

針對 .NET 所支援的繫結類型同時取決於延伸模組版本和 C# 執行模式,這可以是下列其中一項:

內含式類別庫為經過編譯的 C# 函式,其在與 Azure Functions 執行階段相同的程序中執行。

Dapr 延伸模組會根據下表來支援參數類型。

繫結 參數型別
Dapr 觸發程序 daprBindingTrigger (英文)
daprServiceInvocationTrigger (英文)
daprTopicTrigger (英文)
Dapr 輸入 daprState (英文)
daprSecret (英文)
Dapr 輸出 daprState (英文)
daprInvoke (英文)
daprPublish (英文)
daprBinding (英文)

如需使用這些類型的範例,請參閱 GitHub 的延伸模組存放庫

試用適用於 Azure Functions 的 Dapr 延伸模組

透過所提供的範例來了解如何使用適用於 Azure Functions 的 Dapr 延伸模組。

範例 描述
快速入門 開始使用 Dapr 發佈/訂閱繫結和 HttpTrigger
Dapr Kafka (英文) 了解如何搭配 Kafka 繫結 Dapr 元件來使用 Azure Functions Dapr 延伸模組。
.NET 內含式 (英文) 了解如何使用 Azure Functions 內含式模型來與 .NET 中的多個 Dapr 元件整合,例如服務叫用、發佈/訂閱、繫結和狀態管理。
.NET 隔離式 (英文) 使用 Azure Functions 跨處理序 (OOP) 執行模型來與 .NET 中的 Dapr 元件整合。

試用適用於 Azure Functions 的 Dapr 延伸模組

透過所提供的範例來了解如何使用適用於 Azure Functions 的 Dapr 延伸模組。

範例 描述
Java 函式 (英文) 了解如何使用 Java 以使用 Azure Functions Dapr 延伸模組。

試用適用於 Azure Functions 的 Dapr 延伸模組

透過所提供的範例來了解如何使用適用於 Azure Functions 的 Dapr 延伸模組。

範例 描述
快速入門 開始使用 Dapr 發佈/訂閱繫結和 HttpTrigger
Dapr Kafka (英文) 了解如何搭配 Kafka 繫結 Dapr 元件來使用 Azure Functions Dapr 延伸模組。
JavaScript 執行 JavaScript Dapr 函式應用程式,並使用 Azure Functions 來與 Dapr 服務叫用、發佈/訂閱、繫結和狀態管理整合。

試用適用於 Azure Functions 的 Dapr 延伸模組

透過所提供的範例來了解如何使用適用於 Azure Functions 的 Dapr 延伸模組。

範例 描述
PowerShell 函式 (英文) 了解如何搭配 PowerShell 來使用 Azure Functions Dapr 延伸模組。

試用適用於 Azure Functions 的 Dapr 延伸模組

透過所提供的範例來了解如何使用適用於 Azure Functions 的 Dapr 延伸模組。

範例 描述
Dapr Kafka (英文) 了解如何搭配 Kafka 繫結 Dapr 元件來使用 Azure Functions Dapr 延伸模組。
Python v1 (英文) 執行 Dapr 化的 Python 應用程式,並使用 Azure Functions Python v1 程式設計模型來與 Dapr 元件整合。
Python v2 啟動使用 Azure Functions Python v2 程式設計模型的 Dapr 應用程式來與 Dapr 元件整合。

疑難排解

本節說明如何針對使用適用於 Azure Functions 的 Dapr 延伸模組時所可能發生的問題進行疑難排解。

確定您的環境中已啟用 Dapr

如果您在 Azure Functions 中使用 Dapr 繫結和觸發程序,且您的環境中未啟用 Dapr,則您可能會收到錯誤訊息:Dapr sidecar isn't present. Please see (https://aka.ms/azure-functions-dapr-sidecar-missing) for more information.若要在您的環境中啟用 Dapr:

  • 如果您的 Azure 函式部署在 Azure 容器應用程式中,請參閱適用於 Azure Functions 之 Dapr 延伸模組的 Dapr 啟用指示

  • 如果您的 Azure 函式部署在 Kubernetes 中,請確認部署的 YAML 設定 (英文) 具有下列註釋:

    annotations:
      ...
      dapr.io/enabled: "true"
      dapr.io/app-id: "functionapp"
      # You should only set app-port if you are using a Dapr trigger in your code.
      dapr.io/app-port: "<DAPR_APP_PORT>"
      ...
    
  • 如果您在本機執行 Azure 函式,請執行下列命令,以確保您使用 Dapr 執行函式應用程式 (英文):

    dapr run --app-id functionapp --app-port <DAPR_APP_PORT>  --components-path <COMPONENTS_PATH> -- func host start 
    

確認 Dapr 設定中的應用程式連接埠值

適用於 Azure Functions 的 Dapr 延伸模組預設會在連接埠 3001 上啟動 HTTP 伺服器。 您可以使用 DAPR_APP_PORT 環境變數 (英文) 來設定此連接埠。

如果您在執行 Azure Functions 應用程式時提供不正確的應用程式連接埠值,則可能會收到錯誤訊息:The Dapr sidecar is configured to listen on port {portInt}, but the app server is running on port {appPort}. This may cause unexpected behavior. For more information, visit [this link](https://aka.ms/azfunc-dapr-app-config-error).若要解決此錯誤訊息:

  1. 在容器應用程式的 Dapr 設定中:

    • 如果您在程式碼中使用 Dapr 觸發程序,請確認應用程式連接埠已設定為 3001 或已設定為 DAPR_APP_PORT 環境變數的值。

    • 如果您「未」在程式碼中使用 Dapr 觸發程序,請確認您「未」設定應用程式連接埠。 它應該是空的。

  2. 確認您在 Dapr 設定中提供了正確的應用程式連接埠值。

    • 如果您使用 Azure 容器應用程式,請在 Bicep 中指定應用程式連接埠:

      DaprConfig: {
         ...
         appPort: <DAPR_APP_PORT>
         ...
      }
      
    • 如果您使用 Kubernetes 環境,請設定 dapr.io/app-port 註釋:

      annotations:
         ...
         dapr.io/app-port: "<DAPR_APP_PORT>"
         ...
      
    • 如果您在本機進行開發,請確認您在使用 Dapr 執行函式應用程式時有設定 --app-port

      dapr run --app-id functionapp --app-port <DAPR_APP_PORT> --components-path <COMPONENTS_PATH> -- func host start 
      

下一步

深入了解 Dapr。(英文)