การสร้างแอปพลิเคชันแบบไร้เซิร์ฟเวอร์ด้วยฟังก์ชัน Azure และโซลูชัน .NET
เผยแพร่แล้ว: 2023-09-21การประมวลผลแบบไร้เซิร์ฟเวอร์เป็นรูปแบบการดำเนินการบนคลาวด์ที่ช่วยให้นักพัฒนาสามารถสร้างและรันแอปพลิเคชันและบริการโดยไม่ต้องคำนึงถึงเซิร์ฟเวอร์ เมื่อใช้แบบไร้เซิร์ฟเวอร์ แอปพลิเคชันไม่ต้องพึ่งพาการรักษาเซิร์ฟเวอร์ให้ทำงาน — ผู้ให้บริการคลาวด์จะจัดการการจัดสรรและการจัดเตรียมเซิร์ฟเวอร์แบบไดนามิก สิ่งนี้ช่วยให้นักพัฒนามุ่งเน้นไปที่การเขียนโค้ดตรรกะทางธุรกิจมากกว่าการจัดการเซิร์ฟเวอร์
ฟังก์ชัน Microsoft Azure คือบริการประมวลผลแบบไร้เซิร์ฟเวอร์สำหรับการสร้างและโฮสต์จุดสิ้นสุดของเว็บและงานการประมวลผลเบื้องหลังโดยไม่ต้องจัดเตรียมหรือจัดการเซิร์ฟเวอร์ ด้วยฟังก์ชัน Azure คุณสามารถเรียกใช้โค้ดตามความต้องการเพื่อตอบสนองต่อเหตุการณ์ต่างๆ โดยไม่ต้องจัดเตรียมหรือจัดการโครงสร้างพื้นฐานอย่างชัดเจน ในบล็อกโพสต์นี้ เราจะสำรวจวิธีสร้างแอปพลิเคชันแบบไร้เซิร์ฟเวอร์ด้วยฟังก์ชัน Azure โดยใช้โซลูชัน .NET รวมถึงการใช้ประโยชน์จาก บริการ ASP.NET Development
ฟังก์ชัน Azure คืออะไร
ฟังก์ชัน Azure ช่วยให้คุณสามารถเรียกใช้โค้ดในระบบคลาวด์ได้โดยไม่ต้องปรับใช้หรือจัดการโครงสร้างพื้นฐาน ด้วยฟังก์ชัน คุณจะเขียนเพียงโค้ดที่คุณต้องการสำหรับปัญหาที่มีอยู่โดยไม่ต้องกังวลกับการจัดการเซิร์ฟเวอร์ Azure จัดการโครงสร้างพื้นฐานและเซิร์ฟเวอร์ทั้งหมดให้กับคุณ
ประเด็นสำคัญและคุณประโยชน์บางประการของฟังก์ชัน Azure:
- ขับเคลื่อนด้วยเหตุการณ์: ฟังก์ชันต่างๆ ถูกทริกเกอร์โดยเหตุการณ์จากบริการ Azure และบริการของบุคคลที่สามมากมาย ซึ่งรวมถึงคำขอ HTTP, ตัวจับเวลา, คิว, API แบบไร้เซิร์ฟเวอร์ และอื่นๆ คุณสามารถให้โค้ดรันเพื่อตอบสนองต่อเหตุการณ์เหล่านี้ได้
- ปรับขนาดโดยอัตโนมัติ: Azure จัดการและปรับขนาดฟังก์ชันโดยอัตโนมัติตามอัตราการร้องขอที่เข้ามาและปริมาณการประมวลผล คุณไม่จำเป็นต้องจัดเตรียมและปรับขนาดเซิร์ฟเวอร์ด้วยตนเอง
- จ่ายต่อการดำเนินการ: คุณจ่ายเฉพาะทรัพยากรการประมวลผลที่จำเป็นในการเรียกใช้โค้ดของคุณเท่านั้น ไม่มีค่าใช้จ่ายที่ไม่ได้ใช้งานเมื่อฟังก์ชันของคุณไม่ได้ทำงานอยู่
- หลายภาษา: ฟังก์ชันรองรับ C#, JavaScript, Python, PowerShell, Java และอื่นๆ คุณสามารถพัฒนาฟังก์ชันต่างๆ ในภาษาที่คุณต้องการได้
- ประสบการณ์ไร้เซิร์ฟเวอร์: ด้วยฟังก์ชัน คุณจะมุ่งเน้นไปที่การเขียนโค้ดและให้ Azure จัดการการเตรียมใช้งาน การกำหนดค่า และการจัดการเซิร์ฟเวอร์ทั้งหมด คุณจะได้รับประสบการณ์แบบไร้เซิร์ฟเวอร์อย่างแท้จริง
การพัฒนาฟังก์ชัน .NET ภายในเครื่อง
หากต้องการพัฒนาฟังก์ชัน .NET ภายในเครื่อง คุณต้องมี Azure Functions Core Tools ซึ่งเป็นอินเทอร์เฟซบรรทัดคำสั่งสำหรับการพัฒนา ทดสอบ และปรับใช้ฟังก์ชัน Azure ทั้งภายในเครื่องและกับ Azure
ในการตั้งค่าสภาพแวดล้อมการพัฒนา:
- ติดตั้ง .NET Core SDK เวอร์ชันล่าสุด
- ติดตั้ง Azure Functions Core Tools โดยใช้เครื่องมือ dotnet ติดตั้ง -g Microsoft.Azure.WebJobs.Script.WebHost
- สร้างไดเร็กทอรีสำหรับโปรเจ็กต์แอป Functions และรัน func init
- สิ่งนี้จะทำหน้าที่เป็นโครงโปรเจ็กต์ฟังก์ชันตัวอย่างด้วยเทมเพลตฟังก์ชัน
ตอนนี้คุณสามารถเพิ่มโค้ดฟังก์ชัน ทดสอบในเครื่อง และเผยแพร่ไปยัง Azure โดยใช้ func CLI เพิ่มไฟล์ run.csx สำหรับฟังก์ชัน C# ที่เรียกใช้โดย HTTP:
ที่มา {csharp}
สำเนา
#r “นิวตันซอฟท์.เจสัน”
ใช้ Microsoft.AspNetCore.Mvc;
ใช้ Microsoft.Extensions.Primitives;
ใช้นิวตันซอฟท์.เจสัน;
ใช้ System.Net;
ใช้ System.Threading.Tasks;
งาน async แบบคงที่สาธารณะ <IActionResult> Run (คำขอ HttpRequest, บันทึก ILogger)
{
log.LogInformation("ฟังก์ชันทริกเกอร์ C# HTTP ประมวลผลคำขอ");
ชื่อสตริง = req.Query[“ชื่อ”];
string requestBody = รอ StreamReader ใหม่ (req.Body).ReadToEndAsync();
ข้อมูลไดนามิก = JsonConvert.DeserializeObject (requestBody);
ชื่อ = ชื่อ ?? ข้อมูล?.ชื่อ;
ชื่อกลับ != null
? (ActionResult) ใหม่ OkObjectResult($”สวัสดี {name}”)
: new BadRequestObjectResult (“กรุณาส่งชื่อในสตริงการสืบค้นหรือในเนื้อหาคำขอ”);
}
ทดสอบในเครื่องโดยการรัน func host start ซึ่งจะเริ่มเกตเวย์ฟังก์ชันบน localhost ของคุณ ตอนนี้คุณสามารถทริกเกอร์ได้โดยใช้บุรุษไปรษณีย์หรือเบราว์เซอร์ด้วย http://localhost:7071/api/HttpExample?name=John
การเลือกทริกเกอร์และการเชื่อมโยงฟังก์ชัน Azure
ฟังก์ชัน Azure รองรับแหล่งที่มาของเหตุการณ์และเป้าหมายต่างๆ มากมายที่เรียกว่าทริกเกอร์และการเชื่อมโยง การเลือกทริกเกอร์และการเชื่อมโยงที่เหมาะสมเป็นสิ่งสำคัญตามกรณีการใช้งานของคุณ
ทริกเกอร์ทั่วไปบางประการในฟังก์ชันคือ:
- ทริกเกอร์ HTTP: สำหรับการสร้าง REST API และจุดสิ้นสุดของเว็บ รหัสถูกทริกเกอร์โดยคำขอ HTTP
- ทริกเกอร์ตัวจับเวลา: สำหรับงานตามกำหนดเวลาที่ทำงานตามกำหนดเวลา เช่น ทุก 5 นาที
- Queue Trigger: สำหรับการประมวลผลข้อความจากคิวการจัดเก็บ
- Blob Trigger: สำหรับการตอบสนองต่อ Blob ใหม่หรือที่อัปเดตในที่เก็บข้อมูล Azure Blob
การเชื่อมโยงช่วยให้ฟังก์ชันโต้ตอบกับที่เก็บข้อมูลและบริการภายนอกได้ การผูกทั่วไปได้แก่:
- คิวการจัดเก็บ: สำหรับการส่งออกข้อความไปยังคิวการจัดเก็บ
- Blob Storage: สำหรับการอ่านและเขียนไปยังที่เก็บข้อมูล Azure Blob
- Cosmos DB: สำหรับการสืบค้นและแก้ไขเอกสารในบริการฐานข้อมูล Azure Cosmos DB
- Service Bus: สำหรับจัดการข้อความจากคิวและหัวข้อ Azure Service Bus
การเลือกทริกเกอร์และการเชื่อมโยงที่เหมาะสมจะช่วยสร้างโซลูชันแบบครบวงจรโดยการผสานรวมฟังก์ชันต่างๆ เข้ากับข้อมูลและบริการ
การใช้ฟังก์ชันที่ทนทาน
ฟังก์ชันที่ทนทานช่วยให้สามารถเขียนฟังก์ชัน stateful ที่ช่วยให้ลำดับของการดำเนินการดำเนินการได้อย่างน่าเชื่อถือ แม้ในกรณีที่เกิดความล้มเหลวหรือรีสตาร์ท ช่วยให้คุณสามารถจัดโครงสร้างเวิร์กโฟลว์ที่ใช้เวลานานเป็นเครื่องสถานะได้
ตัวอย่างเช่น คุณสามารถสร้างเวิร์กโฟลว์โดยใช้ฟังก์ชันทนทานที่ประกอบด้วย:
- ฟังก์ชัน Orchestrator: ทำหน้าที่เป็นเครื่องสถานะที่ประสานการดำเนินการของฟังก์ชันกิจกรรมตามลำดับที่เหมาะสม
- ฟังก์ชันกิจกรรม: หน่วยงานอิสระขนาดเล็กที่สามารถเรียกใช้โดยฟังก์ชันออร์เคสตรา
ประโยชน์ของการใช้ฟังก์ชันทนทาน ได้แก่:
- การลองใหม่ที่เชื่อถือได้: ฟังก์ชันที่ทนทานจะลองฟังก์ชันกิจกรรมอีกครั้งโดยอัตโนมัติหากล้มเหลว
- การโทรแบบอะซิงโครนัส: ฟังก์ชัน orchestrator สามารถเรียกใช้ฟังก์ชันกิจกรรมแบบอะซิงโครนัสและรอให้เสร็จสิ้น
- จุดตรวจสอบ: สถานะถูกตรวจสอบอย่างต่อเนื่อง เพื่อให้สามารถกู้คืนเวิร์กโฟลว์ได้แม้ว่าแอปจะรีสตาร์ทหรือล้มเหลวก็ตาม
มาดูขั้นตอนการทำงานง่ายๆ ที่จัดกิจกรรมสองอย่าง:
ที่มา {csharp}
สำเนา
[ชื่อฟังก์ชัน("ออเคสตรา")]
RunOrchestrator งาน async แบบคงที่สาธารณะ (
[OrchestrationTrigger] บริบท IDurableOrchestrationContext)
{
var output1 = รอบริบท CallActivityAsync<string>("DotNetActivity", "Hello");
var output2 = รอบริบท CallActivityAsync<string>("DotNetActivity", output1);
//ส่งคืนผลลัพธ์
ส่งคืนเอาต์พุต 2;
}
[ชื่อฟังก์ชัน("DotNetActivity")]
งานคงที่สาธารณะ <string> Run(
[ActivityTrigger] อินพุตสตริง
บันทึก ILogger)
{
log.LogInformation($”ฟังก์ชัน DotNetActivity ประมวลผลแล้ว: {input}”);
กลับ Task.FromResult (input.ToUpper ());
}
ฟังก์ชันที่ทนทานช่วยให้แบ่งกระบวนการที่ซับซ้อนออกเป็นขั้นตอนการทำงานที่เชื่อถือได้
แนวทางปฏิบัติที่ดีที่สุดสำหรับการพัฒนาฟังก์ชัน Azure
แนวทางปฏิบัติที่ดีที่สุดที่ควรปฏิบัติตามสำหรับการพัฒนาฟังก์ชัน Azure:
- ใช้การพึ่งพาการฉีด: การพึ่งพาการฉีดบริการเข้าไปในฟังก์ชันเพื่อให้สามารถทดสอบได้ดีขึ้น
- หลีกเลี่ยงกระบวนการที่ทำงานเป็นเวลานาน: ฟังก์ชันต่างๆ มีไว้เพื่อเรียกใช้โค้ดบนหน่วยประมวลผลขนาดเล็ก ทำให้การรันโค้ดสั้นลง
- ใช้ประเภทข้อมูลที่ไม่เปลี่ยนรูป: ฟังก์ชันไม่มีสถานะ ดังนั้นควรหลีกเลี่ยงประเภท/ผลข้างเคียงที่ไม่แน่นอนที่อาจทำให้เกิดปัญหา
- การจัดการข้อผิดพลาดแบบรวมศูนย์: เพิ่มตรรกะการจัดการข้อผิดพลาดทั่วไป แทนที่จะจัดการข้อผิดพลาดทีละรายการในทุกที่
- การบันทึกแบบมีโครงสร้าง: การบันทึกแบบมาตรฐานช่วยในการแก้ไขจุดบกพร่อง การตรวจสอบ และแนวทางการตรวจสอบ
- การควบคุมปริมาณและการลองใหม่: จัดการกับข้อผิดพลาดในการควบคุมปริมาณโดยการนำการลองใหม่ไปใช้แบบแบ็คออฟแบบเอกซ์โปเนนเชียล
- การกำหนดเวอร์ชัน: กำหนดเวอร์ชันของทริกเกอร์ การเชื่อมโยง และอินพุต/เอาท์พุตอย่างเข้มงวดเพื่อหลีกเลี่ยงไม่ให้การเปลี่ยนแปลงเสียหาย
- การตรวจสอบและการวัดผล: ใช้เครื่องมือเช่น Application Insights สำหรับการบันทึก การตรวจสอบประสิทธิภาพ และการวิเคราะห์การใช้งาน
- ใช้การเชื่อมโยงบริบท: ใช้ประโยชน์จากการเชื่อมโยงบริบทเพื่อเข้าถึงสิ่งต่างๆ เช่น การตั้งค่าแอป โดยไม่ต้องพึ่งพาเพิ่มเติม
การปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดเหล่านี้จะช่วยสร้างแอปพลิเคชันแบบไร้เซิร์ฟเวอร์ที่แข็งแกร่ง เชื่อถือได้ และปรับขนาดได้ด้วยฟังก์ชัน Azure
การปรับใช้ฟังก์ชันต่างๆ บน Azure
เมื่อฟังก์ชันต่างๆ พร้อมแล้ว คุณสามารถปรับใช้กับ Azure ผ่าน Azure CLI, PowerShell, Visual Studio หรือโดยตรงจากเครื่องมือหลักของ Azure Functions CLI:
สำเนา
func azure functionapp เผยแพร่ <function-app-name>
สิ่งนี้จะเผยแพร่โฟลเดอร์โปรเจ็กต์ฟังก์ชันไปยังแอปฟังก์ชัน Azure ประโยชน์หลักบางประการของการปรับใช้ฟังก์ชันกับ Azure ได้แก่:
- การปรับขนาดอัตโนมัติ – ฟังก์ชันจะปรับขนาดตามปริมาณคำขอที่เข้ามาหรือทริกเกอร์เวลา
- ความพร้อมใช้งานสูง – หลายอินสแตนซ์ในศูนย์ข้อมูลให้ความพร้อมใช้งานสูง
- การตรวจสอบและการบันทึก – ใช้เครื่องมือ เช่น Application Insights เพื่อตรวจสอบประสิทธิภาพ ข้อผิดพลาด ฯลฯ
- แพลตฟอร์มแบบไร้เซิร์ฟเวอร์ – ไม่มีเซิร์ฟเวอร์ให้จัดเตรียม/จัดการ คุณเพียงแค่มุ่งเน้นไปที่รหัส
- การปรับใช้อย่างต่อเนื่อง – ใช้ไปป์ไลน์ CI/CD สำหรับการปรับใช้อัตโนมัติเมื่อมีการเปลี่ยนแปลงโค้ด
Azure จัดการโครงสร้างพื้นฐานทั้งหมด หลีกเลี่ยงค่าใช้จ่ายที่ไม่ได้ใช้งาน และมอบแพลตฟอร์มแบบไร้เซิร์ฟเวอร์เต็มรูปแบบเพื่อเรียกใช้แอปพลิเคชันแบบไร้เซิร์ฟเวอร์ในขนาดที่เชื่อถือได้
บทสรุป
การประมวลผลแบบไร้เซิร์ฟเวอร์ด้วยฟังก์ชัน Azure ช่วยให้นักพัฒนามุ่งเน้นไปที่ตรรกะทางธุรกิจ ในขณะที่ถ่ายโอนโครงสร้างพื้นฐานและการจัดการการดำเนินงานทั้งหมดไปยัง Azure การสนับสนุนการพัฒนา .NET แบบเนทีฟ รวมถึงตัวเลือกใน การจ้าง ASP.NET Core Developers ช่วยให้สามารถสร้างโซลูชันไร้เซิร์ฟเวอร์ที่แข็งแกร่งได้อย่างง่ายดายใน C# ด้วยทริกเกอร์ การเชื่อมโยง และฟังก์ชันที่ทนทาน นักพัฒนาสามารถสร้างสถาปัตยกรรมและเวิร์กโฟลว์ที่ขับเคลื่อนด้วยเหตุการณ์แบบ end-to-end เป็นฟังก์ชันไร้สถานะและเก็บสถานะได้ เมื่อรวมกับแนวทางปฏิบัติที่ดีที่สุด ฟังก์ชัน Azure จะช่วยให้สามารถสร้างและปรับใช้แอปพลิเคชันแบบไร้เซิร์ฟเวอร์บนคลาวด์ได้อย่างง่ายดายและปรับขนาดได้