Grpc la gì

Giới thiệu về gRPC và protocol buffers

Phần này giới thiệu về gRPC và protocol buffer (bộ đệm giao thức). gRPC có thể sử dụng protocol buffer làm cả Ngôn ngữ Định nghĩa Giao diện (IDL - Interface Definition Language) và làm định dạng trao đổi message (thông điệp) nền tảng của nó.

Tổng quan

Trong gRPC, ứng dụng client có thể gọi TRỰC TIẾP một phương thức (method) của ứng dụng server trên một máy khác như thể nó là một đối tượng cục bộ, giúp ta tạo các ứng dụng và dịch vụ phân tán dễ dàng hơn. Như trong nhiều hệ thống RPC, gRPC dựa trên ý tưởng định nghĩa một service, chỉ định các phương thức (method) có thể được gọi từ xa với các tham số và kiểu trả về của chúng. Ở phía server, server sẽ cài đặt giao diện (interface) này và chạy một gRPC server để xử lý các lời gọi từ client. Ở phía client, client có một stub (hoặc đơn giản được gọi là client trong một số ngôn ngữ) cung cấp các phương thức (method) giống như server.

Grpc la gì

GRPC server và client có thể chạy và nói chuyện với nhau trong nhiều môi trường khác nhau - từ server bên trong Google đến máy tính để bàn của ta - và có thể được viết bằng bất kỳ ngôn ngữ nào được hỗ trợ của gRPC. Vì vậy, ví dụ ta có thể dễ dàng tạo một gRPC server bằng Java với các client bằng Go, Python hoặc Ruby. Ngoài ra, các API mới nhất của Google sẽ có phiên bản gRPC trên giao diện (interface) của chúng, cho phép ta dễ dàng xây dựng chức năng của Google vào các ứng dụng của mình.

Làm việc với Protocol Buffers

Theo mặc định, gRPC sử dụng Protocol Buffer, là cơ chế nguồn mở hoàn thiện của Google để tuần tự hóa (serializing) dữ liệu có cấu trúc (mặc dù nó có thể được sử dụng với các định dạng dữ liệu khác như JSON). Dưới đây là phần giới thiệu nhanh về cách hoạt động.

Bước đầu tiên khi làm việc với protocol bufffer (bộ đệm giao thức) là xác định cấu trúc cho dữ liệu muốn tuần tự hóa trong 1 proto file: đây là file văn bản thông thường có phần mở rộng là .proto. Dữ liệu protocol buffer được cấu trúc như các message, trong đó mỗi message là một bản ghi (record) logic nhỏ chứa một loạt các cặp key-value được gọi là các fields. Đây là một ví dụ đơn giản:

message Person { string name = 1; int32 id = 2; bool has_ponycopter = 3; }

Sau đó, khi đã chỉ định cấu trúc dữ liệu của mình, ta sử dụng trình biên dịch protocol buffer (protoc) để sinh ra các lớp truy cập dữ liệu (data access classes) bằng ngôn ngữ ưa thích từ định nghĩa proto. Chúng cung cấp các accessor đơn giản cho mỗi trường, như name() và set_name(), cũng như các phương thức (method) để tuần tự hóa/phân tích cú pháp toàn bộ cấu trúc đến/từ các byte thô. Vì vậy, chẳng hạn, nếu ngôn ngữ được chọn là C++ thì việc chạy trình biên dịch trong ví dụ trên sẽ tạo ra một lớp (class) có tên là Person. Sau đó, ta có thể sử dụng class này trong ứng dụng của mình để điền (populate), tuần tự hóa và lấy về Person protocol buffer message.

Ta định nghĩa các gRPC service trong các file proto thông thường, với các tham số của phương thức RPC và kiểu trả về được chỉ định làm protocol buffer message:

// The greeter service definition. service Greeter { // Sends a greeting rpc SayHello (HelloRequest) returns (HelloReply) {} } // The request message containing the user's name. message HelloRequest { string name = 1; } // The response message containing the greetings message HelloReply { string message = 1; }

gRPC sử dụng protoc với một plugin gRPC đặc biệt để sinh ra mã (code) từ proto file: ta nhận được mã đã được sinh ra đó từ gRPC client và server cũng như mã protocol buffer thông thường để điền (populate), tuần tự hóa và truy xuất các loại message của mình.

Để tìm hiểu thêm về protocol buffer bao gồm cách cài đặt protoc với gRPC plugin trong ngôn ngữ của mình, hãy xem tài liệu protocol buffers


Phiên bản Protocol Buffer

Mặc dù protocol buffer đã có sẵn cho người dùng nguồn mở một thời gian, nhưng hầu hết các ví dụ từ trang web này sử dụng protocol buffer phiên bản 3 (proto3), có cú pháp đơn giản hơn một chút, một số tính năng mới hữu ích và hỗ trợ nhiều ngôn ngữ hơn. Proto3 hiện có sẵn trong Java, C ++, Dart, Python, Objective-C, C#, lite-runtime (Android Java), Ruby và JavaScript từ protocol buffer GitHub repo, cũng như Go từ golang/protobuf GitHub repo, và nhiều ngôn ngữ hơn đang được phát triển. Ta có thể tìm hiểu thêm trong hướng dẫn ngôn ngữ proto3 và tài liệu tham khảo có sẵn cho mỗi ngôn ngữ. Tài liệu tham khảo cũng bao gồm đặc tả chính thức cho định dạng file .proto.

Nói chung, mặc dù có thể sử dụng proto2 (phiên bản protocol buffer mặc định hiện tại) tốt hơn nên sử dụng proto3 với gRPC vì nó cho phép sử dụng đầy đủ các ngôn ngữ hỗ trợ gRPC, cũng như tránh các vấn đề tương thích với các proto2 client khi nói chuyện proto3 server và ngược lại.

Link gốc

  • Giới thiệu gRPC

    RPC framework mã nguồn mở, hiệu năng cao

  • Khái niệm cốt lõi

    Giới thiệu về các khái niệm gRPC chính, với tổng quan về kiến trúc gRPC và vòng đời RPC. Tổng quan Định nghĩa service Giống như nhiều hệ thống RPC, gRPC dựa trên ý tưởng định nghĩa một service, chỉ định các phương thức (method) có thể được gọi từ xa với các tham số và kiểu trả về của chúng.

Link gốc