Skip to main content
0

ภาษา Golang กำลังได้รับความนิยมอย่างมากสำหรับการพัฒนาเว็บแอปพลิเคชั่น ด้วยความเรียบง่าย ประสิทธิภาพ และความยืดหยุ่น สองตัวเลือกยอดนิยมสำหรับการทำ Web Framework ใน Golang คือ GoFiber และ Gin ในบทความนี้เราจะมาดูกันว่า งานของเราเหมาะกับ Framework ตัวไหนกันแน่!?

ภาษา Golang คืออะไร?

ภาษา Golang หรือ ภาษา Go เป็นภาษา Programming แบบ Open-Source ถูกพัฒนาขึ้นโดยบริษัท Google ในปี 2007 และเป็นภาษาที่ได้รับความนิยมมากขึ้นเรื่อย ๆ ในยุคนี้

โดยภาษา Go นั้นจะมีจุดเด่นในเรื่องของ Performance ที่สามารถทำงานได้อย่างรวดเร็วเทียบกับภาษาอื่น ๆ อีกทั้งยังมีจุดเด่นในเรื่องของ Simplicity ที่เน้นความง่ายในการเขียนและการอ่าน และยังสามารถทำ Concurrent Programming ได้ง่าย เพราะภาษา Golang ถูกออกแบบมาเพื่อทำให้ Application ที่ต้องใช้ Multi-Threading หรือ Distributed Systems เป็นเรื่องที่ง่ายขึ้น

GIN คืออะไร?

Gin เป็น HTTP web framework ที่เขียนด้วยภาษา Go (Golang) มี API ที่คล้ายกับ Martini แต่มีประสิทธิภาพเร็วกว่า Martini ถึง 40 เท่า หากต้องการประสิทธิภาพที่ยอดเยี่ยม ต้องลองใช้ Gin ด้วยตัวคุณเอง

เรามาลอง Hello World ใน GIN กันแบบรวดเร็วกัน

https://miro.medium.com/v2/resize:fit:720/format:webp/1*HtCjHzGwf6iWNqXu5Cndsg.png

ขั้นแรก: เริ่มต้นโมดูล Go

go mod init <module_path>
# example
go mod init github.com/chubu0012/helloworldgin

ขั้นที่สอง: ติดตั้ง GIN Framework

go get -u github.com/gin-gonic/gin

ต่อมาเราจะสร้าง main.go และเขียนโค้ด ดังนี้:

package main

import "github.com/gin-gonic/gin"

func main() {
        r := gin.Default()
        r.GET("/", func(c *gin.Context) {
                c.JSON(200, gin.H{
                        "message": "Hello World",
                })
        })
        r.Run()
}

ลองรันโดยใช้คำสั่ง

go run main.go

เท่านี้! เราก็ได้ api ที่ส่งกลับ Hello World แบบง่ายๆ แล้ว

ตัวอย่างผลลัพธ์

ฟีเจอร์ที่เด่นของ GIN

1. ความเร็ว:

  • การกำหนดเส้นทาง (Routing) ด้วยโครงสร้าง Radix tree ทำให้การค้นหาเส้นทางรวดเร็ว
  • ใช้พื้นที่หน่วยความจำน้อย เหมาะสำหรับการใช้งานบนเซิร์ฟเวอร์ที่มีทรัพยากรจำกัด
  • ไม่มีการใช้ Reflection ช่วยให้ประสิทธิภาพของ API คาดการณ์ได้

2. รองรับ Middleware:

  • รองรับการทำงานแบบ Middleware ซึ่งเป็นฟังก์ชันกลางที่จะถูกเรียกก่อนการทำงานของตัวควบคุม (Handler)
  • ตัวอย่างการใช้งาน Middleware: บันทึก log, ตรวจสอบสิทธิ์, บีบอัดข้อมูล (GZIP) และบันทึกข้อมูลลงฐานข้อมูล

3. ป้องกันการหยุดทำงาน:

  • Gin สามารถดักจับสถานการณ์ Panic (Error ร้ายแรง) ที่เกิดขึ้นระหว่างการทำงานของ HTTP request และกู้คืนการทำงานได้
  • ช่วยให้เซิร์ฟเวอร์ของคุณพร้อมใช้งานเสมอ
  • สามารถรายงานสถานการณ์ Panic นี้ไปยังระบบ Sentry เพื่อวิเคราะห์ปัญหาได้

4. ตรวจสอบความถูกต้องของ JSON:

  • Gin สามารถวิเคราะห์และตรวจสอบความถูกต้องของข้อมูล JSON ใน request
  • เช่น ตรวจสอบว่ามีค่าที่จำเป็นครบถ้วนหรือไม่

