Apidog

Nền tảng phát triển API hợp tác tất cả trong một

Thiết kế API

Tài liệu API

Gỡ lỗi API

Giả lập API

Kiểm thử API tự động

Cách gRPC Streaming Có Thể Làm Cho API Của Bạn Nhanh Hơn Và Đáng Tin Cậy Hơn

Tìm hiểu về gRPC streaming, cách nó hoạt động và lợi ích của nó cho API của bạn. Cũng tìm hiểu cách sử dụng apidog để kiểm tra và gỡ lỗi các dịch vụ gRPC streaming của bạn.

Minh Triết

Minh Triết

Updated on tháng 11 29, 2024

Nếu bạn đang tìm cách cải thiện hiệu suất và độ tin cậy của các API của mình, bạn có thể muốn xem xét việc sử dụng gRPC streaming. gRPC là một framework hiện đại, mã nguồn mở cho phép bạn tạo ra các dịch vụ hiệu quả và có khả năng mở rộng bằng cách sử dụng protocol buffers và HTTP/2. Streaming là một trong những tính năng chính của gRPC cho phép bạn gửi và nhận nhiều tin nhắn trong một kết nối duy nhất, mà không cần chờ mỗi phản hồi.

Trong bài viết trên blog này, tôi sẽ giải thích gRPC streaming là gì, cách nó hoạt động và tại sao nó có lợi cho các API của bạn. Tôi cũng sẽ chỉ cho bạn cách sử dụng một công cụ gọi là apidog để kiểm tra và gỡ lỗi các dịch vụ gRPC streaming của bạn. Cuối bài viết này, bạn sẽ có cái nhìn rõ hơn về gRPC streaming và cách sử dụng nó trong các dự án của mình.

button

gRPC Streaming là gì?

gRPC streaming là cách gửi và nhận nhiều tin nhắn trong một kết nối duy nhất, sử dụng HTTP/2 như giao thức vận chuyển cơ sở. HTTP/2 là một phiên bản mới hơn của HTTP hỗ trợ multiplexing, có nghĩa là nhiều yêu cầu và phản hồi có thể được gửi qua cùng một kết nối TCP, mà không làm chặn lẫn nhau. Điều này giảm thiểu độ trễ mở và đóng kết nối, và cải thiện độ trễ và thông lượng của các API của bạn.

gRPC streaming cho phép bạn sử dụng bốn loại mẫu giao tiếp:

  • Unary: Đây là mẫu đơn giản và phổ biến nhất, trong đó client gửi một yêu cầu và nhận một phản hồi từ server. Điều này tương tự như yêu cầu và phản hồi HTTP thông thường.
  • Server streaming: Trong mẫu này, client gửi một yêu cầu và nhận nhiều phản hồi từ server. Server có thể stream các phản hồi khi chúng trở nên khả dụng, mà không cần chờ client yêu cầu chúng. Điều này hữu ích cho các kịch bản mà server cần gửi một lượng lớn dữ liệu đến client, hoặc khi server cần đẩy cập nhật đến client theo thời gian thực.
  • Client streaming: Trong mẫu này, client gửi nhiều yêu cầu và nhận một phản hồi từ server. Client có thể stream các yêu cầu khi chúng trở nên khả dụng, mà không cần chờ server xác nhận chúng. Điều này hữu ích cho các kịch bản mà client cần tải lên một lượng lớn dữ liệu đến server, hoặc khi client cần gửi nhiều tham số đến server trong một yêu cầu duy nhất.
  • Bidirectional streaming: Trong mẫu này, client và server có thể gửi và nhận nhiều tin nhắn trong cả hai hướng. Các tin nhắn có thể được gửi và nhận độc lập, mà không cần tuân theo một thứ tự nghiêm ngặt. Điều này hữu ích cho các kịch bản mà client và server cần có một cuộc trò chuyện liên tục và động, hoặc khi client và server cần trao đổi dữ liệu theo kiểu peer-to-peer.

gRPC Streaming hoạt động như thế nào?

