gRPC
gRPC (Google Remote Procedure Calling) — система удаленного вызова процедур, разработанная компанией Google.
Google как расшифровка литеры g
— лишь одно из возможных значений. В зависимости от версии gRPC разработчики перебирают разные варианты расшифровок. Например, good для версии 1.1, generous для 1.8, game для 1.25 (с примером перечня можно ознакомиться на ресурсе
Примечание
В этой статье описаны общие принципы gRPC, независимо от конкретной версии.
Назначение gRPC
Основное назначение — реализация взаимодействия между микросервисными архитектурами при разработке приложений.
При реализации решений через микросервисные механизмы, каждая логически значимая часть приложения представляет собой законченный программный продукт. Микросервисы взаимодействуют друг с другом, являясь, с точки зрения пользователя, единой системой.
Относительная независимость каждой составляющей системы позволяет разрабатывать, масштабировать и модернизировать микросервисы без изменения программного приложения в целом. Это обеспечивает преимущество модульности микросервисной архитектуре по сравнению с монолитными решениями. Кроме того, микросервисы могут быть реализованы в различных программных средах, обеспечивая гибкий подход к разработке.
При таком подходе к проектированию необходим быстрый, простой и надежный механизм обмена данными между всеми составляющими программного решения. Такой механизм взаимодействия и предлагает gRPC.
gRPC представляет собой логическое развитие протокола RPC, являясь полноценным фреймворком — программным каркасом, объединяющим различные компоненты программных решений в единое целое.
gRPC обеспечивает клиент-серверную структуру обмена данными. Открытый программный код фреймворка, несколько режимов обмена информацией между сервисами (как одно-, так и двунаправленные) и простота реализации коммуникационных взаимодействий позволяют обеспечить поддержку фреймворка в большинстве популярных систем разработки, включая NodeJS, C#, Go, Java и JavaScript.
Основные составляющие gRPC
Фреймворк gRPC включает в себя три основных составляющих:
- Стандарт сериализации данных Protocol Buffers (Protobuf). Сериализация подразумевает преобразование текстовых данных в бинарные (двоичные), оптимизированные под быстрый обмен короткими сообщениями.
- Протокол передачи данных HTTP/2. Протокол является дальнейшим развитием гипертекстового протокола HTTP и оптимизирован для работы с бинарными данными. Он позволяет разбивать передачи на отдельные небольшие пакеты и обеспечивает одновременную поддержку нескольких запросов, включая двунаправленную передачу информации.
- Язык описания интерфейса IDL. Предназначен для упрощенного описания сервисов удаленного вызова процедур с возможностью автоматической генерации кода для выбранной программной среды.
Protobuf
Protobuf или Protocol Buffers — буферный протокол сериализации (бинарного преобразования) структурированных данных.
Преобразование данных в двоичный формат не зависит от программной платформы, что позволяет объединять микросервисы, реализованные на разных языках программирования. В отличие от структурированных данных текстовых форматов, таких как XML или JSON, бинарный формат позволяет эффективно сжимать пакеты сообщений при наличии ограничений на размер пакета (например, в каналах связи с невысокой пропускной способностью).
Удобную сериализацию данных обеспечивает компилятор, который реализует программный код для целевой платформы на основе созданных с помощью кроссплатформенного языка определения интерфейсов (IDL) текстового proto-файла.
HTTP/2
Транспортный бинарный протокол HTTP/2 является развитием протокола SPDY, разработанного корпорацией Google.
HTTP/2 не заменяет, а дополняет протокол передачи данных прикладного уровня HTTP 1.1.
Расширение работы включает:
- способы двоичного кадрирования информации (HTTP 1.1 работает с текстовыми данными);
- обеспечение полного мультиплексирования для распараллеливания запросов;
- возможность работы в полнодуплексном режиме с одновременной отправкой запросов клиента и получением ответов от сервера;
- механизмы потоковой передачи наборов данных как со стороны клиента, так и от сервера;
- приоритизацию сообщений;
- сжатие заголовков передаваемых пакетов данных, уменьшающее трафик в сети.
Все это возможно благодаря бинарной природе протокола HTTP/2 и позволяет микросервисам эффективно обмениваться информацией как в различных симплексных (однонаправленных) режимах, так и используя полноценное дуплексное (двунаправленное) соединение с одновременными приемом и передачей сообщений.
IDL
IDL (Interface Definition Language) — расширение синтаксиса языка Proto Buffers.
IDL в текстовом формате описывает сервисы для удаленного вызова процедур. Синтаксис описания похож на описание классов в языке C++. Сервисы описываются в служебном файле с расширением proto
.
На основе описаний из proto
-файла компилятор создает исполняемый код для целевой программной платформы. Код включает описание типизированных объектов, используемых при передаче сообщений.
Как работает gRPC
gRPC обеспечивает обмен информацией между различными источниками и приемниками (микросервисами). Протокол gRPC подразумевает наличие сервера, определяющего правила обмена данными, и возможные ответы на полученное сообщение клиентских сервисов. Клиенты после получения информационных пакетов могут использовать для работы с ними предоставляемые сервером методы.
Архитектура gRPC
gRPC, как и большинство распределенных сервисов, организован по принципу клиент-серверной архитектуры. Клиенты посылают на сервер информационные запросы, сервер предоставляет ответы и методы их обработки. При этом программная реализация клиента и сервера не имеет особого значения благодаря кроссплатформенности протокола gRPC.
Режимы работы gRPC
gRPC предусматривает четыре возможных режима взаимодействия сервера и клиента:
- Однонаправленное (Unary gRPC), когда после каждого запроса клиент ждет ответа от сервера.
- Потоковая передача сервера (Server streaming gRPC), когда в ответ на запрос клиента сервер предоставляет поток сообщений. Для завершения передачи сервер посылает сообщение о состоянии.
- Потоковая передача клиента (Client streaming gRPC), когда сервер принимает поток сообщений от клиента и отвечает одним подтверждающим сообщением.
- Двунаправленный обмен (Bidirectional streaming gRPC) с разделением каналов передачи сервера и клиента. В этом случае потоки сообщений одновременно передаются в обоих направлениях.
Сравнение gRPC с другими решениями
Protobuf vs XML, JSON
Преимущества | Недостатки |
---|---|
XML и JSON | |
XML и JSON используют структурированный формат данных, удобный для обращения к ним в программном коде. Дополнительным достоинством такого представления информации является возможность анализа этих структур человеком без предварительного декодирования. | Недостатком подобного представления является постоянная необходимость кодирования (сериализации) данных на сервере перед передачей по каналам связи и последующего их декодирования (или десериализации) на клиенте, т.к. физический уровень протоколов обмена понимает только последовательности двоичных данных. Это приводит к увеличению времени передачи, сложности кадрирования информации и повышению вероятности потери отдельных пакетов данных. |
Protobuf | |
gRPC использует бинарный формат хранения данных Protobuf изначально работает с сериализованными данными, что позволяет эффективно обмениваться информацией по низкоскоростным и слабопроизводительным физическим линиям связи без потерь времени на дополнительные преобразования. | Некоторым недостатком при бинарном представлении данных является невозможность чтения их человеком без использования специализированных средств декодирования, в то время как, например, XML-формат является удобочитаемым в обычном текстовом редакторе. |
gRPC vs REST
REST (Representative State Transfer или Передача репрезентативного состояния) — клиент-серверная сетевая архитектура взаимодействия, при которой разработчик предоставляет упрощенный доступ клиентским приложениям пользователя к ресурсам сервера. Как правило доступ осуществляется через обмен данными в формате JSON или XML.
Интерфейс прикладного программирования (Application Programming Interface, API) соответствует технологии REST (является RESTful), если подчиняется определенным требованиям:
- имеет интуитивно понятный внешний вид и предоставляет клиентам доступ к ресурсам серверного приложения;
- имеет многоуровневую архитектуру с разделением функций представления, обработки и управления данными;
- обладает возможностями кеширования (временного хранения) данных приложения;
- сохраняет информацию о состоянии клиентской части только на стороне клиента (сервер при этом информацию о состоянии клиента не хранит);
- разделяет ресурсы серверной и клиентской частей (клиент не обладает полной информацией о серверных ресурсах, ему известны только URL-адреса необходимых компонентов серверного приложения).
Для доступа пользователя к ресурсам каждого из компонентов микросервисной архитектуры используют запросы с предопределенным набором команд HTTP: GET
, PUT
, POST
и DELETE
. В качестве параметров команды передают URL адреса запрашиваемых ресурсов.
RPC (удаленный вызов процедур, Remote Procedure Calling) — механизм, исполняющий процедуры на стороне сервера, а не клиента. Клиент, инициировавший вызов процедуры, в результате исполнения получает готовый результат (ответ) заранее определенного формата.
Сообщения пользователя содержат параметры вызова серверных процедур. RPC интерпретирует пользовательские сообщения и передает их в качестве запросов на сервер. Серверная часть исполняет запрос и возвращает пользователю в ответном сообщении результат его выполнения.
gRPC — подвид механизма RPC, использующий все преимущества как RPC-механизмов, так и механизмов сериализации передаваемых данных.
Для создания своего сервиса на платформе gRPC разработчику нужно:
- Определить формат сообщений для обращения к доступным ресурсам сервиса в текстовом
proto
-файле с помощью IDL. - Сгенерировать компилятором на основе
proto
-файла классы доступа для языка программирования, выбранного при разработке клиентского приложения. - Добавить сгенерированные классы в клиентское приложение для использования соответствующих им методов и ресурсов, предоставляемых серверной частью.
Фреймворк gRPC предоставляет в свободном доступе компиляторы для большинства популярных языков программирования, включая NodeJS, C#, Go, Java и JavaScript.
Характеристика | REST | gRPC |
---|---|---|
Формат сообщений | Структурированный (JSON, XML и другие) | Бинарный (Protobuf) |
Производительность | Средняя, данные требуют дополнительной сериализации | Высокая, данные изначально сериализованы |
Скорость обмена | Средняя, обмен однонаправленный (запрос-ответ) | Высокая, обмен двунаправленный или стриминговый |
Мультиязыковая поддержка | Средняя, требуются сторонние сервисы для мультиязыковых систем | Высокая, встроенная автоматическая генерация кода для популярных языковых сред |
Поддержка браузерами | Работает на всех | Некоторыми браузерами не поддерживается |
Сложность реализации | Низкая, сообщения человекочитаемые | Средняя, сообщения бинарные, требуют описания в шаблоне (proto -файла) |
Недостатки gRPC во многом связаны с тем, что это относительно новая технология. Могут возникнуть проблемы с поддержкой браузерами, отсутствием необходимой документации по API и невозможностью читать сообщения без расшифровки. В то же время REST не может использовать полный набор преимуществ HTTP/2 и обеспечивать настолько же высокую производительность.
REST — хороший вариант почти в любой ситуации, когда не требуется решать специфические задачи. Архитектура не требует особой квалификации разработчика и обладает обширной базой информации по всем возможным проблемам.
gRPC — подходящий выбор для межсерверного взаимодействия, особенно, если ресурсы устройств ограничены (интернет вещей, смартфоны). Мультиязыковая поддержка также делает технологию удобной для использования в архитектуре микросервисов.
Последовательность настройки gRPC
Примеры описания структуры данных и работы с ними в разных программных средах представлены в документации разработчика
Пошагово разберем последовательность настройки протокола gRPC (по материалам официального источника
Для настройки взаимодействия микросервисов через gRPC:
-
Опишите структуру сериализуемых данных в proto-файле.
Подробно описание синтаксиса
proto
-файла приведено на странице разработчика .
Для каждого сообщения, являющегося агрегированным типом данных, указано описание полей. Например, для абонента это текстовые поляname
иemail
, числовое полеid
и агрегированная структураPhoneType
. Каждое поле должно иметь уникальный маркер. Маркер используется для идентификации поля после бинарного преобразования компилятором.Каждое поле может иметь дополнительный модификатор:
required
— поле, требующее обязательного заполнения;repeated
— повторяющееся поле, актуально для режимов потоковой передачи данных;optional
— необязательное поле.
-
После создания файла с необходимой структурой скомпилируйте его для требуемого языка программирования.
Необходимые версии компиляторов представлены
разработчиком фреймворка gRPC.Компилятор сгенерирует программный код для выбранной среды программирования, включая описанные в
proto
-файле классы-сообщения и простейшие методы доступа к данным, сериализации и десериализации.Допускается после компиляции добавлять новые поля в созданную структуру данных без потери совместимости. При парсинге старых записей новые поля игнорируются.
После компиляции все классы и методы gRPC будут доступны в выбранной для работы программной среде наравне с прочими разработанными вами решениями. Использование классов и вызовы методов зависят от конкретного программного окружения. gRPC преобразует вызовы методов в соответствующие бинарные сообщения, передает их на серверную часть, принимает сообщения с результатами вызовов и десериализует полученные данные для дальнейшего использование в разработанном микросервисе.
Интеграция gRPC с другими технологиями
gRPC можно использовать для управления контейнерами и системами хранения данных.
gRPC и контейнеризация
Контейнер — единый исполняемый файл, включающий в себя как исполняемую программу, так и среду для ее исполнения. Для внешнего наблюдателя контейнер является аналогом «черного ящика», структура которого недоступна, а все взаимодействие ведется через интерфейсы связи.
Последовательность настройки взаимодействия внутри мультиконтейнерной структуры:
- Создайте или разверните из образа новый контейнер.
- Включите в структуру контейнера необходимые программные инструменты для работы с gRPC (компиляторы для выбранной программной среды).
- Откройте порт для обмена gRPC сообщениями (способы открытия портов зависят от программного окружения контейнера).
- Создайте внутри контейнера proto-файл необходимой структуры, скомпилируйте, включите полученный программный код в код рабочих сервисов.
- Повторите пункты 1 – 4 для всех контейнеров системы.
- Запустите контейнеры и проверьте обмен информацией в системе.
gRPC и системы хранения данных
Системы хранения данных (СХД) — распределенные по существующим физическим серверам хранилища информации. Эти хранилища могут быть как реальными, так и виртуальными программно-аппаратными комплексами. Основа любого хранилища — заранее спроектированная архитектура, позволяющая с минимальными усилиями масштабировать систему при необходимости увеличения объемов хранимой информации.
Последовательность создания СХД с использованием фреймворка gRPC:
- Разработайте архитектуру СХД, распределите существующие виртуальные и реальные ресурсы на серверные и клиентские мощности.
- Создайте серверную часть системы на любом языке программирования, который поддерживает gRPC.
- Настройте клиентские ресурсы. Создайте
proto
-файлы необходимой структуры, скомпилируйте и используйте получившийся программный код для доступа к хранящейся на серверах информации. - Запустите СХД и проверьте корректность обработки запросов клиентов.
Пример использования
С помощью gRPC вы можете обращаться к большинству ресурсов Yandex Cloud. Например, создание бакета в Yandex Object Storage можно инициировать вызовом метода BucketService/Create
.
Подробнее о методе см. в документации.
Применение и перспективы развития gRPC
Благодаря перечисленным выше особенностям, фреймворк gRPC наиболее перспективно использовать при создании работающих без вмешательства пользователей сервисов:
-
Решений в области интернета вещей (IoT). Подобные системы требуют низкого энергопотребления, которое обеспечивает продолжительный срок службы источников питания элементов системы (датчиков и исполнительных механизмов). Также для IoT-систем характерна низкая пропускная способность каналов связи, так как передающиеся в системе данные приборов и средств автоматики занимают небольшой объем памяти (килобайты).
-
Систем промышленной автоматизации. Для таких систем требуется потоковая передача больших объемов информации, поступающих с датчиков. На основе получаемой информации автоматические алгоритмы контролируют текущее состояние машин и механизмов, выдают рекомендации обслуживающему персоналу по профилактическим и предупредительным осмотрам и ремонтам. Благодаря наличию соответствующих стриминговых режимов работы, gRPC-фреймворк позволяет передавать и обрабатывать данные в реальном времени, не дожидаясь подтверждения от получателя.
-
Мультиязыковых систем. Для решений, построенных на взаимодействии микросервисов, gRPC является идеальной средой обмена информацией. Благодаря особенностям взаимодействия микросервисов в gRPC, разработчик не ограничен использованием одной программной среды разработки и может эффективно использовать преимущества различных решений.
-
Распределенных или серверных архитектур. В системах, построенных на взаимодействии микросервисов различных производителей, решающую роль играет низкая задержка при передаче сообщений. Легкие решения на основе gRPC позволяют обмениваться информацией внутри подобных систем с максимальной эффективностью.
Кроме того, микросервисная архитектура, основанная на использовании единых правил обмена сообщениями, наиболее актуальна при реализации распределенных облачных решений.
Инфраструктурой для таких решений является облачная платформа Yandex Cloud. Ознакомьтесь с возможностями платформы и основными принципами работы API.
Чтобы начать работу с сервисами, войдите в свой аккаунт в Yandex Cloud или зарегистрируйтесь