5. การจัดกลุ่มเส้นทาง (Route Groups):

  • ช่วยจัดระเบียบเส้นทาง (Routes) ของ API ได้ดียิ่งขึ้น
  • ตัวอย่าง: แยกกลุ่มเส้นทางที่ต้องใช้สิทธิ์ กับไม่ต้องใช้สิทธิ์, แยกกลุ่มตามเวอร์ชันของ API
  • สามารถจัดกลุ่มแบบซ้อนกันได้โดยไม่ส่งผลต่อประสิทธิภาพ

6. การจัดการข้อผิดพลาด:

  • Gin มีวิธีการที่สะดวกในการรวบรวมข้อผิดพลาดทั้งหมดที่เกิดขึ้นระหว่างการทำงานของ HTTP request
  • Middleware สามารถนำข้อผิดพลาดเหล่านี้ไปเขียนลงไฟล์ log, ฐานข้อมูล หรือส่งผ่านเครือข่ายได้

สรุปเกี่ยวกับ GIN

ข้อดี

  1. มีความมินิมอล : Gin นักพัฒนาต้องการให้มินิมอลที่สุด จะมีแต่ features หรือ lib สำคัญๆ เท่านั้น เหมาะสำหรับ service เล็กๆ ที่ไม่ซับซ้อน ทำให้ service ที่เราใช้ตัว Gin เนี่ยจะค่อนข้างรวดเร็ว
  2. debug ง่าย: เนื่องจาก Gin มีวิธีการรวบรวม error ที่เกิดขึ้นระหว่าง process ยิง http request และส่งไปให้ middleware มา handle ต่อได้เลย
  3. มีการแบ่งกลุ่ม API ให้ง่ายต่อการใช้งาน: Gin มีการจัดกลุ่ม api ได้ว่า api ตัวไหน มีการ authorization บ้าง หรือ api ไหนที่จะให้ใช้ middleware ที่สร้างขึ้นมาได้บ้าง เราสามารถจัดกลุ่มได้อย่างไม่จำกัด

ข้อเสีย

  1. ไม่เหมาะกับโปรเจคระดับ Enterprises: ถ้าโปรเจคที่คุณทำอยุ่เป็น monolith ที่มีความซับซ้อนสูง และมี backend ที่ใหญ่มาก Gin อาจจะไม่เหมาะกับโปรเจคสักเท่าไหร่
  2. ข้อจำกัดของ Gin: ในข้อดีก็ต้องมีข้อเสียเช่นกัน เจ้าตัว Gin ที่มีความมินิมอลมากๆ ซึ่งก็อาจะทำให้บาง feature หรือฟังก์ชั่นต่างๆ ที่จำเป็นต่อระบบอาจจะไม่มี (แต่ยังไม่เห็นเคสที่เจอข้อจำกัดสักเท่าไหร่ ถ้าเจอตัวอย่างอาจจะมาเสริมให้นะคะ)

Fiber คืออะไร?

Fiber คือ library ที่ได้แรงบันดาลใจมาจาก Express (ของฝั่ง node.js) ที่ build อยู่บน Fasthttp

  • Fasthttp คือ fastest HTTP engine for Go
  • เน้นไปที่ความไว และความสามารถในการจัดการ “zero memory allocation” ได้

https://repository-images.githubusercontent.com/234231371/00fd8700-5430-11ea-820b-15fd85b2472c

ไม่ลีลา! เรามาเริ่มต้นรัน Hello World ใน Fiber กัน

ขั้นแรก: เริ่มต้นโมดูล Go

go mod init <module_path>
# example
go mod init github.com/chubu0012/helloworldgin

ขั้นที่สอง: ติดตั้ง Fiber Framework

go get github.com/gofiber/fiber/v2

ต่อมาเราจะสร้าง main.go และเขียนโค้ด ดังนี้:

package main

import (
    "github.com/gofiber/fiber/v2"
)

func main() {
    app := fiber.New()

    app.Get("/", func(c *fiber.Ctx) error {
        return c.JSON(fiber.Map{
            "message": "Hello world",
        })
    })

    app.Listen(":8080")
}

ลองรันโดยใช้คำสั่ง

go run main.go

เท่านี้! เราก็ได้ api ที่ส่งกลับ Hello World แบบง่ายๆ แล้ว

ตัวอย่างผลลัพธ์

