Заметки для чтения на https://time.geekbang.org/column/75
Мое предварительное прочтение: Netty в действии. Очень важно понять, что такое Netty, прежде чем изучать внутреннее устройство gRPC.
01 | Введение в gRPC и как работает сервер gRPC
Существующие структуры RPC:
- Поддержка нескольких языков: gRPC от Google, Thrift от Facebook.
- Ограниченная языковая поддержка: Motan
- Платформа распределенного обслуживания: Dubbo
gRPC - это высокопроизводительный фреймворк OSS и RPC общего назначения, основанный на HTTP / 2.
Вызов gRPC:
Функции:
- Независимость от языка: многоязычная поддержка
- На основе IDL. Генерация кода через proto3.
- Основание на HTTP / 2, поддержка двунаправленного потока, сжатие заголовков, мультиплексирование TCP, push-сервер и т. Д.
- Поддержка буфера протокола и JSON.
Как создается сервер gRPC:
- gRPC init NettyServer (на базе Netty 4.1 HTTP / 2).
- Сервер регистрирует реализации API, сгенерированные из прототипа, в своем внутреннем реестре служб, и при поступлении запросов он вызывает зарегистрированный экземпляр службы, выполняя поиск по имени службы и имени метода, а не через отражение, что еще больше повышает производительность.
- Сервер gRPC impl вызывает метод запуска NettyServer, чтобы запустить сервер HTTP / 2 и получить запросы пользователей.
Как сервер gRPC отвечает на запросы пользователей
- Netty 4.1 обеспечивает поддержку HTTP / 2. gRPC реализует Http2ConnectionHandler для управления сообщениями из HTTP / 2.
- gRPC использует NioEventLoopGroup, чтобы избежать перегрузки ресурсов.
02 | Как работает клиент gRPC
Создание клиента gRPC
gRPC находится поверх HTTP / 2 и является протоколом прикладного уровня. На стороне клиента он создает клиента HTTP / 2 на основе Netty, обеспечивает балансировку нагрузки и отвечает за обработку запросов.
- Клиент инициирует вызов RPC.
- Определите адрес хоста через DnsNameResolver и используйте LoadBalancer, чтобы выбрать один из доступных экземпляров сервера gRPC.
- Сериализуйте PB и используйте поток HTTP / 2 для отправки на сервер gRPC.
- Десериализовать ответ PB.
- Метод Invoke set (Response) в GrpcFuture вызывает блокировку клиентского потока.
gRPC поддерживает 3 способа согласования протокола
- Сервер поддерживает HTTP / 2, что экономит затраты на обновление протокола.
- Используйте HTTP / 1.1 для согласования протокола и последующего обновления.
- TlsNegotiator. Он построен непосредственно поверх TLS и использует расширение ALPN для согласования. Он использует «h2» в качестве маркера протокола.
Как Netty устанавливает соединение для HTTP / 2
Балансировки нагрузки
Два типа балансировки нагрузки
- LB на стороне сервера (внешний LB, делегирование LB)
- LB на стороне клиента (внутренний LB и алгоритм реализованы на стороне клиента)
Пример внешнего LB:
Плюсы этой архитектуры в том, что на стороне клиента нет необходимости реализовывать алгоритмы LB и поддерживать список серверов. Это также дает преимущества сетевой изоляции.
Пример LB на стороне клиента:
По умолчанию gRPC использует LB на стороне клиента и предоставляет механизмы для расширения.
03 | Анализ модели потока gRPC
Это обсуждалось в заметках к чтению Netty In Action, это типичный паттерн NIO Reactor:
Производительность фреймворка RPC зависит от 3 ключевых факторов:
- Модель ввода / вывода. BIO / NIO или AIO.
- Протокол. Остальное + JSON или двоичный протокол TCP.
- Модель резьбы. Где выполняется декодирование / кодирование.
Модель потока на стороне сервера
Создание сервера HTTP / 2, обработка запросов выполняется netty, а де / сериализация - пулом потоков SerializingExecutor gRPC.
Модель потока на стороне клиента
04 | Как работает сервисный вызов gRPC
Пара общих механизмов вызова службы:
- Синхронный звонок.
- Параллельный сервисный вызов.
- Асхронный сервисный вызов.
gRPC предоставляет 2 способа вызова RPC
- Обычный вызов RPC: запрос и ответ.
- База потоковых вызовов по HTTP / 2. Сделайте так, чтобы сервер (или клиент) мог отвечать несколькими ответами (например, 1000 элементов фида, партия за партией).
05 | Дизайн безопасности gRPC
Межсетевые пограничные коммуникации должны передаваться через TLS / SSL.
Если только часть передаваемых данных содержит конфиденциальные данные, мы также можем зашифровать только эту часть данных:
Этого легко добиться с помощью Netty Handler.
Идентификационная аутентификация
Существует несколько способов аутентификации личности: HTTP Basic Authentication, OAuth2, Token и т. Д. Пример аутентификации Token:
Аутентификация на уровне доступа
Распространенным подходом является аутентификация на основе OAuth 2.0:
- Клиентский запрос владельца ресурса для аутентификации (с именем пользователя, паролем и т. Д.)
- Владелец ресурса аутентифицирует базу на основе предоставленной информации и назначает клиенту токен аутентификации.
- Клиент использует токен из шага 2 и запрашивает токен доступа у сервера авторизации.
- Сервер авторизации выдает токен доступа после проверки.
- Клиент передает токен доступа к своему вызову RPC для внутренних ресурсов.
- Серверные службы проверяют токен доступа для доступа.
- Если токен доступа проходит проверку, сервер ресурсов возвращает информацию клиенту.
Целостность и согласованность данных
Используйте SHA и MAC.
Механизмы безопасности gRPC
- Channel Auth. По умолчанию обеспечивает TLS на основе HTTP / 2.
- Invocation Auth. Учетные данные добавляются в заголовки сообщений для каждого вызова RPC.
- Combo Auth. 1 + 2.
- Google OAuth 2.0. Когда вы получаете доступ к Google API с помощью gRPC, он использует ключ сервисных аккаунтов для запроса токена доступа.
06 | Сериализация gRPC
Общая структура сериализации
java.io.Serializable
Минусы:
- не могут перекрестить языки.
- не работоспособен.
Экономия
Плюсы:
- Поддержка множества языков
- IDL супер мощный
- Обеспечивает прямую совместимость
Минусы:
- Изменения в структуре данных требуют редактирования файла IDL, регенерации кода.
MessagePack
Эффективный бинарный протокол.
Протобуферы
Зрелая, кроссплатформенная / языковая / эффективная / производительная и прямая совместимость.
Proto Buffers поддерживается в Netty. Вам просто нужно добавить обработчик кодеков в ChannelPipeline.
Как работает сериализация gRPC?
Диаграмма:
- Используйте шаблон конструктора, чтобы установить пары "ключ-значение" на основе кода, сгенерированного ProtoBuf, и настроить сообщение
- Сериализуйте сообщение в 1) и создайте ProtoInputStream.
- Создайте заголовки NettyClientStream и gRPC HTTP / 2.
- Оберните сериализованное сообщение в SendGrpcFrameCommand и отправьте через поток Netty NIO.
- NettyClientHandler gRPC инициирует запрос на запись и использует Http2ConnectionEncoder для его отправки через стек протокола Netty HTTP / 2.
Конец истории