練習 - 使用 Durable Functions 來建立工作流程
在本練習中,您會使用來自先前單元的範例案例,以了解如何使用 Durable Functions 在 Azure 入口網站中建立核准工作流程。
建立函數應用程式
使用啟用沙箱時所用的相同帳戶來登入 Azure 入口網站。
在 Azure 入口網站功能表上,或從 [首頁] 頁面,選取位於 [Azure 服務] 下方的 [建立資源]。 [建立資源] 窗格隨即會顯示。
搜尋並選取 [函式應用程式]。 選取 [取用],然後選取 [選取] 按鈕。 [建立函數應用程式] 頁面隨即出現。
在 [基本] 索引標籤上,為每個設定輸入下列值。
設定 值 Description 專案詳細資料 訂用帳戶 指引訂用帳戶 指定其底下將建立這個新函數應用程式的訂用帳戶。 資源群組 從下拉式清單,選取 [沙箱資源群組名稱] 指定要在其中建立函數應用程式的資源群組名稱。 我們在啟動沙箱時指派的沙箱資源群組 (即 [沙箱資源群組名稱] ) 中建立了函式應用程式。執行個體詳細資料 函數應用程式名稱 [全域唯一名稱] 指定用以識別新函數應用程式的名稱。 有效字元是 a-z
、0-9
和-
。發佈 程式碼 指定函式使用程式碼,而不是容器。 執行階段堆疊 Node.js 指定本課程模組的範例程式碼是以 JavaScript 撰寫。 版本 20 LTS 指定執行階段堆疊的版本。 區域 [從本節後面的清單中選取] 選擇最靠近您,也是下列允許的「沙箱區域」其中之一的區域。 作業系統 作業系統 Windows 指定裝載函數應用程式的作業系統。 計劃 免費的沙箱可讓您在 Azure 全球區域的一部分區域建立資源。 建立資源後,從下列清單選取區域:
- 美國西部 2
- 美國中南部
- 美國中部
- 美國東部
- 西歐
- 東南亞
- 日本東部
- 巴西南部
- 澳大利亞東南部
- 印度中部
選取 [下一步: 儲存體]。
在 [儲存體] 索引標籤上,為每個設定輸入下列值。
設定 值 Description 儲存體 儲存體帳戶 [全域唯一名稱] 指定您函數應用程式所使用的新儲存體帳戶名稱 (不需要符合您為函式指定的全域唯一名稱)。 儲存體帳戶名稱的長度必須介於 3 到 24 個字元之間,且只能包含數字和小寫的字母。 這個對話方塊會在欄位中自動填入動態產生的唯一名稱。 不過,也可自行使用不同名稱或甚至是現有帳戶。 選取 [下一步: 網路]。 接受預設值。
選取 [下一步:監視]。
在 [監視] 索引標籤中,輸入下列設定值。
設定 值 Description Application Insights 啟用 Application Insights 否 指定在本課程模組中停用 Application Insights。 按一下 [檢閱 + 建立],然後檢閱所設定的選項。 如果您認為選項沒有問題,請按一下 [建立] 來佈建及部署函數應用程式。
等候部署完成,再繼續進行操作。 部署可能需要幾分鐘的時間。
安裝持久函式 npm 套件
由於我們要建立的是 JavaScript Durable Functions,因此需要安裝 durable-functions
npm 套件。 若要這麼做,請執行下列步驟。
選取 [前往資源],以檢視您函式應用程式。 您的 [函數應用程式] 窗格隨即出現。
在左側功能表窗格的 [開發工具] 之下,選取 [App Service 編輯器 (預覽)],然後選取 [開啟編輯器]。 [App Service 編輯器] 的 [快速入門] 窗格隨即出現在新的瀏覽器視窗中。
在左側功能表窗格中,醒目提示 WWWROOT 資料夾。
在左側工具列功能表中,選取開啟主控台圖示。
此動作會啟動主控台。 您可使用此主控台來存取裝載函式的網頁伺服器,以及為函式撰寫程式碼。
建立新的 package.json 檔案。
在主控台中輸入下列命令,以建立新的 JSON 檔案並在編輯器中加以開啟:
touch package.json open package.json
加入下列程式碼。
{ "name": "example", "version": "1.0.0" }
將
example
取代為您套件的名稱。 例如,您可以使用稍早為函式指定的全域唯一名稱。
選取 Ctrl+S 以儲存檔案,然後選取 Ctrl+Q 以關閉文件。
切換回到 Azure 入口網站。
在左側功能表列的 [開發工具] 底下,選取 [主控台]。 函數應用程式的 [主控台] 窗格會隨即出現。
執行以下命令:
npm install durable-functions
此命令會指示節點套件管理員安裝
durable-functions
套件和任何所需的相依性。 安裝可能需要幾分鐘的時間才能完成,且節點套件管理員可能會顯示一些您可忽略的警告。注意
如果系統提示您安裝較新版本的 npm,請使用錯誤中提供的命令來安裝較新版本,然後在安裝新版本之後安裝
durable-functions
套件。請等候,直到所有套件都完成安裝為止。
在左側功能表窗格中,向上捲動並選取 [概觀]總覽,然後在頂端功能表列中選取 [重新啟動],再於提示重新啟動時選取 [是]。
等候重新啟動完成,再繼續進行操作。
建立用於提交設計提案的用戶端函式
在 Azure 入口網站功能表或從 [首頁] 頁面的 [最近使用的資源] 底下,選取 [全部查看],然後選取函數應用程式。 您的 [函數應用程式] 窗格隨即出現。
在 [概觀] 頁面上,選取 畫面中央的 [函式] 索引標籤。
選取 [在 Azure 入口網站中建立] 按鈕。 [建立函式] 窗格隨即出現。
在 [選取範本] 下的 [篩選] 方塊中,輸入 Durable Functions HTTP starter,然後從清單中選取該範本。 此範本會建立將執行以回應 HTTP 要求的持久函式。
在 [範本詳細資料] 下的 [新增函式] 欄位中,針對函式的名稱輸入 HttpStart,並在 [授權等級] 欄位中選取 [函式],然後選取 [建立]。 函式的 [HttpStart] 窗格會隨即出現。
在左側功能表窗格中,於 [開發人員] 底下,選取 [程式碼 + 測試]。 適用於您函式的 [編碼 + 測試] 窗格隨即出現。
index.js 檔案的程式碼隨即會出現在編輯器中。 檔案應該類似下列範例:
const df = require("durable-functions"); module.exports = async function (context, req) { const client = df.getClient(context); const instanceId = await client.startNew(req.params.functionName, undefined, req.body); context.log(`Started orchestration with ID = '${instanceId}'.`); return client.createCheckStatusResponse(context.bindingData.req, instanceId); };
在函式中檔案的下拉式功能表中,選取 function.json,以檢視與新函式相關聯的繫結。 此資訊會指定所有驗證需求,以及可觸發該函式的 HTTP 方法。 此檔案也會指定該函式是啟動協調流程程序的用戶端。 檔案應該類似下列範例:
{ "bindings": [ { "authLevel": "function", "name": "req", "type": "httpTrigger", "direction": "in", "route": "orchestrators/{functionName}", "methods": [ "post", "get" ] }, { "name": "$return", "type": "http", "direction": "out" }, { "name": "starter", "type": "orchestrationClient", "direction": "in" } ] }
注意
繫結會將資源及其他項目與觸發程序建立關聯。 它是一個宣告式機制,可讓您無須以硬式編碼方式在程式碼中撰寫對其他服務和函式的參考。
建立協調器函式
在 Azure 入口網站功能表或從 [首頁] 頁面的 [最近使用的資源] 底下,選取 [全部查看],然後選取函數應用程式。 您的 [函數應用程式] 窗格隨即出現。
在 [概觀] 頁面上,選取畫面中央的 [函式] 索引標籤。
在 [函式] 功能表列中,選取 [建立]。 [建立函式] 窗格隨即出現。
在 [選取範本] 下的 [篩選] 方塊中,輸入 Durable Functions orchestrator,然後從清單中選取該範本。 此範本會建立持久函式,以協調函式的執行。
在 [範本詳細資料] 下的 [新增函式] 欄位中,針對函式的名稱輸入 OrchFunction,然後選取 [建立]。 [OrchFunction] 函式窗格會隨即出現。
在左側功能表窗格中,於 [開發人員] 底下,選取 [程式碼 + 測試]。 適用於您函式的 [編碼 + 測試] 窗格隨即出現。
index.js 檔案的程式碼隨即會出現在編輯器中。
將現有的程式碼取代為下列程式碼。
const df = require("durable-functions"); module.exports = df.orchestrator(function* (context) { const outputs = []; /* * We will call the approval activity with a reject and an approved to simulate both */ outputs.push(yield context.df.callActivity("Approval", "Approved")); outputs.push(yield context.df.callActivity("Approval", "Rejected")); return outputs; });
此程式碼會呼叫名為 Approval 的「活動」函式,您會在稍後建立該函式。 協調器函式中的程式碼會叫用 Approval 函式兩次。 第一次會模擬接受提案,第二次則是測試提案拒絕邏輯。
每個呼叫所傳回的值都會結合在一起並傳回至用戶端函式。 在生產環境中,您的協調流程函式會呼叫一系列活動函式來接受/拒絕決策,然後傳回這些活動的結果。
請從頂端功能表列選取 [儲存],儲存新函式。
建立活動函式
在 Azure 入口網站功能表或從 [首頁] 頁面的 [最近使用的資源] 底下,選取 [全部查看],然後選取函數應用程式。 您的 [函數應用程式] 窗格隨即出現。
在 [概觀] 頁面上,選取畫面中央的 [函式] 索引標籤。
在 [函式] 功能表列中,選取 [建立]。 [建立函式] 窗格隨即出現。
在 [選取範本] 下的 [篩選] 方塊中,輸入 Durable Functions activity,然後從清單中選取該範本。 此範本會建立耐久的函式,該函式會在協調器函式呼叫活動時執行。
在 [範本詳細資料] 下的 [新增函式] 欄位中,針對函式的名稱輸入 Approval,然後選取 [建立]。 函數應用程式的 [Approval] 窗格會隨即出現。
在左側功能表窗格中,於 [開發人員] 底下,選取 [程式碼 + 測試]。 適用於您函式的 [編碼 + 測試] 窗格隨即出現。
index.js 檔案的程式碼隨即會出現在編輯器中。
將現有的程式碼取代為下列程式碼。
module.exports = async function (context) { return `Your project design proposal has been - ${context.bindings.name}!`; };
此函式會傳回指出提案狀態的訊息。 依據從協調器傳遞給此函式的參數而定,
context.bindings.name
運算式會是Accepted
或Rejected
。 在真實世界的案例中,您會在此函式中新增處理接受或拒絕作業的邏輯。請從頂端功能表列選取 [儲存],儲存新函式。
確認 Durable Functions 工作流程開始
在 Azure 入口網站功能表或從 [首頁] 頁面的 [最近使用的資源] 底下,選取 [全部查看],然後選取函數應用程式。 您的 [函數應用程式] 窗格隨即出現。
選取頁面中央的 [函式] 索引標籤。
選取 HttpStart 函式。 函式的 [HttpStart] 窗格會隨即出現。
在頂端功能表列中,選取 [取得函式 URL],然後複製 URL。 URL 應該類似下列範例:
https://example.azurewebsites.net/api/orchestrators/{functionName}?code=AbCdEfGhIjKlMnOpQrStUvWxYz==
您會使用此 URL 執行您的函式。
開啟新的瀏覽器視窗,然後前往所複製的 URL。 在 URL 中,將 {functionName} 預留位置取代為 OrchFunction,其應類似下列範例所示:
https://example.azurewebsites.net/api/orchestrators/OrchFunction?code=AbCdEfGhIjKlMnOpQrStUvWxYz==
回應訊息包含一組可用於監視和管理執行的 URI 端點,如下列範例所示:
{ "id": "f0e1d2c3b4a5968778695a4b3c2d1e0f", "statusQueryGetUri": "https://example.azurewebsites.net/...", "sendEventPostUri": "https://example.azurewebsites.net/...", "terminatePostUri": "https://example.azurewebsites.net/...", "rewindPostUri": "https://example.azurewebsites.net/...", "purgeHistoryDeleteUri": "https://example.azurewebsites.net/..." }
複製 statusQueryGetUri 值,然後使用您的網頁瀏覽器前往此 URL。 您應該會看到類似下列範例的回應訊息:
{ "name": "OrchFunction", "instanceId": "f0e1d2c3b4a5968778695a4b3c2d1e0f", "runtimeStatus": "Completed", "input": null, "customStatus": null, "output": [ "Your project design proposal has been - Approved!", "Your project design proposal has been - Rejected!" ], "createdTime": "2019-04-16T15:23:03Z", "lastUpdatedTime": "2019-04-16T15:23:35Z" }
回想一下,協調流程函式會執行活動函式兩次。 第一次,活動函式會指出已接受專案提案。 第二次,提案則會被拒絕。 協調流程函式會結合來自這兩個函式呼叫的訊息,並將其傳回給用戶端函式。