πŸ•Έ gRPC ΠΈ всС-всС-всС: Π§Π°ΡΡ‚ΡŒ I. Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Для Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ понимания gRPC стоит Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ ΠΈ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°ΠΌΠΈ. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ части Ρ†ΠΈΠΊΠ»Π° ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ REST, RPC ΠΈ Π·Π°Ρ‚Ρ€ΠΎΠ½Π΅ΠΌ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ – SOAP.

ВсС сущСС двиТСтся, ΠΈ Π½ΠΈΡ‡Ρ‚ΠΎ Π½Π΅ остаСтся Π½Π° мСстС.
Π“Π΅Ρ€Π°ΠΊΠ»ΠΈΡ‚ ЭфСсский, Π² ΠΈΠ·Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠŸΠ»Π°Ρ‚ΠΎΠ½Π° (Π΄ΠΈΠ°Π»ΠΎΠ³ Β«ΠšΡ€Π°Ρ‚ΠΈΠ»Β»)
ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ позаимствовал с ΠΎΠ΄Π½ΠΎΠΉ ΠΌΠΎΠ΅ΠΉ любимой ΠΊΠ½ΠΈΠ³ΠΈ. Она сюда ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚. Как ΠΌΠ½Π΅ каТСтся ;)

Π€ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ кодирования Π΄Π°Π½Π½Ρ‹Ρ…

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‚ Π΄Π΅Π»ΠΎ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² (ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ) Π΄Π²ΡƒΡ… прСдставлСниях:

  1. Π’ памяти Π΄Π°Π½Π½Ρ‹Π΅ хранятся Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ…, структурах, списках, массивах, Ρ…ΡΡˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ…, Π΄Π΅Ρ€Π΅Π²ΡŒΡΡ… ΠΈ Ρ‚.Π΄. Π­Ρ‚ΠΈ структуры Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ CPU ΠΌΠΎΠ³ эффСктивно ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π½ΠΈΠΌ ΠΈ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠΈ.
  2. ΠŸΡ€ΠΈ нСобходимости Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΡΠ»Π°Ρ‚ΡŒ ΠΈΡ… ΠΏΠΎ сСти Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² Π½Π΅ΠΊΡƒΡŽ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±Π°ΠΉΡ‚ΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON). Π’Π°ΠΊΠΎΠ΅ прСдставлСниС Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π±Π°ΠΉΡ‚ΠΎΠ² выглядит совсСм Π½Π΅ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ структуры Π΄Π°Π½Π½Ρ‹Ρ… Π² памяти.

Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ способ прСобразования ΠΌΠ΅ΠΆΠ΄Ρƒ этими прСдставлСниями. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· прСдставлСния Π² памяти ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±Π°ΠΉΡ‚ΠΎΠ² называСтся ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ(encoding), ΠΈΠ»ΠΈ сСриализациСй(serialization), ΠΈΠ»ΠΈ ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΠ½Π³ΠΎΠΌ(marshalling), Π° обратная Π΅ΠΌΡƒ опСрация – Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ (decoding), ΠΈΠ»ΠΈ парсингом(parsing), ΠΈΠ»ΠΈ дСсСриализациСй(deserialization), ΠΈΠ»ΠΈ Π΄Π΅ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΠ½Π³ΠΎΠΌ(demarshalling).

Π’ΡƒΡ‚ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌΠΈ ΠΏΡ€Π΅Ρ‚Π΅Π½Π΄Π΅Π½Ρ‚Π°ΠΌΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ JSON ΠΈ XML. Они довольно извСстны, ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ, ΠΈ ΠΈΡ… практичСски ΡΡ‚ΠΎΠ»ΡŒ ΠΆΠ΅ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ Π½Π΅Π΄ΠΎΠ»ΡŽΠ±Π»ΠΈΠ²Π°ΡŽΡ‚. XML часто ΠΊΡ€ΠΈΡ‚ΠΈΠΊΡƒΡŽΡ‚ Π·Π° Π΅Π³ΠΎ Β«ΠΌΠ½ΠΎΠ³ΠΎΡΠ»ΠΎΠ²Π½ΠΎΡΡ‚ΡŒΒ» ΠΈ излишнюю ΡƒΡΠ»ΠΎΠΆΠ½Π΅Π½Π½ΠΎΡΡ‚ΡŒ. JSON обязан своСй ΠΏΠΎΠΏΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒΡŽ Π² основном встроСнной ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ… ΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ простотС ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с XML. CSV – Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ популярный ΠΈ нСзависимый ΠΎΡ‚ языка программирования Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, хотя ΠΈ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰ΠΈΠΉ мСньшими возмоТностями. JSON, XML ΠΈ CSV – тСкстовыС Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠ΅Ρ€Π΅ ΡƒΠ΄ΠΎΠ±ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹Π΅ для людСй.

