Tiếp tục series về Go. Hôm nay mình sẽ hướng dẫn bạn cách xây dựng một RESTful API hoàn chỉnh bằng Go, kết hợp với các công cụ mạnh mẽ và phổ biến trong hệ sinh thái phát triển backend hiện đại.
Vì sao chọn Fiber + GORM + Docker?
🚀 Fiber – Web framework nhẹ, cực nhanh, lấy cảm hứng từ Express.js
🔗 GORM – ORM mạnh mẽ giúp bạn thao tác cơ sở dữ liệu dễ dàng hơn
🐳 Docker – Đóng gói và triển khai ứng dụng một cách linh hoạt, nhất quán
Cấu trúc dự án
go-fiber-api/
├── Dockerfile
├── docker-compose.yml
├── go.mod
├── main.go
├── config/
│ └── database.go
├── models/
│ └── user.go
├── handlers/
│ └── user_handler.go
├── routes/
│ └── router.go
│ └── user_route.go
Bắt đầu thôi nào. Let's go 🏃♂️🏃♂️🏃♂️
Tạo dự án
Bước đầu tiên chúng ta sẽ khởi tạo thư mục chứa dự án.
mkdir go-fiber-api && cd go-fiber-api
go mod init go-fiber-api
Cài đặt các thư viện cần thiết:
go get github.com/gofiber/fiber/v2
go get gorm.io/gorm
go get gorm.io/driver/postgres
Kết nối Database với GORM
Tạo file config/database.go
Ở đây mình sẽ dùng postgresql
package config import ( "fmt" "gorm.io/driver/postgres" "gorm.io/gorm"
) var DB *gorm.DB func ConnectDB() { dsn := "host=db user=postgres password=postgres dbname=fiber_db port=5432 sslmode=disable" db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{}) if err != nil { panic("Failed to connect to database!") } DB = db fmt.Println("📦 Database connected!")
}
Tạo model User
Tại file models/user.go
package models type User struct { ID uint `json:"id" gorm:"primaryKey"` Name string `json:"name"` Email string `json:"email"`
}
Viết Handler xử lý API
Tạo file handlers/user_handler.go
package handlers import ( "github.com/gofiber/fiber/v2" "go-fiber-api/config" "go-fiber-api/models"
) func GetUsers(c *fiber.Ctx) error { var users []models.User config.DB.Find(&users) return c.JSON(users)
} func CreateUser(c *fiber.Ctx) error { user := new(models.User) if err := c.BodyParser(user); err != nil { return c.Status(400).JSON(fiber.Map{"error": "Cannot parse JSON"}) } config.DB.Create(&user) return c.JSON(user)
}
Định tuyến các API
Trong bài này, chúng ta sẽ thao tác với resources là users. Vì vậy chúng ta sẽ định nghĩa các REST API liên quan đến resources này trong file routes/user_route.go và import vào trong router tổng.
File: routes/user_route.go
package routes import ( "github.com/gofiber/fiber/v2" "go-fiber-api/handlers"
) func RegisterUserRoutes(router fiber.Router) { user := router.Group("/users") user.Get("/", handlers.GetUsers) user.Post("/", handlers.CreateUser)
}
File: routes/router.go
package routes import ( "github.com/gofiber/fiber/v2"
) func InitRoutes(app *fiber.App) { api := app.Group("/api") RegisterUserRoutes(api) // Các route từ user_route.go
}
Khởi chạy Fiber App
File: main.go
package main import ( "github.com/gofiber/fiber/v2" "go-fiber-api/config" "go-fiber-api/models" "go-fiber-api/routes"
) func main() { app := fiber.New() config.ConnectDB() config.DB.AutoMigrate(&models.User{}) routes.InitRoutes(app) app.Listen(":3000")
}
Cài đặt Docker vào trong app
Tạo Dockerfile
FROM golang:1.20-alpine WORKDIR /app COPY go.mod ./
COPY go.sum ./
RUN go mod download COPY . . RUN go build -o main . EXPOSE 3000 CMD ["./main"]
Tạo docker-compose.yml
services: api: container_name: go-fiber-api build: . ports: - "3000:3000" depends_on: - db environment: - DB_HOST=db - DB_USER=postgres - DB_PASSWORD=postgres - DB_NAME=fiber_db - DB_PORT=5432 volumes: - .:/app db: container_name: go-fiber-db image: postgres:14 restart: always environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: fiber_db ports: - "5432:5432"
Sau khi bạn config xong docker như trên, bạn chỉ cần mở terminal của dự án lên và run:
docker-compose up --build
Khi bạn sẽ thấy dòng:
Database connected!
là đã connect và build thành công rồi đó.
API sẽ chạy tại: http://localhost:3000
Test thử với Postman hoặc curl
GET http://localhost:3000/api/users
POST http://localhost:3000/api/users
{ "name": "Alice", "email": "alice@example.com"
}
Tổng kết
Vậy là chúng ta đã hoàn thành một RESTful API cơ bản với Go, Fiber, GORM và Docker. Hy vọng bài viết này sẽ giúp các bạn tiếp cận Go một cách dễ dàng và hiệu quả hơn.