gRPC — это фреймворк для удалённых вызовов процедур (Remote Procedure Calls, RPC). Буква «g» в названии, согласно официальной документации, является частью самого имени — «gRPC Remote Procedure Calls».
gRPC vs. REST API
gRPC подобен REST API, но отличается архитектурой. REST API ориентирован на ресурсы (получение страницы, отправка формы), используя методы POST, GET, DELETE, PUT, пути в URL и параметры в строке запроса. RPC предназначен для вызова функций, передавая переменные и получая результат без указания методов запроса и путей. gRPC — это RPC, реализованный с использованием Protocol Buffers. Одним из популярных вариантов реализации RPC до gRPC был JSON-RPC.
Пример REST-запроса на обновление цены товара прост. JSON-RPC представляет собой запрос на базовый эндпоинт с указанием метода (функции) и входных параметров в блоке params. Это удобно, но gRPC эффективнее.
Protocol Buffers (Protobuf)
В gRPC Google отказался от JSON в пользу Protocol Buffers (Protobuf) — бинарного формата. В отличие от текстового JSON, Protobuf использует двоичный код, обеспечивая сжатие и ускорение передачи данных. Необходимость сериализации и десериализации компенсируется высокой скоростью.
Protobuf обладает строгой типизацией. В отличие от JSON, где допустимы неверные типы данных, Protobuf требует предварительного определения типов полей, их обязательности и других параметров. Это исключает необходимость валидации данных на стороне приёмника.
Работа с Protobuf и gRPC
Для работы с Protobuf создаётся файл .proto, описывающий передаваемые сообщения с помощью IDL (Interface Description Language). IDL определяет правила описания сообщений, позволяя использовать различные типы данных, enum, массивы, map и встраивать сообщения друг в друга.
Компилятор генерирует код с функциями для создания, кодирования и декодирования сообщений. Protobuf можно использовать независимо от gRPC, например, для хранения файлов.
Для gRPC в файл .proto добавляется блок service, указывающий название сервиса, методы, входящие и исходящие сообщения. Сгенерированный код используется для создания gRPC-сервера (слушает порт, обрабатывает запросы, кодирует/декодирует сообщения) и gRPC-клиента (создаёт сообщения, отправляет запросы, получает ответы).
В обработчики можно добавлять логику без изменения вызываемых методов на другом сервере. Генерация кода поддерживается для разных языков программирования.
Преимущества gRPC
gRPC использует HTTP/2, работающий с бинарным форматом, обеспечивающий мультиплексирование запросов (нет необходимости создавать новое соединение для каждого запроса) и эффективную работу с заголовками (отправляются только измененные). Это обеспечивает высокую скорость.
HTTP/2 поддерживает потоковую передачу данных и полнодуплексный режим, идеальный для стриминга. gRPC гарантирует порядок сообщений и позволяет отменять вызовы.
gRPC подходит для микросервисной архитектуры, обеспечивая быстрое, простое, гибкое и надёжное взаимодействие между службами.
gRPC-Web и REST
Существуют библиотеки gRPC-Web, позволяющие делать запросы с веб-браузеров. REST остаётся актуальным в определённых ситуациях, и выбор между gRPC и REST зависит от конкретных требований проекта.