REST ΠΈ RPC

SOAP vs REST

БущСствуСт нСсколько Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… способов ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ взаимодСйствия процСссов ΠΏΠΎ сСти:

REST – это Π½Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ», Π° скорСС ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ, основанный Π½Π° ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°Ρ… HTTP (ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ моя ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΡ€ΠΎ HTTP https://proglib.io/p/chto-takoe-http-i-https-2021-03-22). Он Π΄Π΅Π»Π°Π΅Ρ‚ Π°ΠΊΡ†Π΅Π½Ρ‚ Π½Π° простых Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ URL для ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ рСсурсов ΠΈ использовании возмоТностСй HTTP для управлСния кэшСм, Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ согласования Ρ‚ΠΈΠΏΠ° ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°. API, спроСктированный Π² соотвСтствии с ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌΠΈ REST, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Π²ΠΎΠΏΠ»ΠΎΡ‰Π°ΡŽΡ‰ΠΈΠΌ REST (RESTful).

RPC(Remote Procedure Call) – класс Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ прСдставлСнии ΠΈΠ»ΠΈ Π² адрСсном пространствС (Π½Π° ΡƒΠ΄Π°Π»Ρ‘Π½Π½Ρ‹Ρ… ΡƒΠ·Π»Π°Ρ…, Π»ΠΈΠ±ΠΎ Π² нСзависимой стороннСй систСмС Π½Π° Ρ‚ΠΎΠΌ ΠΆΠ΅ ΡƒΠ·Π»Π΅). Одной ΠΈΠ· Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ являСтся SOAP. SOAP – это основанный Π½Π° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ XML ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» для выполнСния запросов ΠΊ сСтСвым API. Π‘ΡƒΠ΄ΡƒΡ‡ΠΈ примСняСмым Ρ‡Π°Ρ‰Π΅ всСго ΠΏΠΎ HTTP, ΠΎΠ½ стрСмится ΠΊ нСзависимости ΠΎΡ‚ послСднСго ΠΈ ΠΈΠ·Π±Π΅Π³Π°Π΅Ρ‚ использования Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Π΅Π³ΠΎ возмоТностСй. ВмСсто этого ΠΊ Π½Π΅ΠΌΡƒ прилагаСтся масса Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹Ρ… ΡΠΎΠΏΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… стандартов (Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ Π²Π΅Π±-сСрвисов, извСстный ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ WS-*), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ Π² Π½Π΅Π³ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ возмоТности. API SOAP Π²Π΅Π±-сСрвиса описываСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ основанного Π½Π° XML языка, ΠΈΠΌΠ΅Π½ΡƒΠ΅ΠΌΠΎΠ³ΠΎ языком описания Π²Π΅Π±-сСрвисов (Web Services Description Language, WSDL). ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ SOAP прСдназначался Π² основном для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ RPC.

REST Π±ΠΎΠ»Π΅Π΅ популярСн ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с SOAP, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ Π² контСкстС ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ сСрвисов ΠΌΠ΅ΠΆΠ΄Ρƒ организациями, ΠΈ часто ассоциируСтся с микросСрвисами.

gRPC

gRPC – это Π½ΠΎΠ²Ρ‹ΠΉ ΠΈ соврСмСнный Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ…, соврСмСнных ΠΈ быстрых API ΠΈ дословно пСрСводится ΠΊΠ°ΠΊ систСма ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠ΅ΠΉ Google Π΅Ρ‰Π΅ Π² Π΄Π°Π»Π΅ΠΊΠΎΠΌ 2015 Π³ΠΎΠ΄Ρƒ (https://developers.googleblog.com/2015/02/introducing-grpc-new-open-source-http2.html). Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ Π²Π΅Π΄ΡƒΡ‰ΠΈΠΌΠΈ компаниями, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ Google, Square ΠΈ Netflix, ΠΈ позволяСт программистам ΠΏΠΈΡΠ°Ρ‚ΡŒ микросСрвисы Π½Π° любом языкС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ΠΈ хотят, сохраняя ΠΏΡ€ΠΈ этом Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π»Π΅Π³ΠΊΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ связь ΠΌΠ΅ΠΆΠ΄Ρƒ этими сСрвисами. И Ρ‚Π°ΠΊ ΠΆΠ΅ являСтся Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ (RPC), Π½ΠΎ ΡƒΠΆΠ΅ Π² качСствС транспорта ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ (Π½Π΅ побоюсь ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΌΠΎΠ΄Π½Ρ‹ΠΉ) HTTP/2 (https://http2.github.io/).

ΠΎΡΡ‚Π°Π²Π»ΡŽ ссылку Π³Π΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΈΠ³Ρ€Π°Ρ‚ΡŒΡΡ ΠΈ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ HTTP2 ΠΈ HTTP1.1

А для описания интСрфСйса ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Protocol Buffers (protobuf), Π³Π΄Π΅ описываСтся структура для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ, кодирования ΠΈ ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ прСдставлСниями описанными Π²Ρ‹ΡˆΠ΅. Protocol Buffers ΠΏΡ€ΠΎΡ‰Π΅, ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Π΅Π΅ ΠΈ быстрСС, Ρ‡Π΅ΠΌ XML, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ осущСствляСтся ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π²ΠΎ всСм всСм этом!

ОписаниС Protocol Buffers (protobuf) выглядит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

calculator.proto
// Бинтакс для Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° proto3
syntax = "proto3";

/* НаимСнованиС ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π΄Π°Π½Π½Ρ‹Ρ… */
message Calculator {
    int32 xxx = 1;
    int32 yyy = 2;
}

message CalculatorRequest {
    Calculator calculator = 1;
}

message CalculatorResponse {
    int32 result = 1;
}

/* НаимСнованиС сСрвиса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ
 ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ†ΠΈΡŽ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ xxx ΠΈ yyy
*/
service CalculatorService {
    rpc Calculator(CalculatorRequest) returns (CalculatorResponse) {};
}

ВсС ΠΎΡ‡Π΅Π½ΡŒ просто, Π½Π΅ΠΏΡ€Π°Π²Π΄Π° Π»ΠΈ? (Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ части ΡΡ‚Π°Ρ‚ΡŒΠΈ расскаТСм ΠΏΡ€ΠΎ protobuf ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠ°ΠΊ ΠΈ с Ρ‡Π΅ΠΌ Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅, напишСм свой собствСнный сСрвис).

КакиС Π±Ρ‹Π²Π°ΡŽΡ‚ разновидности API Π² gRPC?

Π£Π½Π°Ρ€Π½Ρ‹ΠΉ (Unary) – синхронный запрос ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ ΠΎΡ‚Π²Π΅Ρ‚ ΠΎΡ‚ сСрвСра.

Π£Π½Π°Ρ€Π½Ρ‹ΠΉ (Unary)

ΠŸΠΎΡ‚ΠΎΠΊΠΎΠ²Π°Ρ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° сСрвСра (Server streaming) – ΠΏΡ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° сСрвСр ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ стрим ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ сообщСния.

ΠŸΠΎΡ‚ΠΎΠΊΠΎΠ²Π°Ρ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° сСрвСра (Server streaming)

ΠŸΠΎΡ‚ΠΎΠΊΠΎΠ²Π°Ρ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° (Client streaming) – Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ сСрвСрный, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΡΡ‚Ρ€ΠΈΠΌΠΈΡ‚ΡŒ сообщСния Π½Π° сСрвСр.

ΠŸΠΎΡ‚ΠΎΠΊΠΎΠ²Π°Ρ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° (Client streaming)

ДвунаправлСнная потоковая ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° (Bi-directional streaming) – ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ соСдинСниС, ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π΄Π²Π° стрима. Π‘Π΅Ρ€Π²Π΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΈΠ»ΠΈ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ запрос ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ β€œΠΏΠΈΠ½Π³-понга”

ДвунаправлСнная потоковая ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° (Bi-directional streaming)

Балансировка Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ (Load Balancing) Π² gRPC

Балансировка Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ сСрвисами Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… ΠΌΠ΅ΠΆΠ΄Ρƒ собой ΠΏΠΎ gRPC выполняСтся Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ простой β€œround-robin” Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ запросов ΠΏΠΎ списку ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΌΡƒ ΠΎΡ‚ LB (LoadBalancing) сСрвСра. ΠŸΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ Π½Π° сторонС LB сСрвСра ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ слоТный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π²Ρ‹Π΄Π°Ρ‡ΠΈ списка бэкСнд сСрвисов ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ LB ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ.

io.grpc.LoadBalancerProvider
io.grpc.internal.PickFirstLoadBalancerProvider
io.grpc.util.SecretRoundRobinLoadBalancerProvider$Provider
Π‘Ρ…Π΅ΠΌΠ° осущСствлСния ΠΈ распрСдСлСния Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π² gRPC
***

На этом ΠΏΠΎΠΊΠ° всС) Начну Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Π²Ρ‚ΠΎΡ€ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Ρ†ΠΈΠΊΠ»Π°, Π³Π΄Π΅ Ρ…ΠΎΡ‡Ρƒ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ сСрвиса, Π° Π² дальнСйшСм ΠΌΡ‹ постараСмся Π½Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π΅Π³ΠΎ!

Π‘ΡƒΠ΄Π΅Ρ‚ интСрСсно ;-) ΠžΡΡ‚Π°Π²Π°ΠΉΡ‚Π΅ΡΡŒ с Π½Π°ΠΌΠΈ!