gRPC streaming hoạt động bằng cách sử dụng protocol buffers và HTTP/2 để mã hóa và vận chuyển các tin nhắn. Protocol buffers là một định dạng tuần tự nhị phân cho phép bạn định nghĩa cấu trúc và loại tin nhắn của mình trong một tệp schema. Protocol buffers gọn nhẹ, nhanh và dễ sử dụng, và chúng hỗ trợ khả năng tương thích đa ngôn ngữ và đa nền tảng.

HTTP/2 là một giao thức nhị phân hỗ trợ multiplexing, nén và mã hóa. HTTP/2 cho phép bạn gửi nhiều tin nhắn qua cùng một kết nối, sử dụng frame như đơn vị cơ bản của giao tiếp. Mỗi frame có một tiêu đề chỉ định loại, độ dài, và ID dòng của frame. ID dòng là một định danh duy nhất liên kết một frame với một yêu cầu hoặc phản hồi cụ thể. HTTP/2 cũng hỗ trợ kiểm soát lưu lượng và xử lý lỗi, giúp đảm bảo độ tin cậy và hiệu quả của các API của bạn.

Để sử dụng gRPC streaming, bạn cần định nghĩa dịch vụ và các tin nhắn của bạn trong một tệp protocol buffer, sử dụng cú pháp gRPC. Ví dụ, đây là một dịch vụ đơn giản hỗ trợ các cuộc gọi unary và server streaming:

syntax = "proto3";

package example;

// Dịch vụ trả về thời gian hiện tại
service TimeService {
  // Cuộc gọi unary: trả về thời gian hiện tại
  rpc GetTime (GetTimeRequest) returns (GetTimeResponse) {}

  // Cuộc gọi server streaming: trả về thời gian hiện tại mỗi giây
  rpc StreamTime (StreamTimeRequest) returns (stream StreamTimeResponse) {}
}

// Một tin nhắn đại diện cho yêu cầu lấy thời gian hiện tại
message GetTimeRequest {
  // Múi giờ của thời gian được yêu cầu
  string timezone = 1;
}

// Một tin nhắn đại diện cho phản hồi với thời gian hiện tại
message GetTimeResponse {
  // Thời gian hiện tại theo định dạng ISO 8601
  string time = 1;
}

// Một tin nhắn đại diện cho yêu cầu stream thời gian hiện tại
message StreamTimeRequest {
  // Múi giờ của thời gian được yêu cầu
  string timezone = 1;
}

// Một tin nhắn đại diện cho phản hồi với thời gian hiện tại
message StreamTimeResponse {
  // Thời gian hiện tại theo định dạng ISO 8601
  string time = 1;
}

Để triển khai dịch vụ của bạn, bạn cần sử dụng một thư viện gRPC cho ngôn ngữ lập trình mà bạn chọn. gRPC hỗ trợ nhiều ngôn ngữ, như C#, C++, Go, Java, Node.js, Python, Ruby, và nhiều hơn nữa. Mỗi ngôn ngữ có API và quy ước riêng để tạo ra và tiêu thụ các dịch vụ gRPC. Ví dụ, đây là một triển khai đơn giản của TimeService trong Python:

import grpc
import time
from concurrent import futures
from example_pb2 import GetTimeRequest, GetTimeResponse, StreamTimeRequest, StreamTimeResponse
from example_pb2_grpc import TimeServiceServicer, add_TimeServiceServicer_to_server

# Một lớp triển khai TimeService
class TimeService(TimeServiceServicer):
  # Cuộc gọi unary: trả về thời gian hiện tại
  def GetTime(self, request, context):
    # Lấy múi giờ từ yêu cầu
    timezone = request.timezone
    # Lấy thời gian hiện tại theo múi giờ yêu cầu
    time = get_current_time(timezone)
    # Tạo và trả về phản hồi với thời gian hiện tại
    response = GetTimeResponse(time=time)
    return response

  # Cuộc gọi server streaming: trả về thời gian hiện tại mỗi giây
  def StreamTime(self, request, context):
    # Lấy múi giờ từ yêu cầu
    timezone = request.timezone
    # Vòng lặp vô hạn
    while True:
      # Lấy thời gian hiện tại theo múi giờ yêu cầu
      time = get_current_time(timezone)
      # Tạo và trả về phản hồi với thời gian hiện tại
      response = StreamTimeResponse(time=time)
      yield response
      # Chờ một giây
      time.sleep(1)

