Заметки для чтения на https://time.geekbang.org/column/75

Мое предварительное прочтение: Netty в действии. Очень важно понять, что такое Netty, прежде чем изучать внутреннее устройство gRPC.

01 | Введение в gRPC и как работает сервер gRPC

Существующие структуры RPC:

  1. Поддержка нескольких языков: gRPC от Google, Thrift от Facebook.
  2. Ограниченная языковая поддержка: Motan
  3. Платформа распределенного обслуживания: Dubbo

gRPC - это высокопроизводительный фреймворк OSS и RPC общего назначения, основанный на HTTP / 2.

Вызов gRPC:

Функции:

  1. Независимость от языка: многоязычная поддержка
  2. На основе IDL. Генерация кода через proto3.
  3. Основание на HTTP / 2, поддержка двунаправленного потока, сжатие заголовков, мультиплексирование TCP, push-сервер и т. Д.
  4. Поддержка буфера протокола и JSON.

Как создается сервер gRPC:

  1. gRPC init NettyServer (на базе Netty 4.1 HTTP / 2).
  2. Сервер регистрирует реализации API, сгенерированные из прототипа, в своем внутреннем реестре служб, и при поступлении запросов он вызывает зарегистрированный экземпляр службы, выполняя поиск по имени службы и имени метода, а не через отражение, что еще больше повышает производительность.
  3. Сервер gRPC impl вызывает метод запуска NettyServer, чтобы запустить сервер HTTP / 2 и получить запросы пользователей.

Как сервер gRPC отвечает на запросы пользователей

  1. Netty 4.1 обеспечивает поддержку HTTP / 2. gRPC реализует Http2ConnectionHandler для управления сообщениями из HTTP / 2.
  2. gRPC использует NioEventLoopGroup, чтобы избежать перегрузки ресурсов.

02 | Как работает клиент gRPC

Создание клиента gRPC

gRPC находится поверх HTTP / 2 и является протоколом прикладного уровня. На стороне клиента он создает клиента HTTP / 2 на основе Netty, обеспечивает балансировку нагрузки и отвечает за обработку запросов.

  1. Клиент инициирует вызов RPC.
  2. Определите адрес хоста через DnsNameResolver и используйте LoadBalancer, чтобы выбрать один из доступных экземпляров сервера gRPC.
  3. Сериализуйте PB и используйте поток HTTP / 2 для отправки на сервер gRPC.
  4. Десериализовать ответ PB.
  5. Метод Invoke set (Response) в GrpcFuture вызывает блокировку клиентского потока.

gRPC поддерживает 3 способа согласования протокола

  1. Сервер поддерживает HTTP / 2, что экономит затраты на обновление протокола.
  2. Используйте HTTP / 1.1 для согласования протокола и последующего обновления.
  3. TlsNegotiator. Он построен непосредственно поверх TLS и использует расширение ALPN для согласования. Он использует «h2» в качестве маркера протокола.

Как Netty устанавливает соединение для HTTP / 2

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

Два типа балансировки нагрузки

  1. LB на стороне сервера (внешний LB, делегирование LB)
  2. LB на стороне клиента (внутренний LB и алгоритм реализованы на стороне клиента)

Пример внешнего LB:

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

Пример LB на стороне клиента:

По умолчанию gRPC использует LB на стороне клиента и предоставляет механизмы для расширения.

03 | Анализ модели потока gRPC

Это обсуждалось в заметках к чтению Netty In Action, это типичный паттерн NIO Reactor:

Производительность фреймворка RPC зависит от 3 ключевых факторов:

  1. Модель ввода / вывода. BIO / NIO или AIO.
  2. Протокол. Остальное + JSON или двоичный протокол TCP.
  3. Модель резьбы. Где выполняется декодирование / кодирование.

Модель потока на стороне сервера

Создание сервера HTTP / 2, обработка запросов выполняется netty, а де / сериализация - пулом потоков SerializingExecutor gRPC.

Модель потока на стороне клиента

04 | Как работает сервисный вызов gRPC

Пара общих механизмов вызова службы:

  1. Синхронный звонок.
  2. Параллельный сервисный вызов.
  3. Асхронный сервисный вызов.

gRPC предоставляет 2 способа вызова RPC

  1. Обычный вызов RPC: запрос и ответ.
  2. База потоковых вызовов по HTTP / 2. Сделайте так, чтобы сервер (или клиент) мог отвечать несколькими ответами (например, 1000 элементов фида, партия за партией).

05 | Дизайн безопасности gRPC

Межсетевые пограничные коммуникации должны передаваться через TLS / SSL.

Если только часть передаваемых данных содержит конфиденциальные данные, мы также можем зашифровать только эту часть данных:

Этого легко добиться с помощью Netty Handler.

Идентификационная аутентификация

Существует несколько способов аутентификации личности: HTTP Basic Authentication, OAuth2, Token и т. Д. Пример аутентификации Token:

Аутентификация на уровне доступа

Распространенным подходом является аутентификация на основе OAuth 2.0:

  1. Клиентский запрос владельца ресурса для аутентификации (с именем пользователя, паролем и т. Д.)
  2. Владелец ресурса аутентифицирует базу на основе предоставленной информации и назначает клиенту токен аутентификации.
  3. Клиент использует токен из шага 2 и запрашивает токен доступа у сервера авторизации.
  4. Сервер авторизации выдает токен доступа после проверки.
  5. Клиент передает токен доступа к своему вызову RPC для внутренних ресурсов.
  6. Серверные службы проверяют токен доступа для доступа.
  7. Если токен доступа проходит проверку, сервер ресурсов возвращает информацию клиенту.

Целостность и согласованность данных

Используйте SHA и MAC.

Механизмы безопасности gRPC

  1. Channel Auth. По умолчанию обеспечивает TLS на основе HTTP / 2.
  2. Invocation Auth. Учетные данные добавляются в заголовки сообщений для каждого вызова RPC.
  3. Combo Auth. 1 + 2.
  4. Google OAuth 2.0. Когда вы получаете доступ к Google API с помощью gRPC, он использует ключ сервисных аккаунтов для запроса токена доступа.

06 | Сериализация gRPC

Общая структура сериализации

java.io.Serializable

Минусы:

  1. не могут перекрестить языки.
  2. не работоспособен.

Экономия

Плюсы:

  1. Поддержка множества языков
  2. IDL супер мощный
  3. Обеспечивает прямую совместимость

Минусы:

  1. Изменения в структуре данных требуют редактирования файла IDL, регенерации кода.

MessagePack

Эффективный бинарный протокол.

Протобуферы

Зрелая, кроссплатформенная / языковая / эффективная / производительная и прямая совместимость.

Proto Buffers поддерживается в Netty. Вам просто нужно добавить обработчик кодеков в ChannelPipeline.

Как работает сериализация gRPC?

Диаграмма:

  1. Используйте шаблон конструктора, чтобы установить пары "ключ-значение" на основе кода, сгенерированного ProtoBuf, и настроить сообщение
  2. Сериализуйте сообщение в 1) и создайте ProtoInputStream.
  3. Создайте заголовки NettyClientStream и gRPC HTTP / 2.
  4. Оберните сериализованное сообщение в SendGrpcFrameCommand и отправьте через поток Netty NIO.
  5. NettyClientHandler gRPC инициирует запрос на запись и использует Http2ConnectionEncoder для его отправки через стек протокола Netty HTTP / 2.

Конец истории