Π­Ρ‚ΠΎ моя вторая ΡΡ‚Π°Ρ‚ΡŒΡ для proglib.io ΠΈ я Π±ΡƒΠ΄Ρƒ ΠΎΡ‡Π΅Π½ΡŒ Ρ€Π°Π΄, Ссли Π²Ρ‹ ΠΎΡ†Π΅Π½ΠΈΡ‚Π΅ Π΅Π΅, поставив Π»Π°ΠΉΠΊ ΠΈΠ»ΠΈ написав ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ.

Ахунов Азат

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅:

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•

suvorovsda
13 фСвраля 2022

🌐 ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅ Π½Π΅ ΠΈΠ΄ΡƒΡ‚ ΠΏΠΎ самому ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΌΡƒ ΠΏΡƒΡ‚ΠΈ ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ Π½Π° самом Π΄Π΅Π»Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ CDN?

Из этой ΡΡ‚Π°Ρ‚ΡŒΠΈ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ выглядит ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ ΠΈΠ·Π½ΡƒΡ‚Ρ€ΠΈ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚ΠΎΠΏ...
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста
21 января 2018

ΠšΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Π΅ сСти ΠΎΡ‚ А Π΄ΠΎ Π―: классификация, стандарты ΠΈ ΡƒΡ€ΠΎΠ²Π½ΠΈ

ΠšΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Π΅ сСти нСпросты Π² ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠΈ, вСдь Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² ΠΌΠ½ΠΎΠ³ΠΎ, ...
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста
06 мая 2017

8 ΠΊΠ½ΠΈΠ³ ΠΏΠΎ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹ΠΌ сСтям

ΠŸΠΎΠ΄Π±ΠΎΡ€ΠΊΠ° Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠ½ΠΈΠ³ ΠΏΠΎ соврСмСнным сСтям, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ β€” ΠΎΡ‚ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ° Π΄ΠΎ ΠΏ...