+1

QUY TRÌNH BUILD & DEPLOY THỦ CÔNG: GIẢI PHẪU HỆ THỐNG MICROSERVICE GOLANG

trong thế giới kiến trúc Microservices viết bằng Golang, khi hệ thống của bạn không chỉ có 1 ứng dụng nguyên khối mà phình to thành hàng chục service độc lập (như Auth Service, Order Service, Payment Service, Notification Service), việc quản lý mã nguồn và đưa chúng lên server bằng cơm trở thành một thử thách cực kỳ khắc nghiệt.

Mặc dù các hệ thống Enterprise hiện đại đều hướng tới CI/CD tự động hóa hoàn toàn, việc hiểu tường tận Quy trình Build & Deploy thủ công (Manual Build and Deployment Workflow) chính là nền tảng cốt lõi giúp bạn nắm bắt được bản chất của việc đóng gói và vận hành các Go binary service trên môi trường thực tế.

Hãy cùng mổ xẻ từng bước trong một quy trình build & deploy thủ công chuẩn chỉnh cho hệ thống microservice Golang.

1. Tại Sao Lại Phải Cần Quy Trình Thủ Công Này?

Trong thực tế, ngay cả khi công ty có hệ thống CI/CD tự động, sẽ có những thời điểm hệ thống tự động gặp sự cố, hoặc bạn cần "vá khẩn cấp" (hotfix) một service trực tiếp trên server staging/production. Lúc này, nắm chắc các bước thủ công sẽ cứu nguy cho bạn trong vòng một nốt nhạc.

Một quy trình manual chuẩn gồm 4 giai đoạn khép kín sau:

Giai Đoạn 1: Chuẩn Bị và Cross-Compilation (Biên dịch chéo)

Đây là thế mạnh vô địch của Golang. Máy tính cá nhân (Local) của bạn có thể là macOS (Apple Silicon M1/M2/M3) hoặc Windows, nhưng con Server chạy trên mây (Production) lại chạy hệ điều hành Linux (Ubuntu/CentOS - kiến trúc AMD64 hoặc ARM64).

Bạn bắt buộc phải biên dịch chéo (Cross-compilation) để tạo ra file binary chuẩn chạy trên Linux:

Bash

# Đứng tại thư mục chứa service (ví dụ: orderService)
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags="-s -w" -o bin/order-service ./cmd/server/main.go

  • GOOS=linux GOARCH=amd64: Ép trình biên dịch tạo ra file chạy dành riêng cho hệ điều hành Linux 64-bit.

  • CGO_ENABLED=0: Tắt CGO để tạo ra một file binary tĩnh hoàn toàn (Statically-linked binary), nghĩa là nó không phụ thuộc vào bất kỳ thư viện C nào trên máy chủ đích, giúp bạn chạy trơn tru trên mọi container Docker tối giản nhất (như Alpine hay scratch).

  • -ldflags="-s -w": Cắt bỏ các thông tin debug và symbol table không cần thiết, giúp bóp nhỏ dung lượng file binary xuống mức tối đa (thường từ vài chục MB xuống chỉ còn vài MB).

Giai Đoạn 2: Đóng Gói Docker Image (Containerization)

Trong kiến trúc microservice, mỗi service thường được đóng gói gọn gàng vào bên trong một Docker Container để cách ly tài nguyên.

Bạn viết một file Dockerfile siêu tối ưu cho Go service:

Dockerfile

# Sử dụng builder stage
FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o order-service ./cmd/server/main.go

# Sử dụng stage chạy thực tế siêu nhẹ
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/order-service .
EXPOSE 8080
CMD ["./order-service"]

Sau đó, tiến hành build và tag image thủ công trên máy local:

Bash

docker build -t my-registry.internal/microservices/order-service:v1.0.0 .

(Nếu dùng Docker Hub hoặc Private Registry của công ty, bạn sẽ cần thêm lệnh docker push để đẩy image đó lên kho lưu trữ chung).

Giai Đoạn 3: Vận Chuyển và Triển Khai Lên Server (Deployment)

Sau khi có image (hoặc file binary), bước tiếp theo là đưa nó lên Server thông qua giao thức bảo mật SSH:

  1. Kết nối SSH vào Server:

    Bash

    ssh ubuntu@your-production-server.com
    
    
  2. Kéo (Pull) phiên bản mới nhất về Server: Nếu dùng Docker:

    Bash

    docker pull my-registry.internal/microservices/order-service:v1.0.0
    
    
  3. Cập nhật cấu hình chạy (Docker Compose / Systemd): Nếu bạn quản lý microservice bằng docker-compose.yml trên server, bạn tiến hành cập nhật lại biến version và khởi động lại container đó theo phương pháp Rolling Update thủ công để tránh làm sập gián đoạn hệ thống:

    Bash

    # Dừng service cũ đang chạy
    docker-compose stop order-service
    docker-compose rm -f order-service
    
    # Khởi động service phiên bản mới
    docker-compose up -d order-service
    
    

Giai Đoạn 4: Kiểm Tra Sức Khỏe Hệ Thống (Health Check & Verification)

Một quy trình deploy thủ công chưa bao giờ được tính là hoàn thành nếu thiếu bước kiểm tra sau cùng:

  1. Kiểm tra tiến trình và mức tiêu thụ tài nguyên: Xem thử service có bị lỗi vòng lặp khởi động liên tục (CrashLoopBackOff) hay không bằng lệnh xem log trực tiếp:

    Bash

    docker logs -f --tail=100 order-service
    
    
  2. Kiểm tra Health Check Endpoint: Gọi thử vào cổng endpoint kiểm tra sức khỏe của microservice đó:

    Bash

    curl -I http://localhost:8080/health
    
    

    Nếu nhận về mã phản hồi HTTP/1.1 200 OK, đồng nghĩa với việc service order-service của bạn đã được deploy thủ công thành công rực rỡ!

💡 Những Rủi Ro Chí Mạng Của Quy Trình Thủ Công (Tại sao phải hướng tới CI/CD?)

Mặc dù nắm vững quy trình thủ công giúp bạn hiểu sâu về hạ tầng, nhưng khi hệ thống microservice của bạn phát triển từ 3 service lên tới 30 service, việc làm thủ công sẽ lộ rõ các điểm yếu:

  • Dễ sai sót (Human Error): Quên đổi biến môi trường, gõ nhầm version tag, hoặc quên chạy lệnh migration database.

  • Mất thời gian: Phải ngồi gõ lệnh lặp đi lặp lại cho từng service một.

  • Thời gian downtime lớn: Quá trình tắt service cũ và bật service mới bằng cơm sẽ làm gián đoạn các request của khách hàng trong vài giây đến vài phút.

Lời khuyên: Hãy dùng quy trình thủ công này để dựng móng và hiểu bản chất gói binary của Go, sau đó hãy tự động hóa nó bằng GitHub Actions, GitLab CI, hoặc ArgoCD ngay khi hệ thống bắt đầu mở rộng quy mô!


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í