ฟีเจอร์ที่เด่นของ Fiber

  • กำหนด Routing ง่าย: การตั้งค่าเส้นทาง (Routing) สำหรับแอปพลิเคชันของคุณนั้นง่ายดาย ด้วยรูปแบบการกำหนดที่คล้ายกับ Express.js ทำให้เข้าใจและใช้งานได้สะดวก
  • ประสิทธิภาพสูง: ด้วยการสร้างบนพื้นฐานของ Fasthttp แอปพลิเคชันที่ใช้ Fiber จะทำงานได้อย่างรวดเร็ว! ตัวเฟรมเวิร์คมีผลการทดสอบเปรียบเทียบประสิทธิภาพที่แสดงให้เห็นว่า Fiber โดดเด่นกว่าเฟรมเวิร์คอื่น ๆ
  • รองรับการสร้าง API: เหมาะสำหรับการสร้าง API แบบ RESTful ในภาษา Go รับและส่งข้อมูลได้อย่างรวดเร็วและง่ายดาย
  • รองรับ Middleware: สามารถเลือกใช้มิดเดิลแวร์ที่มีอยู่แล้วมากมาย หรือสร้างมิดเดิลแวร์เองก็ได้ มิดเดิลแวร์มีไว้ตรวจสอบและปรับแต่งการร้องขอ (Request) บางอย่างในแอปพลิเคชันของคุณก่อนที่จะไปถึงตัวควบคุม (Controller)
  • ใช้หน่วยความจำน้อย: Fiber ใช้หน่วยความจำน้อย ช่วยให้คุณสามารถพัฒนาฟีเจอร์ต่างๆ โดยไม่ต้องกังวลมากนักว่าแอปพลิเคชันของคุณจะใช้หน่วยความจำมากเกินไป ส่งผลให้คุณโฟกัสที่แอปพลิเคชันและตรรกะทางธุรกิจ (Business Logic) ได้มากกว่า
  • พัฒนาได้รวดเร็ว: ด้วย API ที่ออกแบบมาอย่างดีและเรียนรู้ได้ง่าย คุณสามารถพัฒนาแอปพลิเคชันของคุณได้รวดเร็ว (โดยเฉพาะอย่างยิ่งสำหรับคนที่เคยใช้ Express.js)
  • รองรับ WebSocket: ใช้ประโยชน์จาก WebSocket ในแอปพลิเคชัน Fiber เพื่อสร้างประสบการณ์การใช้งานแบบโต้ตอบที่รวดเร็ว มีประสิทธิภาพ และรองรับการขยายขนาดได้
  • มีระบบจำกัดอัตราการขอ (Rate Limiter): Fiber ช่วยให้การจำกัดการขอซ้ำ ๆ ไปยัง API และจุดเชื่อมต่อสาธารณะทำได้ง่ายดาย ป้องกันการร้องขอที่มากเกินไป

สรุปเกี่ยวกับ Fiber

ข้อดี:

  1. ประสิทธิภาพที่สูง: Fiber มีความเร็วและประสิทธิภาพในการจัดการ HTTP requests ได้อย่างรวดเร็ว เป็นผลมาจากการออกแบบโครงสร้างที่กะทัดรัด และการใช้ Go’s built-in HTTP handler
  2. ความง่ายในการใช้งาน: API ของ Fiber ออกแบบคล้ายกับ Express.js ซึ่งทำให้คนที่มาจาก JavaScript/Node.js สามารถปรับตัวใช้งานได้ง่าย
  3. ความยืดหยุ่น: Fiber มีความยืดหยุ่นสูงในการปรับแต่งและขยายฟังก์ชันเพิ่มเติมด้วยการใช้ middleware
  4. การจัดการ Error: Fiber มีการจัดการ error ที่ดี โดยมี built-in error handling ที่จะส่ง error ให้กับ middleware เพื่อให้สามารถจัดการได้อย่างเหมาะสม
  5. ความปลอดภัย: Fiber มีการป้องกัน XSS และ CSRF โดยอัตโนมัติ
  6. การรองรับ Routing: Fiber มีการรองรับ routing ที่ยืดหยุ่นสูง สามารถจัดการ URL parameters, query strings และ serve static files ได้อย่างมีประสิทธิภาพ

ข้อเสีย:

  1. ขาดความครอบคลุม: เนื่องจาก Fiber มีแนวคิดที่มินิมอล จึงอาจจะยังขาดความครอบคลุมในบางฟังก์ชันที่เป็นมาตรฐานสำหรับ web framework ขนาดใหญ่
  2. ชุมชนที่ยังเล็ก: เนื่องจาก Fiber เป็น web framework ที่พัฒนาในภาษา Go ซึ่งยังไม่เป็นที่นิยมเท่าภาษาอื่น ๆ จึงทำให้ชุมชนผู้ใช้งานและการสนับสนุนยังมีขนาดเล็กกว่าเมื่อเทียบกับ web framework ที่ใช้ภาษายอดนิยมอย่าง Python หรือ JavaScript
  3. ความต้องการการเรียนรู้เพิ่มเติม: สำหรับนักพัฒนาที่คุ้นเคยกับ web framework ในภาษาอื่น ๆ อาจจะต้องใช้เวลาในการเรียนรู้และปรับตัวในการใช้งาน Fiber


เปรียบเทียบ Gin กับ Fiber

Gin:

  • ใช้ง่าย: Gin ใช้ net/http ซึ่งเป็นแพ็กเกจมาตรฐานของภาษา Go ทำให้ผู้ใช้ Go คุ้นเคยและใช้งานได้ง่าย
  • ฟีเจอร์ครบครัน: Gin รองรับฟีเจอร์ต่างๆ มากมาย เช่น Routing, Middleware, Logging, Templates และอื่นๆ
  • ชุมชนขนาดใหญ่: Gin มีชุมชนผู้ใช้ที่ใหญ่ มีตัวอย่างโค้ดและไลบรารีมากมาย

Fiber:

  • เร็ว: Fiber ใช้ FastHTTP ซึ่งเป็นเว็บเซิร์ฟเวอร์ที่มีประสิทธิภาพสูง ทำให้แอปพลิเคชันที่ใช้ Fiber ทำงานได้รวดเร็ว
  • ใช้หน่วยความจำน้อย: Fiber ใช้หน่วยความจำน้อยกว่า Gin เหมาะสำหรับการใช้งานบนระบบที่มีทรัพยากรจำกัด
  • API ที่เรียบง่าย: Fiber ออกแบบ API ให้ใช้งานง่าย เหมาะสำหรับผู้เริ่มต้น

Requests per second

99 pct. latency (ms)

Maximum latency (ms)

สรุป:

  • Gin: เหมาะสำหรับผู้ใช้ Go ที่ต้องการเฟรมเวิร์คที่ใช้งานง่าย โปรเจคที่มีขนาดไม่ใหญ่มาก มีฟีเจอร์ครบครัน และมีชุมชนผู้ใช้ที่ใหญ่
  • Fiber: เหมาะสำหรับผู้ใช้ที่ต้องการเฟรมเวิร์คที่มีประสิทธิภาพสูง โปรเจคที่มีขนาดกลางจนถึงขนาดใหญ่ ใช้หน่วยความจำน้อย และ API ที่เรียบง่าย

แหล่งอ้างอิง

  1. GIN 101: สร้าง Web Service บน Golang สืบค้นเมื่อวันที่ 5/4/2567 จาก: medium.com/insightera/gin-101-%E0%B8%AA%E0%B8%A3%E0%B9%89%E0%B8%B2%E0%B8%87-web-service-%E0%B8%9A%E0%B8%99-golang-32f46aadeaa6
  2. ตอนที่ 1 เริ่มต้นเขียน API ด้วยภาษา Go (Fiber) 🔥 สืบค้นเมื่อวันที่ 5/4/2567 จาก: medium.com/@kitsugarr/%E0%B8%9E%E0%B8%B2%E0%B8%97%E0%B8%B3-rest-api-%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2%E0%B8%A0%E0%B8%B2%E0%B8%A9%E0%B8%B2-go-fiber-37cf95fde4ed
  3. Welcome | Fiber สืบค้นเมื่อวันที่ 5/4/2567 จาก: https://docs.gofiber.io/
  4. Documentation | GIN สืบค้นเมื่อวันที่ 5/4/2567 จาก: https://gin-gonic.com/docs/
  5. มาฝึกใช้-gin-กันเถอะ-22309ffe3612 5/4/2567 จาก: https://medium.com/@jerapabeamgosoonsongthanee/%E0%B8%A1%E0%B8%B2%E0%B8%9D%E0%B8%B6%E0%B8%81%E0%B9%83%E0%B8%8A%E0%B9%89-gin-%E0%B8%81%E0%B8%B1%E0%B8%99%E0%B9%80%E0%B8%96%E0%B8%AD%E0%B8%B0-22309ffe3612
  6. แนะนำ HTTP Server สืบค้นเมื่อวันที่ 5/4/2567 จาก: https://docs.mikelopster.dev/c/goapi-essential/chapter-3/intro#%E0%B9%81%E0%B8%A5%E0%B9%89%E0%B8%A7-fiber-%E0%B8%84%E0%B8%B7%E0%B8%AD%E0%B8%AD%E0%B8%B0%E0%B9%84%E0%B8%A3-
Pornput Sooduppatham

Author Pornput Sooduppatham

IT KMUTT

More posts by Pornput Sooduppatham

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

ตั้งค่าความเป็นส่วนตัว

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

ยอมรับทั้งหมด
จัดการความเป็นส่วนตัว
  • คุกกี้ที่จำเป็น
    เปิดใช้งานตลอด

    ประเภทของคุกกี้มีความจำเป็นสำหรับการทำงานของเว็บไซต์ เพื่อให้คุณสามารถใช้ได้อย่างเป็นปกติ และเข้าชมเว็บไซต์ คุณไม่สามารถปิดการทำงานของคุกกี้นี้ในระบบเว็บไซต์ของเราได้
    รายละเอียดคุกกี้

  • คุกกี้สำหรับการติดตามทางการตลาด

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

บันทึกการตั้งค่า