Бележки за четене на 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 мултиплекс, натискане на сървъра и т.н.
- Поддръжка на протоколен буфер и 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 отговора.
- Извикване на метод 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 реактор:
Ефективността на RPC рамката зависи от 3 ключови фактора:
- I/O модел. BIO/NIO или AIO.
- протокол. Rest + JSON или бинарен TCP протокол.
- Модел на резба. Къде се извършва декодирането/кодирането.
Модел на нишка от страната на сървъра
Създаването на HTTP/2 сървър, обработката на заявките се обработват от netty, а де/сериализацията се обработва от набора от нишки SerializingExecutor на gRPC.
Модел на нишка от страна на клиента
04 | Как работи gRPC Service Call
Няколко общи механизма за повикване на услугата:
- Синхронно повикване.
- Паралелно повикване за услуга.
- Айнхронно сервизно обаждане.
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 механизми за сигурност
- Удостоверяване на канала По подразбиране се предоставя TLS въз основа на HTTP/2.
- Извикване Auth. Идентификационните данни се добавят към заглавките на съобщението за всяко RPC извикване.
- Combo Auth. 1 + 2.
- Google OAuth 2.0. Когато осъществявате достъп до API на Google с gRPC, той използва ключ за акаунти за услуги, за да поиска токен за достъп.
06 | gRPC сериализация
Обща рамка за сериализация
java.io.Serializable
Минуси:
- не може да пресича езици.
- не е производителен.
Пестеливост
Професионалисти:
- Поддържа тонове езици
- IDL е супер мощен
- Осигурява съвместимост напред
Минуси:
- Промените в структурата на данните изискват редактиране на IDL файл, повторно генериране на код.
MessagePack
Ефективен двоичен протокол.
Протобуфери
Зряла, междуплатформена/езикова/ефективна/ефективна и съвместимост напред.
Proto Buffers се поддържат в Netty. Просто трябва да добавите Codec Handler към ChannelPipeline.
Как работи gRPC сериализацията?
Диаграма:
- Използвайте модел на строител, за да зададете ключ-стойности въз основа на генерирания от ProtoBuf код и да настроите съобщение
- Сериализирайте съобщението в 1) и създайте ProtoInputStream.
- Създайте NettyClientStream и gRPC HTTP/2 заглавки.
- Опаковайте сериализираното съобщение в SendGrpcFrameCommand и го изпратете през NIO нишката на Netty.
- NettyClientHandler на gRPC инициира заявката за запис и използва Http2ConnectionEncoder, за да я изпрати през HTTP/2 стека на протокола на Netty.
Край на историята