# Một hàm trả về thời gian hiện tại theo múi giờ nhất định
def get_current_time(timezone):
  # TODO: triển khai hàm này
  pass

# Tạo một server gRPC
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
# Thêm TimeService vào server
add_TimeServiceServicer_to_server(TimeService(), server)
# Bắt đầu server trên cổng 50051
server.add_insecure_port('[::]:50051')
server.start()
# Chờ cho đến khi dừng
server.wait_for_termination()

Để tiêu thụ dịch vụ của bạn, bạn cần sử dụng một client gRPC cho ngôn ngữ lập trình mà bạn chọn. Các client gRPC sử dụng các stub để giao tiếp với các server gRPC. Các stub được tạo ra từ tệp protocol buffer, và chúng cung cấp các phương thức tương ứng với các phương thức dịch vụ. Ví dụ, đây là một client đơn giản gọi TimeService trong Python:

import grpc
from example_pb2 import GetTimeRequest, StreamTimeRequest
from example_pb2_grpc import TimeServiceStub

# Tạo một kênh gRPC đến server
channel = grpc.insecure_channel('localhost:50051')
# Tạo một stub cho TimeService
stub = TimeServiceStub(channel)

# Cuộc gọi unary: lấy thời gian hiện tại ở UTC
request = GetTimeRequest(timezone='UTC')
response = stub.GetTime(request)
print(f'Thời gian hiện tại ở UTC là {response.time}')

# Cuộc gọi server streaming: stream thời gian hiện tại ở PST
request = StreamTimeRequest(timezone='PST')
responses = stub.StreamTime(request)
for response in responses:
  print(f'Thời gian hiện tại ở PST là {response.time}')

Tại sao nên sử dụng gRPC Streaming?

gRPC streaming mang lại nhiều lợi ích cho các API của bạn, chẳng hạn như:

  • Hiệu suất: gRPC streaming giảm thiểu overhead của việc mở và đóng kết nối, và cho phép bạn gửi và nhận nhiều tin nhắn trong một kết nối duy nhất. Điều này cải thiện độ trễ và thông lượng của các API của bạn, và khiến chúng phản hồi nhanh hơn và hiệu quả hơn.
  • Độ tin cậy: gRPC streaming sử dụng HTTP/2, hỗ trợ kiểm soát lưu lượng và xử lý lỗi. Kiểm soát lưu lượng cho phép bạn kiểm soát tốc độ truyền dữ liệu, và tránh mêt mỏi và tràn bộ đệm. Xử lý lỗi cho phép bạn phát hiện và khôi phục từ lỗi, và đóng kết nối một cách thanh lịch. Những tính năng này giúp đảm bảo độ tin cậy và tính nổi bật của các API của bạn, và ngăn ngừa mất mát và hư hại dữ liệu.
  • Tính linh hoạt: gRPC streaming cho phép bạn sử dụng các mẫu giao tiếp khác nhau, tùy vào trường hợp sử dụng và yêu cầu của bạn. Bạn có thể chọn giữa unary, server streaming, client streaming, và bidirectional streaming, và đổi giữa chúng một cách dễ dàng. Điều này mang lại cho bạn sự linh hoạt và kiểm soát hơn đối với các API của bạn, và cho phép bạn xử lý các kịch bản và thách thức khác nhau.
  • Đơn giản: gRPC streaming đơn giản hóa việc phát triển và bảo trì các API của bạn, bằng cách sử dụng protocol buffers và thư viện gRPC. Protocol buffers cho phép bạn định nghĩa dịch vụ và các tin nhắn của bạn một cách rõ ràng và ngắn gọn, và tự động tạo mã cho các ngôn ngữ và nền tảng khác nhau. Thư viện gRPC cho phép bạn tạo và tiêu thụ dịch vụ của mình bằng một API nhất quán và trực quan, và xử lý các chi tiết cấp thấp của streaming và HTTP/2 cho bạn. Điều này làm cho mã của bạn dễ đọc, tái sử dụng, và di động, và giảm thiểu sự phức tạp và boilerplate của các API của bạn.

