การสร้างแอปพลิเคชันแบบไร้เซิร์ฟเวอร์ด้วยฟังก์ชัน Azure และโซลูชัน .NET

เผยแพร่แล้ว: 2023-09-21

การสร้างแอปพลิเคชันแบบไร้เซิร์ฟเวอร์ด้วยฟังก์ชัน Azure และโซลูชัน .NET

การประมวลผลแบบไร้เซิร์ฟเวอร์เป็นรูปแบบการดำเนินการบนคลาวด์ที่ช่วยให้นักพัฒนาสามารถสร้างและรันแอปพลิเคชันและบริการโดยไม่ต้องคำนึงถึงเซิร์ฟเวอร์ เมื่อใช้แบบไร้เซิร์ฟเวอร์ แอปพลิเคชันไม่ต้องพึ่งพาการรักษาเซิร์ฟเวอร์ให้ทำงาน — ผู้ให้บริการคลาวด์จะจัดการการจัดสรรและการจัดเตรียมเซิร์ฟเวอร์แบบไดนามิก สิ่งนี้ช่วยให้นักพัฒนามุ่งเน้นไปที่การเขียนโค้ดตรรกะทางธุรกิจมากกว่าการจัดการเซิร์ฟเวอร์

ฟังก์ชัน 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

ในการตั้งค่าสภาพแวดล้อมการพัฒนา:

  1. ติดตั้ง .NET Core SDK เวอร์ชันล่าสุด
  2. ติดตั้ง Azure Functions Core Tools โดยใช้เครื่องมือ dotnet ติดตั้ง -g Microsoft.Azure.WebJobs.Script.WebHost
  3. สร้างไดเร็กทอรีสำหรับโปรเจ็กต์แอป Functions และรัน func init
  4. สิ่งนี้จะทำหน้าที่เป็นโครงโปรเจ็กต์ฟังก์ชันตัวอย่างด้วยเทมเพลตฟังก์ชัน

ตอนนี้คุณสามารถเพิ่มโค้ดฟังก์ชัน ทดสอบในเครื่อง และเผยแพร่ไปยัง 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 จะช่วยให้สามารถสร้างและปรับใช้แอปพลิเคชันแบบไร้เซิร์ฟเวอร์บนคลาวด์ได้อย่างง่ายดายและปรับขนาดได้