0

Bài 6: Quản lý Proto Repository chuyên nghiệp với Buf

Trong các bài học trước, chúng ta đã làm chủ cú pháp Protobuf, biên dịch thủ công qua protoc và tự động hóa bằng Makefile. Tuy nhiên, khi hệ thống microservices phát triển từ một vài service lên đến hàng chục hoặc hàng trăm service, và nhiều team cùng đóng góp vào các file .proto chung, phương pháp truyền thống bắt đầu lộ diện những điểm yếu chí mạng:

  • Quản lý Import phức tạp: Phải chỉ định hàng loạt đường dẫn --proto_path khi các file .proto nằm rải rác ở nhiều thư mục hoặc repository khác nhau.

  • Thiếu chuẩn hóa code (Linting): Không có công cụ tự động kiểm tra xem các lập trình viên có tuân thủ quy tắc đặt tên (snake_case, PascalCase) hay quy tắc đánh số trường hay không.

  • Lỗi tương thích ngược (Breaking Changes): Một lập trình viên vô tình đổi số thứ tự của một field number hoặc đổi kiểu dữ liệu của một trường cũ, khiến các service client đang chạy trên production bị sập hàng loạt mà không có cơ chế cảnh báo trước.

Để giải quyết triệt để những bài toán này, cộng đồng Cloud-Native đã xây dựng một tiêu chuẩn công nghiệp mới mang tên Buf. Trong bài học cuối cùng này, chúng ta sẽ tìm hiểu cách sử dụng Buf để thay thế hoàn toàn protoc truyền thống.

1. Buf là gì?

Buf là một công cụ dòng lệnh (CLI) hiện đại được thiết kế để quản lý, kiểm tra (lint), phát hiện lỗi phá vỡ tương thích (breaking changes) và biên dịch mã nguồn cho Protocol Buffers.

Buf loại bỏ hoàn toàn sự phức tạp của protoc bằng cách tự động hóa mọi thứ thông qua các file cấu hình YAML gọn gàng, giúp bạn tập trung hoàn toàn vào việc thiết kế schema dữ liệu.

2. Cài đặt Buf CLI

Bạn có thể cài đặt Buf nhanh chóng thông qua Homebrew (macOS/Linux) hoặc Go install:

  • Trên macOS / Linux (Homebrew):

    Bash

    brew install bufbuild/buf/buf
    
    
  • Hoặc sử dụng Go install:

    Bash

    go install github.com/bufbuild/buf/cmd/buf@latest
    
    

3. Cấu hình Buf cho dự án Golang

Để cấu hình Buf cho một dự án, bạn chỉ cần tạo 2 file cấu hình nằm ở thư mục gốc của dự án (my-grpc-project/):

  1. buf.yaml (Quản lý quy tắc Lint và Breaking Changes)

  2. buf.gen.yaml (Thay thế toàn bộ các tham số --go_out dài dòng của protoc)

Bước 1: Khởi tạo file buf.yaml

Chạy lệnh khởi tạo hoặc tạo thủ công file buf.yaml:

YAML

version: v1
lint:
  use:
    - DEFAULT  # Áp dụng bộ quy tắc chuẩn hóa cú pháp quốc tế của Google/Buf
breaking:
  use:
    - FILE     # Kiểm tra xem các file .proto có bị thay đổi tương thích ngược không

Bước 2: Khởi tạo file buf.gen.yaml (Quy tắc sinh code Go)

File này thay thế hoàn toàn câu lệnh protoc dài dằng dặc trước đây của chúng ta:

YAML

version: v1
plugins:
  - plugin: go
    out: pb
    opt: paths=source_relative
  - plugin: go-grpc
    out: pb
    opt: paths=source_relative

4. Sức mạnh vượt trội của Buf trong thực chiến

Khi đã có cấu hình hoàn tất, quy trình làm việc với Protobuf của bạn sẽ được nâng lên một tầm cao mới với 4 câu lệnh cốt lõi:

A. Kiểm tra lỗi cú pháp và chuẩn hóa (buf lint)

Trước khi commit code lên Git, bạn có thể chạy lệnh lint để Buf kiểm tra xem bạn có đặt sai tên trường, quên đánh số hay vi phạm quy tắc proto3 nào không:

Bash

buf lint

Nếu có lỗi (ví dụ: tên field viết hoa thay vì snake_case), Buf sẽ chỉ chính xác tên file và số dòng cần sửa.

B. Tự động định dạng code (buf format)

Giống như lệnh gofmt trong Go, Buf hỗ trợ tự động căn chỉnh và làm đẹp các file .proto của bạn:

Bash

buf format -w

(Tham số -w giúp ghi đè trực tiếp vào file).

C. Phát hiện lỗi phá vỡ tương thích (buf breaking)

Đây là "vũ khí tối thượng" của Buf khi làm việc nhóm. Trước khi merge PR vào nhánh chính (main), CI/CD có thể chạy lệnh so sánh với nhánh main để xem bạn có vô tình sửa nhầm field number hay không:

Bash

buf breaking --against ".git#branch=main"

Nếu phát hiện bạn đổi số field number của một message cũ, Buf sẽ lập tức báo lỗi và chặn quá trình CI/CD ngay lập tức, cứu toàn bộ hệ thống khỏi thảm họa sập Production.

D. Biên dịch mã nguồn (buf generate)

Thay vì dùng lệnh protoc phức tạp hay gọi Makefile dài dòng, giờ đây bạn chỉ cần gõ đúng một câu lệnh cực kỳ ngắn gọn:

Bash

buf generate

Buf sẽ tự động đọc file buf.gen.yaml, tìm mọi file .proto trong dự án và sinh ra mã nguồn .pb.go sạch sẽ vào thư mục pb/ trong chớp mắt.

Tổng kết Series Build Protobuf & gRPC

Chúc mừng bạn đã hoàn thành trọn vẹn chuỗi series chuyên sâu về Protobuf và gRPC trong Golang:

  1. Hiểu rõ lý do vì sao Protobuf vượt trội hơn JSON về tốc độ và dung lượng nhị phân.

  2. Làm chủ cú pháp proto3, từ scalar types, repeated, enum đến Nested Messages và Timestamp.

  3. Cài đặt toolchain và biên dịch thủ công qua protoc.

  4. Hiện thực hóa gRPC Server và Client hoàn chỉnh bằng Go.

  5. Tự động hóa quy trình với Makefile.

  6. Nâng tầm chuyên nghiệp với Buf (Linting, Breaking Change Detection, và Code Generation hiện đại).


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í