0
0
Lập trình
Thaycacac
Thaycacac thaycacac

🌐 Thực Hành Golang gRPC với Interceptor Xác Thực, Streaming và Gateway 🐹

Đăng vào 1 tháng trước

• 4 phút đọc

Giới Thiệu

Trong bài viết này, chúng ta sẽ khám phá lý do tại sao nên sử dụng gRPC thay vì HTTP, cùng với các tính năng tuyệt vời mà gRPC mang lại. Bài viết sẽ cung cấp một ví dụ thực tế về việc xây dựng một dịch vụ gRPC trong Golang, bao gồm các khía cạnh như xác thực, streaming và gateway.

1. Tại Sao Nên Sử Dụng gRPC Hơn HTTP

gRPC là một framework RPC (Remote Procedure Call) hiện đại, nhanh chóng hơn HTTP truyền thống, nhờ vào việc sử dụng HTTP/2Protocol Buffers. Dưới đây là một số lợi ích của gRPC:

  1. Multiplexing của HTTP/2: Khi sử dụng HTTP/2, gRPC cho phép nhiều luồng trên cùng một kết nối, giúp giảm độ trễ.
  2. Gói Nhị Phân của Protocol Buffers: gRPC sử dụng Protocol Buffers thay vì JSON, giúp dữ liệu được mã hóa một cách hiệu quả hơn.
  3. Streaming Hai Chiều: gRPC hỗ trợ việc truyền dữ liệu hai chiều, cho phép máy chủ và khách hàng gửi và nhận dữ liệu đồng thời.
  4. Giảm Độ Trễ và Tài Nguyên: gRPC tối ưu hóa giao tiếp, giảm độ trễ nhờ vào kích thước gói nhỏ hơn và việc mã hóa hiệu quả.
  5. Nén Tiêu Đề: gRPC sử dụng nén HPACK cho tiêu đề, giúp giảm kích thước của metadata giữa client và server.
  6. Kết Nối Bền Vững: với HTTP/2, tiêu đề chỉ được gửi một lần cho mỗi kết nối, giúp tối ưu hóa thông tin.

Những lợi ích này khiến gRPC trở thành sự lựa chọn hàng đầu cho các ứng dụng microservices và IoT.

2. Các Tính Năng Chính của gRPC

Các tính năng chính trong Golang gRPC bao gồm:

  1. RPC Unary: Cuộc gọi yêu cầu - phản hồi đơn giản giữa client và server.
  2. RPC Streaming: Hỗ trợ cho client-streaming, server-streaming, và streaming hai chiều.
  3. Protocol Buffers: Định dạng mã hóa hiệu quả, cho phép tạo ra mã nguồn cho nhiều ngôn ngữ.
  4. Multiplexing: Giúp quản lý nhiều yêu cầu trên cùng một kết nối TCP.
  5. Xác Thực Tích Hợp: Cung cấp các cơ chế SSL/TLS và xác thực dựa trên token.
  6. Xử Lý Lỗi: Cung cấp mã lỗi tiêu chuẩn cho việc xử lý lỗi toàn cầu.
  7. Interceptor: Hỗ trợ middleware cho logging, giám sát và xác thực.
  8. Cân Bằng Tải và Thử Lại: Giúp quản lý việc phân phối lưu lượng và xử lý lỗi trong kiến trúc microservices.

3. Ví Dụ gRPC trong Golang

Chúng ta sẽ xây dựng một dịch vụ ProductService với các chức năng sau:

  1. RPC Unary: Lấy sản phẩm theo ID.
  2. RPC Streaming của Server: Liệt kê tất cả các sản phẩm.
  3. gRPC-Gateway: Mapping gRPC tới các endpoint REST.

Cấu Trúc Dự Án

Copy
test-grpc/
├── auth/
│   ├── auth.go  # Interceptor xác thực cho client & gateway
├── client/
│   ├── main.go  # Triển khai client gRPC
├── gateway/
│   ├── main.go  # Triển khai gateway gRPC
├── models/
│   ├── product.go
├── protocol/
│   ├── gen/      # Thư mục chứa các tệp gRPC tự động sinh ra
│   ├── product.proto
├── server/
│   ├── main.go
│   ├── server.go  # Triển khai server gRPC
├── go.mod
├── go.sum

1. Định Nghĩa Protobuf (protocol/product.proto)

Copy
syntax = "proto3";

package productpb;
option go_package = "pb/";

import "google/protobuf/empty.proto";
import "google/api/annotations.proto";

service ProductService {
    rpc CreateProduct(ProductRequest) returns (ProductResponse);
    rpc GetProduct(ProductID) returns (ProductResponse) {
        option (google.api.http) = {
            get: "/api/v1/products/{id}"
        };
    }
    rpc GetAllProducts(google.protobuf.Empty) returns (ProductList) {
        option (google.api.http) = {
            get: "/api/v1/products/all"
        };
    }
    rpc ListProducts(google.protobuf.Empty) returns (stream Product) {
        option (google.api.http) = {
            get: "/api/v1/products"
        };
    }
}

message Product {
    string id = 1;
    string name = 2;
    float price = 3;
}

message ProductList {
    repeated Product products = 1;
}

message ProductRequest {
    Product product = 1;
}

message ProductResponse {
    Product product = 1;
}

message ProductID {
    string id = 1;
}

Và nhiều chi tiết khác sẽ được trình bày trong phần tiếp theo.

Kết Luận

Bài viết này trình bày chi tiết về những lợi ích của việc sử dụng gRPC trong phát triển ứng dụng ở Golang, đồng thời trình bày các bước thực hiện từ tạo dự án, thiết lập server cho đến việc xây dựng client và gateway. Điều này không chỉ giúp bạn tạo ra dịch vụ gRPC mạnh mẽ mà còn mang lại sự linh hoạt và dễ dàng trong việc mở rộng quy mô. Hãy bắt đầu tạo ra các ứng dụng microservices hiệu quả ngay hôm nay!
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào