0

protoc-gen-grpc-gateway: CẦU NỐI MA THUẬT GIỮA RESTFUL JSON VÀ gRPC

Trong các hệ thống Microservices hiện đại sử dụng Golang, khi bạn đã thiết kế xong các file .proto để chạy gRPC với tốc độ cực nhanh và ràng buộc dữ liệu chặt chẽ, một bài toán thực tế lập tức phát sinh: Làm sao để các ứng dụng Web (SPA, Dashboard) hoặc các bên thứ ba chỉ hỗ trợ giao thức HTTP/JSON truyền thống có thể gọi được vào các gRPC service này mà không bắt buộc phải cài đặt thư viện gRPC phức tạp phía Client?

Và protoc-gen-grpc-gateway chính là "cầu nối thần thánh" sinh ra để giải quyết triệt để bài toán này.

1. Bản Chất Của protoc-gen-grpc-gateway Là Gì?

protoc-gen-grpc-gateway là một plugin mở rộng dành cho trình biên dịch Protocol Buffers (protoc).

Nhiệm vụ duy nhất của nó là: Đọc các định nghĩa gRPC trong file .proto (đặc biệt là các đoạn cấu hình HTTP annotation) để tự động sinh ra một đoạn code Reverse Proxy bằng Go.

  • Trình duyệt / Web Client gửi đi một HTTP/JSON request (ví dụ: POST /api/v1/bo/users).

  • grpc-gateway (được tích hợp sẵn trong service của bạn) sẽ đón lấy request này, dịch ngược JSON thành gRPC message, gọi vào gRPC server nội bộ, nhận kết quả gRPC trả về, ép nó ngược lại thành JSON và gửi trả về cho Client.

  • Client hoàn toàn không hề hay biết rằng bên dưới đang chạy gRPC, chúng chỉ nghĩ rằng đang gọi một RESTful API thuần túy!

2. Nó Hoạt Động Như Thế Nào? (Cơ Chế Khai Báo)

Sức mạnh của grpc-gateway nằm ở việc bạn chỉ cần định nghĩa một lần duy nhất trong file .proto, code sẽ tự động sinh ra cả hai chiều gRPC và HTTP REST.

Hãy nhìn lại cấu trúc khai báo quen thuộc trong các dự án của chúng ta:

Protocol Buffers

syntax = "proto3";

package user;

import "google/api/annotations.proto"; // 👈 Thư viện chuẩn hỗ trợ HTTP mapping

service UserService {
    rpc CreateUserBO (CreateUserRequest) returns (CreateUserResponse) {
        // Khai báo option để grpc-gateway biết cách biến gRPC này thành HTTP endpoint nào
        option (google.api.http) = {
            post: "/api/v1/bo/users"
            body: "*" // Nghĩa là toàn bộ JSON body sẽ được map thẳng vào CreateUserRequest
        };
    }
}

Khi bạn chạy lệnh biên dịch protoc kèm theo plugin này, nó sẽ sinh ra một file phụ trợ (thường có tên *.pb.gw.go). File này chứa hàm RegisterUserServiceHandlerFromEndpoint, giúp bạn cắm trực tiếp vào HTTP server (như Gin, Echo hoặc net/http thuần) để mở cổng nhận request HTTP.

3. Tại Sao Kiến Trúc Enterprise Lại Cực Kỳ Ưa Chuộng Giao Thức Này?

  1. Nhất quán một nguồn chân lý (Single Source of Truth): Bạn không cần phải viết hai bộ tài liệu khác nhau (một bản cho gRPC nội bộ, một bản cho RESTful API bên ngoài). File .proto chính là hợp đồng duy nhất quản lý cả hai thế giới.

  2. Tận dụng tối đa hiệu năng của gRPC: Giao tiếp nội bộ giữa các microservices bên trong hệ thống (như từ gateway-api sang user-biz, rồi sang user-mnt) hoàn toàn chạy bằng gRPC nhị phân siêu tốc qua HTTP/2. Chỉ có duy nhất lớp ngoài cùng tiếp xúc với Client bên ngoài mới được dịch sang JSON thông qua Gateway.

  3. Tương thích ngược hoàn hảo: Giúp các hệ thống cũ (chỉ biết gọi HTTP/REST) dễ dàng tích hợp và di chuyển dần lên nền tảng microservices hiện đại mà không làm đứt gãy luồng kinh doanh hiện tại.

4. Tóm Tắt Luồng Chạy Thực Tế

Khi ứng dụng của bạn khởi động:

  1. HTTP Server lắng nghe ở cổng ngoài (ví dụ cổng 80 hoặc 443).

  2. Khi có request POST /api/v1/bo/users đi vào, grpc-gateway (được dựng bởi protoc-gen-grpc-gateway) sẽ bắt lấy.

  3. Nó đóng gói dữ liệu thành gRPC client request và bắn ngầm sang cổng gRPC nội bộ (ví dụ cổng 50051) của service đích thông qua Consul.

  4. Quá trình hoàn tất một cách hoàn toàn trong suốt đối với người dùng cuối!

💡 Lời Kết

protoc-gen-grpc-gateway là một mảnh ghép hoàn hảo giúp xóa nhòa ranh giới giữa thế giới gRPC hiệu năng cao và thế giới HTTP/RESTful phổ thông. Nắm vững cách dùng plugin này giúp bạn xây dựng những cổng API vừa linh hoạt phục vụ đa dạng client, vừa giữ được cấu trúc hạ tầng microservices bên trong cực kỳ chuẩn chỉnh và mạnh 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í