使用 Azure Functions 和 .NET 解決方案建立無伺服器應用程式
已發表: 2023-09-21無伺服器運算是一種雲端執行模型,使開發人員能夠建置和運行應用程式和服務,而無需考慮伺服器。 透過無伺服器,應用程式不依賴於保持伺服器運作——雲端提供者動態管理伺服器的分配和配置。 這使得開發人員能夠專注於編寫業務邏輯而不是伺服器管理。
Microsoft Azure Functions 是一種無伺服器運算服務,用於建置和託管 Web 端點和背景處理作業,而無需預先配備或管理伺服器。 借助 Azure Functions,你可以按需執行程式碼來回應事件,而無需明確預配或管理基礎結構。 在這篇文章中,我們將探討如何使用 .NET 解決方案透過 Azure Functions 建立無伺服器應用程序,包括利用ASP.NET 開發服務。
什麼是 Azure 函數?
Azure Functions 可讓您在雲端中執行程式碼,而無需部署或管理基礎架構。 使用 Functions,您只需編寫解決當前問題所需的程式碼,而無需擔心管理伺服器。 Azure 為你管理所有基礎架構和伺服器。
Azure Functions 的一些關鍵面向和優勢:
- 事件驅動:函數由許多 Azure 和第三方服務的事件觸發。 其中包括 HTTP 請求、計時器、佇列、無伺服器 API 等。 您可以運行程式碼來回應這些事件。
- 自動擴充:Azure 根據傳入請求率和處理負載自動管理和擴充功能。 您無需手動配置和擴展伺服器。
- 按執行付費:您只需為運行程式碼所需的計算資源付費。 當您的功能未運作時,不會產生閒置費用。
- 多種語言:Functions 支援 C#、JavaScript、Python、PowerShell、Java 等。 您可以用您喜歡的語言開發功能。
- 無伺服器體驗:使用 Functions,您可以專注於編寫程式碼,並讓 Azure 處理所有伺服器預先設定、設定和管理。 您將獲得真正的無伺服器體驗。
本機開發 .NET 函數
要在本機上開發 .NET 函數,您需要 Azure Functions Core Tools,它是一個命令列介面,用於在本機和 Azure 上開發、測試和部署 Azure Functions。
設定開發環境:
- 安裝.NET Core SDK最新版本
- 使用 dotnet tool install -g Microsoft.Azure.WebJobs.Script.WebHost 安裝 Azure Functions Core Tools
- 為函數應用程式專案建立目錄並執行 func init
- 這將使用函數模板來建立一個範例函數項目
現在,您可以新增函數程式碼,在本機測試它並使用 func CLI 發佈到 Azure。 為 HTTP 觸發的 C# 函數新增 run.csx 檔案:
來源 {csharp}
複製
#r“Newtonsoft.Json”
使用 Microsoft.AspNetCore.Mvc;
使用 Microsoft.Extensions.Primitives;
使用 Newtonsoft.Json;
使用System.Net;
使用 System.Threading.Tasks;
公共靜態非同步任務 <IActionResult> Run(HttpRequest req,ILogger 日誌)
{
log.LogInformation(“C# HTTP 觸發函數處理了一個請求。”);
字串名稱 = req.Query[“名稱”];
string requestBody = wait new StreamReader(req.Body).ReadToEndAsync();
動態資料 = JsonConvert.DeserializeObject(requestBody);
名字=名字?? 數據?.名稱;
回傳名稱!= null
? (ActionResult)new OkObjectResult($”你好,{name}”)
: new BadRequestObjectResult(“請在查詢字串或請求正文中傳遞名稱”);
}
透過執行 func host start 在本機測試它,這會在本機上啟動功能網關。 現在您可以使用 Postman 或瀏覽器透過 http://localhost:7071/api/HttpExample?name=John 觸發它。
選擇 Azure Functions 觸發器和綁定
Azure Functions 支援許多不同的事件來源和目標,稱為觸發器和綁定。 根據您的用例選擇正確的觸發器和綁定非常重要。
函數中的一些常見觸發器是:
- HTTP 觸發器:用於建立 REST API 和 Web 端點。 程式碼由 HTTP 請求觸發。
- 計時器觸發器:適用於按計畫執行的預定作業,例如每 5 分鐘執行一次。
- 佇列觸發器:用於處理來自儲存佇列的訊息。
- Blob 觸發器:用於對 Azure Blob 儲存體中的新的或更新的 Blob 做出反應。
綁定允許函數與外部資料儲存和服務互動。 常見的綁定包括:

- 儲存隊列:用於將訊息輸出到儲存隊列。
- Blob 儲存:用於讀取和寫入 Azure Blob 儲存體。
- Cosmos DB:用於查詢和修改 Azure Cosmos DB 資料庫服務中的文件。
- 服務總線:用於處理來自 Azure 服務總線佇列和主題的訊息。
選擇正確的觸發器和綁定有助於透過將不同的功能與資料和服務整合來建立端到端解決方案。
使用耐用功能
持久函數允許編寫有狀態函數,即使在發生故障或重新啟動的情況下,也可以可靠地執行操作序列。 它允許您將長期運行的工作流程建置為狀態機。
例如,您可以使用 Durable Functions 建立一個工作流程,其中包括:
- Orchestrator 功能:充當狀態機,以正確的順序協調活動功能的執行。
- 活動函數:可以由協調器函數呼叫的小型獨立工作單元。
使用耐用功能的好處包括:
- 可靠的重試:如果活動函數失敗,Durable Functions 會自動重試活動函數。
- 非同步呼叫:orchestrator 函數可以非同步運行活動函數並等待其完成。
- 檢查點:狀態會連續設定檢查點,因此即使在應用程式重新啟動或失敗後也可以恢復工作流程。
讓我們來看看一個協調兩個活動的簡單工作流程:
來源 {csharp}
複製
[函數名稱(“協調器”)]
公共靜態非同步任務 RunOrchestrator(
[OrchestrationTrigger] IDurableOrchestrationContext 上下文)
{
var output1 = wait context.CallActivityAsync<string>(“DotNetActivity”, “Hello”);
varoutput2=awaitcontext.CallActivityAsync<string>(“DotNetActivity”,output1);
// 回傳結果
返回輸出2;
}
[函數名稱(“DotNetActivity”)]
公共靜態任務<字串>運行(
[ActivityTrigger] 字串輸入,
ILogger日誌)
{
log.LogInformation($”處理的DotNetActivity函數:{input}”);
返回 Task.FromResult(input.ToUpper());
}
耐用功能允許將複雜的流程分解為可靠的工作流程。
Azure Functions 開發的最佳實踐
Azure Functions 開發應遵循的一些最佳實務:
- 使用依賴項注入:相依性將服務注入到函數中以獲得更好的可測試性。
- 避免長時間運行的進程:函數旨在在小型處理單元上執行程式碼。 保持程式碼執行簡短。
- 使用不可變資料類型:函數是無狀態的,因此請避免可能導致問題的可變類型/副作用。
- 集中錯誤處理:加入通用的錯誤處理邏輯,而不是在各處單獨處理錯誤。
- 結構化日誌記錄:標準化日誌記錄有助於調試、監控和稽核追蹤。
- 限制和重試:透過實施指數退避重試來處理限制錯誤。
- 版本控制:強版本觸發器、綁定和輸入/輸出以避免重大變更。
- 監控和偵測:使用 Application Insights 等工具進行日誌記錄、監控效能和使用情況分析。
- 使用上下文綁定:利用上下文綁定來存取應用程式設定等內容,而無需額外的依賴項。
遵循這些最佳實踐有助於使用 Azure Functions 建立強大、可靠且可擴展的無伺服器應用程式。
將功能部署到 Azure
函數準備就緒後,您可以透過 Azure CLI、PowerShell、Visual Studio 或直接從 Azure Functions 核心工具 CLI 將它們部署到 Azure:
複製
func azure functionapp 發佈 <函數應用程式名稱>
這會將函數項目資料夾發佈到 Azure Function App。 將功能部署到 Azure 的幾個主要好處包括:
- 自動擴充 – 功能會根據傳入請求量或時間觸發進行擴充。
- 高可用性 – 跨資料中心的多個實例提供高可用性。
- 監控和日誌記錄 – 使用 Application Insights 等工具來監控效能、錯誤等。
- 無伺服器平台 – 無需設定/管理伺服器。 您只需專注於程式碼。
- 持續部署 – 使用 CI/CD 管道對程式碼變更進行自動部署。
Azure 處理所有基礎設施,避免閒置成本,並提供完全無伺服器平台可靠地大規模運行無伺服器應用程式。
結論
使用 Azure Functions 的無伺服器運算使開發人員能夠專注於業務邏輯,同時將所有基礎設施和營運管理卸載到 Azure。 本機 .NET 開發支援(包括僱用 ASP.NET Core 開發人員的選項)允許使用 C# 輕鬆建立強大的無伺服器解決方案。 借助觸發器、綁定和持久函數,開發人員可以將端到端事件驅動的架構和工作流程建構成無狀態和有狀態函數。 與最佳實踐相結合,Azure Functions 允許簡單且可擴展地建置無伺服器應用程式並將其部署到雲端。