0

Xây dựng RESTful API với Go, Fiber, GORM và Docker

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.

Screenshot 2025-05-26 at 13.20.24.png

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.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí