Что такое gRPC

В этом посте представлены gRPC и protocol buffers. gRPC может использовать protocol buffers как в качестве языка определения интерфейса (IDL), так и в качестве основного формата обмена сообщениями.

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

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

Работа с protocol buffer

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

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

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

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

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

// Определение службы greeter.
service Greeter {
  // Отправляет приветствие.
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// Сообщение запроса, содержащее имя пользователя.
message HelloRequest {
  string name = 1;
}

// Сообщение ответа, содержащее привествие
message HelloReply {
  string message = 1;
}

gRPC также использует protoc со специальным плагином gRPC для генерации кода из вашего файла proto. Однако с помощью плагина gRPC вы получаете сгенерированный код клиента и сервера gRPC, а также обычный код protocol buffer для заполнения, сериализации и получения типов сообщений.

Версии protocol buffer

Хотя protocol buffers были доступны для open source пользователей в течение некоторого времени, в примерах gRPC используется новый вид protocol buffers, называемый proto3, который имеет слегка упрощенный синтаксис, некоторые полезные новые функции и поддерживает гораздо больше языков. В настоящее время proto3 доступен на Java, C++, Python, Objective-C, C#, в облегченной среде выполнения (Android Java), Ruby и JavaScript, а также в генераторе языка Go, с большим количеством языков в разработке.


Читайте также:


Комментарии

Популярные сообщения из этого блога

Язык поисковых запросов в Graylog

Нормальные формы, пример нормализации в базе данных

Хэш-таблица: разрешение коллизий