gRPC
June 24, 2023

Введение в gRPC

Введение в gRPC и protocol buffers.

Эта страница знакомит вас с gRPC и protocol buffers. gRPC может использовать protocol buffers как в качестве языка описания интерфейса (IDL), так и в качестве базового формата обмена сообщениями. Если вы новичок в gRPC и/или protocol buffers, прочтите эту статью! Если вы просто хотите сначала погрузиться и увидеть gRPC в действии, выберите язык и попробуйте его Quick start.

Обзор

В gRPC клиентское приложение может напрямую вызывать метод серверного приложения на другом компьютере, как если бы это был локальный объект, что упрощает создание распределенных приложений и служб. Как и во многих системах RPC, gRPC основан на идее определения службы (сервиса), его методов, с определёнными параметрами и типами возвращаемых значений, которые можно вызывать удаленно. На стороне сервера, сервер реализует этот интерфейс и запускает сервер gRPC для обработки клиентских вызовов. На стороне клиента у клиента есть заглушка (stub) (в некоторых языках именуемая просто клиентом), которая предоставляет те же методы, что и сервер.

Клиенты и серверы gRPC могут работать и взаимодействовать друг с другом в различных средах — от серверов внутри Google до вашего собственного рабочего стола — и могут быть написаны на любом из поддерживаемых gRPC языков. Так, например, вы можете легко создать сервер gRPC на Java с клиентами на Go, Python или Ruby. Кроме того, новейшие API Google будут иметь версии своих интерфейсов gRPC, что позволит вам легко встраивать функции Google в свои приложения.

Работа с protocol buffers

По умолчанию gRPC использует protocol buffers, зрелый механизм Google с открытым исходным кодом для сериализации структурированных данных (хотя его можно использовать с другими форматами данных, такими как JSON). Вот краткое введение в то, как это работает. Если вы уже знакомы с protocol buffers, смело переходите к следующему разделу.

Первым шагом при работе с protocol buffers является определение структуры данных, которые вы хотите сериализовать в прото-файле: это обычный текстовый файл с расширением .proto. Данные protocol buffers структурированы как сообщения, где каждое сообщение представляет собой небольшую логическую запись информации, содержащую ряд пар имя-значение, называемых полями. Вот простой пример:

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

Затем, после того как вы определили свои структуры данных, вы используете компилятор protocдля создания классов доступа к данным на предпочтительном для вас языке (языках) на основе описанного прототипа. Они обеспечивают возможности доступа к полям, такие как name()и set_name(), а также методы для сериализации/десериализации всей структуры в/из необработанных байтов. Так, например, если выбранный вами язык C++, запуск компилятора в приведенном выше примере сгенерирует класс с именем Person. Затем вы можете использовать этот класс в своем приложении для заполнения, сериализации и извлечения Personсообщений буфера протокола.

Вы определяете службы gRPC в обычных прото-файлах, описывая параметры метода RPC и типы возвращаемых значений, описанными в виде сообщений protocol buffers:

// 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 использует protoc специальный подключаемый модуль gRPC для генерации кода из вашего прото-файла: вы получаете сгенерированный код клиента и сервера gRPC, а также обычный код protocol buffers для заполнения, сериализации и извлечения ваших типов сообщений. Чтобы узнать больше о protocol buffers, в том числе о том, как установить protoc подключаемый модуль gRPC на выбранном вами языке, см. документацию protocol buffers.

Версии protocol buffers

Пока protocol buffers с открытым исходным кодом были доступны для пользователей в течение некоторого времени, большинство примеров с этого сайта используют protocol buffers версии 3 (proto3), которая имеет немного упрощенный синтаксис, новые полезные функции и поддерживает больше языков. Proto3 в настоящее время доступен на Java, C++, Dart, Python, Objective-C, C#, lite-runtime (Android Java), Ruby и JavaScript из репозитория GitHub, а также генератор языка Go из официального пакета golang/protobuf, с другими языками в разработке. Вы можете узнать больше в руководстве по языку proto3 и справочная документация доступны для каждого языка. Справочная документация также включает формальную спецификацию для формата proto файла.

В целом, несмотря на то, что вы можете использовать proto2 (текущая версия буферов протокола по умолчанию), мы рекомендуем вам для gRPC использовать proto3, так как это позволяет вам использовать весь спектр языков, поддерживаемых gRPC, а также позволяет избежать проблем совместимости с клиентами proto2, общающимися с серверами на proto3 и наоборот.

Источник: https://grpc.io/docs/what-is-grpc/introduction/