Большинство бизнес-приложений, которые используются сегодня, взаимодействуют друг с другом с помощью HTTP 1.1 и REST. Это стало стандартом в отрасли благодаря своей простоте и почти не требует усилий для интеграции приложений.

Однако, как только ваше приложение переходит на уровень обработки миллиона запросов в секунду и более, недостатки вышеупомянутого механизма становятся очевидными. Давайте сначала обратимся к ним -

Без мультиплексирования

Одно соединение HTTP 1.1 может использоваться только для отправки одного запроса и ответа за раз. Это соединение блокируется до получения ответа, что крайне неэффективно.

Ограниченное сжатие

Заголовки HTTP 1.1 не сжимаются, что приводит к ненужному увеличению размера данных запроса. В HTTP / 2 они сжимаются с использованием алгоритма HPACK, который имеет степень сжатия 99%.

Текстовая передача

HTTP 1.1 основан на тексте, что крайне неэффективно для передачи данных. Для них требуются сложные синтаксические анализаторы, а также они не поддерживают высокий уровень сжатия.

HTTP 2 был создан, чтобы избавиться от всех этих ограничений. Он поддерживает мультиплексирование, которое позволяет клиенту отправлять несколько параллельных запросов по одному соединению. Заголовки сжимаются с использованием алгоритма сжатия HPACK и передают двоичные данные.

В статье ниже приводится подробное сравнение с показателями производительности для обоих протоколов.



В этой статье мы рассмотрим, как можно использовать HTTP / 2 в своей службе. В настоящее время самый популярный способ сделать это - использовать gRPC от Google.

gRPC

Проще говоря, это веб-фреймворк, используемый для подключения нескольких сервисов с помощью HTTP / 2. В настоящее время его используют сотни компаний для эффективного подключения микросервисов.

Сервисы gRPC отличаются от REST тем, что они предоставляют не конечные точки, а методы / процедуры. Клиент просто вызывает метод, как если бы он реализован локально, а в фоновом режиме на сервер отправляется вызов RPC, который содержит фактическую реализацию метода.

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

Вызов RPC выполняется через HTTP / 2. Это позволяет пользователям gRPC автоматически использовать все функции вышеуказанного протокола.



Давайте создадим простой сервис Hello World в gRPC с использованием Java. Приведенный здесь пример можно найти на https://grpc.io/docs/quickstart/java/.

Определите услугу

Сначала мы определяем интерфейс службы в файле .proto. Назовем этот файл greeter.proto

Мы называем сервис Greeter. Этот сервис содержит метод SayHello. Метод принимает объект HelloRequest и возвращает объект HelloReply.

Затем мы определяем формат HelloRequest и HelloReply ProtocolBuffers.

Сгенерируйте интерфейсы

Затем мы сгенерируем интерфейс службы и клиентскую заглушку с помощью компилятора protobuf. Создайте свой обычный Java-проект maven. Затем скопируйте файл greeter.proto в папку src / main / proto.

Как только он появится, мы можем использовать прототип компилятора maven для генерации классов Java из этого файла.

Классы будут сгенерированы в каталоге target / generated-sources / protobuf.

Внедрить услугу

Теперь мы можем расширить сгенерированный служебный интерфейс для реализации методов.

Реализуйте клиента

Теперь клиенты могут просто вызвать этот метод sayHello, и служба вернет ответ через HTTP / 2.

Запускаем сервер

Вы можете использовать сервер, связанный с grpc, или вы можете использовать внешние фреймворки, которые уже предоставляют привязки grpc, такие как Vert.x Java

Теперь вы успешно реализовали базовую службу gRPC.

Балансировки нагрузки

Нетривиальная часть запуска службы http / 2 в производственной среде - это балансировка нагрузки. gRPC нарушает стандартную балансировку нагрузки на уровне соединения, то есть создает новое соединение с другим экземпляром для запроса, который по умолчанию предоставляется в Kubernetes или HAProxy. Это связано с тем, что gRPC построен на HTTP / 2, а HTTP / 2 предназначен для одного долговременного TCP-соединения.

Решение состоит в том, чтобы выполнить балансировку нагрузки на уровне запроса. Это означает создание долговременных подключений, а затем распределение запросов по этим подключениям.

Самый простой и эффективный способ сделать это - использовать linkerd2. Это сервисная сетка, которая может работать рядом с вашим Kubernetes / Mesos или любым другим кластером. Linkerd2 служит прокси для входящего запроса. Поскольку он написан на ржавчине, он добавляет очень минимальную задержку (‹1 мс) и запросы балансировки нагрузки между хост-машинами, которые он может обнаружить через k8s API или DNS.

В Linkerd2 не нужно ничего настраивать, он по умолчанию обрабатывает трафик HTTP 1 и 2.

Если вы хотите узнать больше о gRPC, linkerD или http / 2, вы можете перейти по ссылкам ниже:

  1. Балансировка нагрузки gRPC на Kubernetes без слез
  2. HTTP / 2: разница между HTTP / 1.1, преимущества и способы его использования
  3. GRPC Java - Основы

Свяжитесь со мной в LinkedIn или Twitter или напишите письмо на [email protected]