gRPC — мощный фреймворк для удалённых вызовов процедур (RPC). Он позволяет писать код, как будто он выполняется локально, даже если исполняется на другом компьютере.
Удалённый вызов процедур (RPC)
RPC — форма взаимодействия клиент-сервер, основанная на вызове функций. Используется IDL (язык определения интерфейса) для описания контракта на вызываемые функции и типов данных.
Клиент вызывает удалённую процедуру, сериализует параметры и дополнительную информацию в сообщение, отправляя его на сервер. Сервер десериализует сообщение, выполняет запрашиваемую операцию и отправляет результат обратно клиенту. Стабы клиента и сервера упрощают реализацию сериализации и десериализации.
gRPC заимствует архитектурный стиль взаимодействия клиент-сервер с вызовами функций из RPC, улучшая и популяризируя эту концепцию.
gRPC: Google’s RPC
В 2015 году Google открыла исходный код проекта gRPC. Популярность gRPC обусловлена:
- Абстракцией: gRPC представляет собой простой вызов функции.
- Многоязычной поддержкой: gRPC доступен для многих языков программирования.
- Высокой эффективностью: gRPC отличается высокой производительностью.
- Упрощением HTTP-вызовов: gRPC упрощает работу с HTTP, особенно по сравнению со сложными HTTP-запросами.
gRPC популярен в микросервисной архитектуре, где множество сервисов, часто написанных на разных языках, взаимодействуют друг с другом. gRPC упрощает эти взаимодействия, предоставляя инструменты для решения типичных проблем. Код сам по себе достаточно ясен, что снижает необходимость в обширной документации.
Архитектура и производительность gRPC
Высокая производительность gRPC обусловлена:
- HTTP/2: gRPC использует HTTP/2 как транспортный протокол, заменивший HTTP/1.1 и обеспечивающий ряд преимуществ.
- Мультиплексированием запросов и ответов: HTTP/2 позволяет отправлять и получать несколько запросов и ответов в одном соединении, в отличие от HTTP/1.1, где для каждого запроса требовалось отдельное соединение. Это достигается двоичным кадрированием.
- Сжатием заголовков (HPACK): HTTP/2 сжимает заголовки, уменьшая размер полезной нагрузки, особенно когда заголовки больше данных. Сервер и клиент хранят и сравнивают заголовки, отправляя только изменяющиеся значения.
- Protocol Buffers (protobuf): protobuf — IDL (язык определения интерфейса), используемый в gRPC. Он позволяет эффективно кодировать данные, уменьшая размер полезной нагрузки и повышая производительность по сравнению с JSON.
Возможности gRPC
gRPC предлагает:
- Метаданные: Позволяют передавать дополнительные данные, подобные HTTP-заголовкам, но на более гибком уровне.
- Потоковую передачу: Разрешает выполнять несколько операций в одном запросе. Существуют три типа: серверная потоковая передача (один запрос, несколько ответов), клиентская потоковая передача (несколько запросов, один ответ) и двунаправленная потоковая передача.
- Перехватчики: Позволяют перехватывать и изменять запросы и ответы, добавляя функциональность (например, логирование, аутентификацию или балансировку нагрузки).
- Балансировку нагрузки: gRPC поддерживает балансировку нагрузки на стороне клиента, используя DNS-преобразователь и алгоритмы балансировки.
- Отмену вызова: Клиент может отменить gRPC-вызов, что особенно полезно для потоковой передачи.
gRPC — эффективный и удобный фреймворк для RPC, обладающий высокой производительностью благодаря HTTP/2 и Protocol Buffers, а также предлагающий дополнительные возможности, такие как потоковая передача и перехватчики. Его популярность в микросервисной архитектуре обусловлена простотой использования и поддержкой множества языков программирования.