Cách kiểm tra và gỡ lỗi các dịch vụ gRPC Streaming?

Kiểm tra và gỡ lỗi các dịch vụ gRPC streaming có thể là một thách thức, đặc biệt nếu bạn đang sử dụng các ngôn ngữ và nền tảng khác nhau. May mắn thay, có một công cụ có thể giúp bạn với điều đó: Apidog.

button

Apidog là một công cụ web cho phép bạn kiểm tra và gỡ lỗi các dịch vụ gRPC streaming của bạn, bằng cách sử dụng một giao diện đơn giản và trực quan. apidog hỗ trợ nhiều ngôn ngữ, chẳng hạn như C#, C++, Go, Java, Node.js, Python, Ruby, và nhiều hơn nữa. Apidog cũng hỗ trợ các mẫu giao tiếp khác nhau, chẳng hạn như unary, server streaming, client streaming và bidirectional streaming.

Với apidog, bạn có thể:

  • Kết nối đến server gRPC của bạn, sử dụng một kênh bảo mật hoặc không bảo mật, và chỉ định dịch vụ và phương thức mà bạn muốn gọi.
  • Gửi yêu cầu đến server gRPC của bạn, sử dụng định dạng JSON hoặc nhị phân, và chỉ định metadata và thời hạn cho mỗi yêu cầu.
  • Nhận phản hồi từ server gRPC của bạn, sử dụng định dạng JSON hoặc nhị phân, và xem metadata và trạng thái cho mỗi phản hồi.
  • Giám sát hiệu suất và trạng thái kết nối gRPC của bạn, sử dụng đồ thị và biểu đồ cho thấy độ trễ, thông lượng, và lỗi của các yêu cầu và phản hồi của bạn.
  • Gỡ lỗi dịch vụ gRPC của bạn, sử dụng các nhật ký và dấu vết cho thấy chi tiết và lỗi của các yêu cầu và phản hồi của bạn, và cho phép bạn lọc và tìm kiếm các sự kiện cụ thể.
Server Streaming

Apidog là một công cụ mạnh mẽ và dễ sử dụng có thể giúp bạn kiểm tra và gỡ lỗi các dịch vụ gRPC streaming của bạn, và đảm bảo rằng chúng hoạt động như mong đợi.

Kết luận

gRPC streaming là một tính năng có thể giúp các API của bạn nhanh hơn và đáng tin cậy hơn, bằng cách cho phép bạn gửi và nhận nhiều tin nhắn trong một kết nối duy nhất, sử dụng HTTP/2 và protocol buffers. gRPC streaming cũng mang lại cho bạn tính linh hoạt và đơn giản, bằng cách cho phép bạn sử dụng các mẫu giao tiếp và ngôn ngữ khác nhau, và bằng cách cung cấp cho bạn một API nhất quán và trực quan. gRPC streaming là một lựa chọn tuyệt vời cho các API của bạn, đặc biệt nếu bạn cần xử lý một lượng lớn dữ liệu, cập nhật theo thời gian thực, hoặc tương tác phức tạp.

Nếu bạn muốn tìm hiểu thêm về gRPC streaming, bạn có thể xem tài liệu chính thức tại https://grpc.io/docs. Nếu bạn muốn kiểm tra và gỡ lỗi các dịch vụ gRPC streaming của mình, bạn có thể sử dụng Apidog, một công cụ web cho phép bạn kết nối, gửi, nhận, giám sát và gỡ lỗi các dịch vụ gRPC streaming của bạn, bằng một giao diện đơn giản và trực quan. Bạn có thể thử apidog miễn phí.

button