Найти Π² Π”Π·Π΅Π½Π΅

πŸ€– ΠŸΡ€ΠΎΡΡ‚Ρ‹ΠΌΠΈ словами: Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ gRPC API ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ

Если Ρ‚Ρ‹ пишСшь Π±Π΅ΠΊΠ΅Π½Π΄, Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Π΅ΡˆΡŒ микросСрвисы ΠΈΠ»ΠΈ просто Ρ…ΠΎΡ‡Π΅ΡˆΡŒ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ΠΎΡ‚ΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ REST ΠΈ пСрСходят Π½Π° gRPC, β€” эта ΡΡ‚Π°Ρ‚ΡŒΡ для тСбя. ΠŸΠΎΠ΄ΠΏΠΈΡΡ‹Π²Π°ΠΉΡ‚Π΅ΡΡŒ Π½Π° ΠΌΠΎΠΉ ΠΊΠ°Π½Π°Π» Π² Π’Π΅Π»Π΅Π³Ρ€Π°ΠΌΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ. Ну ΠΈΠ»ΠΈ Π½Π° ΠΊΠ°Π½Π°Π» Π² VK, Ссли Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ Ρƒ сСбя Π² Π»Π΅Π½Ρ‚Π΅. gRPC (читаСтся ΠΊΠ°ΠΊ "Π΄ΠΆΠΈ-Π°Ρ€-ΠΏΠΈ-си") β€” это способ общСния ΠΌΠ΅ΠΆΠ΄Ρƒ прилоТСниями. Π§Π°Ρ‰Π΅ всСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ΄ΠΈΠ½ сСрвис Β«Π²Ρ‹Π·Π²Π°Π»Β» ΠΌΠ΅Ρ‚ΠΎΠ΄ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ β€” Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ ΠΎΠ½ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ, хотя Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π³Π΄Π΅ ΡƒΠ³ΠΎΠ΄Π½ΠΎ (Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ сСрвСрС, Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ микросСрвисС ΠΈ Π΄Π°ΠΆΠ΅ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ странС). Π“Π»Π°Π²Π½Ρ‹Π΅ Ρ„ΠΈΡˆΠΊΠΈ: REST Π·Π½Π°ΠΊΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΈΠΌ: это ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ отправляСтС HTTP-запрос (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, GET ΠΈΠ»ΠΈ POST) ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ ΠΎΡ‚Π²Π΅Ρ‚ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON. Всё красиво, Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎ, Π½ΠΎ: gRPC ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚: Π’Ρ‹ ΠΎΠΏΠΈΡΡ‹Π²Π°Π΅ΡˆΡŒ API Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ .proto-Ρ„Π°ΠΉΠ»Π΅ (ΠΊΠ°ΠΊ "Ρ‡Π΅Ρ€Ρ‚Ρ‘ΠΆ" ΠΈΠ»ΠΈ "ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚"), ΠΈ Π½Π° Π±Π°Π·Π΅ Π½Π΅Π³ΠΎ автоматичСски ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ классы ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для взаимодСйствия. gRPC ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΉ. Π Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…: ΠŸΡ€ΡΠΌΠΎΠΉ Π°Π½Π°Π»ΠΎΠ³ ΠΎΠ±Ρ‹Ρ‡
ОглавлСниС

Если Ρ‚Ρ‹ пишСшь Π±Π΅ΠΊΠ΅Π½Π΄, Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Π΅ΡˆΡŒ микросСрвисы ΠΈΠ»ΠΈ просто Ρ…ΠΎΡ‡Π΅ΡˆΡŒ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ΠΎΡ‚ΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ REST ΠΈ пСрСходят Π½Π° gRPC, β€” эта ΡΡ‚Π°Ρ‚ΡŒΡ для тСбя.

ΠŸΠΎΠ΄ΠΏΠΈΡΡ‹Π²Π°ΠΉΡ‚Π΅ΡΡŒ Π½Π° ΠΌΠΎΠΉ ΠΊΠ°Π½Π°Π» Π² Π’Π΅Π»Π΅Π³Ρ€Π°ΠΌΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ.

Ну ΠΈΠ»ΠΈ Π½Π° ΠΊΠ°Π½Π°Π» Π² VK, Ссли Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ Ρƒ сСбя Π² Π»Π΅Π½Ρ‚Π΅.

πŸ“Œ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ gRPC

gRPC (читаСтся ΠΊΠ°ΠΊ "Π΄ΠΆΠΈ-Π°Ρ€-ΠΏΠΈ-си") β€” это способ общСния ΠΌΠ΅ΠΆΠ΄Ρƒ прилоТСниями. Π§Π°Ρ‰Π΅ всСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ΄ΠΈΠ½ сСрвис Β«Π²Ρ‹Π·Π²Π°Π»Β» ΠΌΠ΅Ρ‚ΠΎΠ΄ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ β€” Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ ΠΎΠ½ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ, хотя Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π³Π΄Π΅ ΡƒΠ³ΠΎΠ΄Π½ΠΎ (Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ сСрвСрС, Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ микросСрвисС ΠΈ Π΄Π°ΠΆΠ΅ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ странС).

Π“Π»Π°Π²Π½Ρ‹Π΅ Ρ„ΠΈΡˆΠΊΠΈ:

  • Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎΠ²Π΅Ρ€Ρ… HTTP/2 (быстро!)
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Protobuf (ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎ!)
  • АвтоматичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ сСрвСр (ΡƒΠ΄ΠΎΠ±Π½ΠΎ!)

πŸ†š gRPC vs REST: Π² Ρ‡Ρ‘ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π°

REST Π·Π½Π°ΠΊΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΈΠΌ: это ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ отправляСтС HTTP-запрос (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, GET ΠΈΠ»ΠΈ POST) ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ ΠΎΡ‚Π²Π΅Ρ‚ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON. Всё красиво, Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎ, Π½ΠΎ:

  • Π”Π°Π½Π½Ρ‹Π΅ Π² JSON ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ мСста (это тСкст)
  • REST Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎΠ²Π΅Ρ€Ρ… HTTP/1.1, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ самый быстрый
  • ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π½ΠΎΠ²Ρ‹ΠΉ запрос β€” это Π½ΠΎΠ²ΠΎΠ΅ соСдинСниС

gRPC ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚:

  • ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» HTTP/2 β€” ΠΎΠ½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… запросов ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ соСдинСнию, ΠΈ это быстрСС
  • Π€ΠΎΡ€ΠΌΠ°Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Protocol Buffers (Protobuf) β€” это Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ, ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΉ ΠΈ супСрбыстрый Ρ„ΠΎΡ€ΠΌΠ°Ρ‚
  • ΠΠ²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ ΠΊΠΎΠ΄Π° Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… языках: Python, Go, Java, C#, ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ…

πŸ›  Как всё Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

Π’Ρ‹ ΠΎΠΏΠΈΡΡ‹Π²Π°Π΅ΡˆΡŒ API Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ .proto-Ρ„Π°ΠΉΠ»Π΅ (ΠΊΠ°ΠΊ "Ρ‡Π΅Ρ€Ρ‚Ρ‘ΠΆ" ΠΈΠ»ΠΈ "ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚"), ΠΈ Π½Π° Π±Π°Π·Π΅ Π½Π΅Π³ΠΎ автоматичСски ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ классы ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для взаимодСйствия.

-2

πŸ” Π’ΠΈΠΏΡ‹ RPC ΠΈ ΠΊΠ°ΠΊ с этим Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ

gRPC ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΉ. Π Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…:

1️⃣ Unary RPC β€” ΠΎΠ΄ΠΈΠ½ запрос, ΠΎΠ΄ΠΈΠ½ ΠΎΡ‚Π²Π΅Ρ‚

ΠŸΡ€ΡΠΌΠΎΠΉ Π°Π½Π°Π»ΠΎΠ³ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ HTTP POST. ΠžΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° REST-запрос:

πŸ“ž ΠšΠ»ΠΈΠ΅Π½Ρ‚ β†’ Π‘Π΅Ρ€Π²Π΅Ρ€ β†’ ΠžΡ‚Π²Π΅Ρ‚

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

-3

2️⃣ Server streaming β€” ΠΎΠ΄ΠΈΠ½ запрос, ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²

ΠšΠ»ΠΈΠ΅Π½Ρ‚ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚, сСрвСр отправляСт ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ частям.

πŸ“ž ΠšΠ»ΠΈΠ΅Π½Ρ‚ β†’ Π‘Π΅Ρ€Π²Π΅Ρ€ β‡’ ΠžΡ‚Π²Π΅Ρ‚1 β‡’ ΠžΡ‚Π²Π΅Ρ‚2 β‡’ ΠžΡ‚Π²Π΅Ρ‚3...

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

-4

3️⃣ Client streaming β€” ΠΌΠ½ΠΎΠ³ΠΎ запросов, ΠΎΠ΄ΠΈΠ½ ΠΎΡ‚Π²Π΅Ρ‚

ΠšΠ»ΠΈΠ΅Π½Ρ‚ отправляСт ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° сСрвСр, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

πŸ“ž Запрос1 β‡’ Запрос2 β‡’ Запрос3 β‡’ Π‘Π΅Ρ€Π²Π΅Ρ€ β†’ ΠžΡ‚Π²Π΅Ρ‚

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

-5

4️⃣ Bidirectional streaming β€” двусторонний ΠΏΠΎΡ‚ΠΎΠΊ

И ΠΊΠ»ΠΈΠ΅Π½Ρ‚, ΠΈ сСрвСр ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΠ³Π΄Π° захотят.

πŸ“ž ΠšΠ»ΠΈΠ΅Π½Ρ‚ ↔ Π‘Π΅Ρ€Π²Π΅Ρ€ ↔ ΠšΠ»ΠΈΠ΅Π½Ρ‚ ↔ Π‘Π΅Ρ€Π²Π΅Ρ€...

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

-6

πŸ” Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ

gRPC ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚:

  • SSL/TLS β€” для Π·Π°Ρ‰ΠΈΡ‰Ρ‘Π½Π½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ²
  • ΠœΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ (ΠΊΠ°ΠΊ HTTP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ)
  • ΠŸΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‡ΠΈΠΊΠΈ (interceptors) β€” для автоматичСской Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ
  • Status-ΠΊΠΎΠ΄Ρ‹ ΠΈ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ ошибки

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибки:

-7

πŸ§ͺ Как Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ gRPC

gRPC Ρ…ΠΎΡ€ΠΎΡˆΠΎ тСстируСтся, Π½ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ своих ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ²:

🧰 grpcurl β€” ΠΊΠ°ΠΊ curl, Π½ΠΎ для gRPC

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

-8

🎯 ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Ρ€ΡƒΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Π±Π΅Π· ΠΊΠΎΠ΄Π°.

🧰 Postman (Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΡƒΠΌΠ΅Π΅Ρ‚ gRPC)

  • Π”ΠΎΠ±Π°Π²Π»ΡΠ΅ΡˆΡŒ .proto Ρ„Π°ΠΉΠ»
  • Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅ΡˆΡŒ адрСс, Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΡˆΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄
  • Π’Π²ΠΎΠ΄ΠΈΡˆΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² JSON-стилС
  • Π–ΠΌΡ‘ΡˆΡŒ Β«SendΒ»

ΠžΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ для Ρ€ΡƒΡ‡Π½ΠΎΠ³ΠΎ тСстирования ΠΈ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠΈ.

πŸ§ͺ Pytest + gRPC

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ простого ΡŽΠ½ΠΈΡ‚-тСста:

-9

🧩 Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Protobuf?

Protocol Buffers (Protobuf) β€” это Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ хранСния ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Он сильно мСньшС JSON, быстрСС сСриализуСтся ΠΈ дСсСриализуСтся, ΠΈ ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π΅ расходуСт Ρ‚Ρ€Π°Ρ„ΠΈΠΊ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

  • JSON:
-10

β‰ˆ 50 Π±Π°ΠΉΡ‚

  • Protobuf:
-11

β‰ˆ 10 Π±Π°ΠΉΡ‚

Π Π°Π·Π½ΠΈΡ†Π° β€” Π² 5 Ρ€Π°Π·!

✍ Как это примСняСтся Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… систСмах

  • 🎬 Netflix ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ gRPC Π²Π½ΡƒΡ‚Ρ€ΠΈ всСй своСй Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ систСмы
  • πŸš— Uber строит ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ Π½Π° основС общСния дСсятков сСрвисов Ρ‡Π΅Ρ€Π΅Π· gRPC
  • πŸ›’ OZON ΠΈ Avito β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ gRPC-API ΠΌΠ΅ΠΆΠ΄Ρƒ микросСрвисами
  • πŸ“± ΠœΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Π΅ прилоТСния? gRPC Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π΄Π°ΠΆΠ΅ Ρ‚Π°ΠΌ, Π³Π΄Π΅ Π½ΡƒΠΆΠ½Ρ‹ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚ΠΊΠ»ΠΈΠΊ ΠΈ Π½ΠΈΠ·ΠΊΠΎΠ΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°

βš™οΈ Как ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ сСрвСр ΠΈΠ· .proto-Ρ„Π°ΠΉΠ»Π°

Один ΠΈΠ· Π³Π»Π°Π²Π½Ρ‹Ρ… плюсов gRPC β€” это гСнСрация ΠΊΠΎΠ΄Π°. Π’Ρ‹ Π½Π΅ пишСшь Ρ€ΡƒΠΊΠ°ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ β€” всё дСлаСтся автоматичСски ΠΈΠ· Ρ„Π°ΠΉΠ»Π° описания (.proto).

РазбСрёмся, ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Python.

πŸ›  Π¨Π°Π³ 1. Установи Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹:

Если Ρ‚Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΡˆΡŒ Python, всё просто:

-12

Π­Ρ‚ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ содСрТат:

  • ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ gRPC
  • компилятор protobuf (ΠΏΡ€ΠΎΡ‚ΠΎΡ„-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ)
  • Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊΠΎΠ΄Π°

🧱 Π¨Π°Π³ 2. Π‘ΠΎΠ·Π΄Π°ΠΉ proto-Ρ„Π°ΠΉΠ»

НапримСр, Ρ„Π°ΠΉΠ» greeter.proto:

-13

πŸ§ͺ Π¨Π°Π³ 3. Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠΉ ΠΊΠΎΠ΄

Запусти ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

-14

Π Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠ°:

  • -I. β€” ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ с .proto-Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ
  • --python_out=. β€” Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ protobuf-ΠΌΠΎΠ΄Π΅Π»ΠΈ
  • --grpc_python_out=. β€” Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ gRPC stub (ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ сСрвСр)

ПослС этого Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠ°ΠΏΠΊΠ΅ появятся Π΄Π²Π° Ρ„Π°ΠΉΠ»Π°:

  • greeter_pb2.py β€” структуры Π΄Π°Π½Π½Ρ‹Ρ… (HelloRequest, HelloReply)
  • greeter_pb2_grpc.py β€” классы для сСрвСра ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° (GreeterServicer, GreeterStub)

πŸ’» Π¨Π°Π³ 4. Π‘ΠΎΠ·Π΄Π°ΠΉ сСрвСр (ΠΏΡ€ΠΈΠΌΠ΅Ρ€)*

-15

πŸ“ž Π¨Π°Π³ 5. Π‘ΠΎΠ·Π΄Π°ΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°*

-16

🏁 Всё! πŸŽ‰ Π£ тСбя Π΅ΡΡ‚ΡŒ:

  • ΠŸΡ€ΠΎΡ‚ΠΎΡ„Π°ΠΉΠ» с ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠΌ
  • Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄
  • Π‘Π΅Ρ€Π²Π΅Ρ€ ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΆΠ΅ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ сообщСниями Ρ‡Π΅Ρ€Π΅Π· gRPC

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:

* ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ сСрвСр ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠΈΡˆΡƒΡ‚ΡΡ Π² Ρ€Π°Π·Π½Ρ‹Ρ… прилоТСниях, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ€ΠΎΠ»ΠΈ. gRPC β€” это, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, коммуникация ΠΌΠ΅ΠΆΠ΄Ρƒ двумя (ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅) ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ систСмами.

Но тСхничСски Ρ‚Ρ‹ моТСшь Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΈΡ… Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅, особСнно Π½Π° этапС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ»ΠΈ тСстирования.

❗ ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ минусы gRPC

1. ❌ НС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Β«ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈΒ» Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ…

gRPC Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎΠ²Π΅Ρ€Ρ… HTTP/2, Π° Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ HTTP/2 API ΠΈΠ· JavaScript (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, WebSocket ΠΈΠ»ΠΈ fetch Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Π½ΡƒΠΆΠ½Ρ‹Π΅ Β«Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹Β»).

πŸ”§ РСшСния:

  • ИспользованиС gRPC-Web β€” ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ прокси-ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ слоя (Envoy, grpc-web-proxy ΠΈ Ρ‚. Π΄.), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ gRPC-запросы Π² HTTP 1.1 ΠΈΠ»ΠΈ JSON ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ.
  • ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π°: REST API + gRPC для Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… сСрвисов.

β›” Π‘Π΅Π· прокси gRPC Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅!

2. πŸ”§ Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ инфраструктуры

gRPC Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ внСдрСния:

  • .proto Ρ„Π°ΠΉΠ»ΠΎΠ²
  • Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π°
  • настройки protoc
  • понимания ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Protobuf-Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°

Для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ² это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π·ΠΊΠΈΠΌ Β«ΠΏΠΎΡ€ΠΎΠ³ΠΎΠΌ Π²Ρ…ΠΎΠ΄Π°Β».

πŸ‘¨β€πŸ”§ Если Ρ‚Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‘ΡˆΡŒ простой CRUD-сСрвис, REST Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ‰Π΅ Π² обслуТивании.

3. 🧰 БлоТности ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅

Π‘ gRPC нСльзя просто Β«ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ curl-запрос» ΠΊΠ°ΠΊ с REST:

β›” НСльзя Β«Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ссылку Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Β» ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚.
βœ… НуТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ инструмСнты Π²Ρ€ΠΎΠ΄Π΅ grpcurl, Postman (Π½ΠΎΠ²Ρ‹Π΅ вСрсии), BloomRPC ΠΈΠ»ΠΈ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ.

Π’Π°ΠΊΠΆΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚Π° β€” Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Protobuf, Π° Π½Π΅ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΉ JSON.

4. πŸ“¦ ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹Π±ΠΎΡ€ middleware ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ

Π₯отя экосистСма Ρ€Π°Π·Π²ΠΈΡ‚Π°, всё ΠΆΠ΅:

  • Π‘ΠΎΠ»ΡŒΡˆΠ΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ ΠΈ middleware сущСствуСт для REST (Π»ΠΎΠ³Π³Π΅Ρ€Ρ‹, трСйсинг, кСши ΠΈ Ρ‚.β€ŠΠΏ.)
  • gRPC-интСрсСпторы ΠΈ ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ Π½ΡƒΠΆΠ½ΠΎ Ρ‡Π°Ρ‰Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ самому

5. 🌍 НС всС языки ΠΈ окруТСния ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ

Π₯отя gRPC ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Go, Java, Python, C++ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ языки, ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΈ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ. НапримСр:

  • Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях Python gRPC уступаСт Go ΠΈΠ»ΠΈ C++ ΠΏΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ;
  • На ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… приходится ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ gRPC Lite/gRPC-Web ΠΈΠ»ΠΈ сторонниС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.

6. πŸ§ͺ БлоТности с Ρ€ΡƒΡ‡Π½Ρ‹ΠΌ тСстированиСм

ВСстированиС gRPC Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚:

  • знания структуры .proto
  • наличия сгСнСрированных stubs
  • Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… инструмСнтов ΠΈΠ»ΠΈ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ²

πŸ‘¨β€πŸ’» REST ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Postman Β«Π² Π»ΠΎΠ±Β», Π±Π΅Π· ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ. Π‘ gRPC приходится Π·Π°ΠΌΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ.

7. πŸ—Ί НС всСгда ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ

Π’ REST ΠΌΡ‹ ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΠ»ΠΈ ΠΊ Swagger/OpenAPI ➜ АвтоматичСскоС описаниС API, UI, тСстированиС.

➑️ Π£ gRPC Π½Π΅Ρ‚ стандартного UI Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ для ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ (gRPC-Gateway + Swagger Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½, Π½ΠΎ это Β«ΠΊΠΎΡΡ‚Ρ‹Π»ΡŒΒ»).

πŸ”§ Π₯отя ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ (Buf, grpcdoc, grpcui), всё ΠΆΠ΅ докумСнтация API β€” Π½Π΅ такая интуитивная, ΠΊΠ°ΠΊ Π² REST.

8. πŸ“Ά ΠŸΠΎΠ²Ρ‹ΡˆΠ΅Π½Π½Ρ‹Π΅ трСбования ΠΊ сСтСвой инфраструктурС

  • gRPC ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ HTTP/2, поэтому Π½ΡƒΠΆΠ΅Π½ сСрвСр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ это ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚
  • НСкоторыС прокси-сСрвСры ΠΈΠ»ΠΈ балансировщики (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, старыС вСрсии nginx, ELB) ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с gRPC ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ
  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Π° большая «оптимизация» ΠΏΠΎΠ΄ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ сСти, Π½ΠΎ Π² слабых сСтях (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 2G/3G) ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‚Π΅Ρ€ΡΡ‚ΡŒ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ

πŸ’‘ Когда gRPC β€” Π½Π΅ Π»ΡƒΡ‡ΡˆΠΈΠΉ Π²Ρ‹Π±ΠΎΡ€?

  • Если пишСшь ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠ΅ API для ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² (особСнно β€” Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅)
  • Если Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊ/ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с Protobuf/gRPC
  • Если MVP ΠΈΠ»ΠΈ тСстовый сСрвис, Π³Π΄Π΅ ΠΏΡ€ΠΎΡ‰Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ JSON/HTTP 1.1
  • Если Π²Π°ΠΆΠ½Π° ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ REST-инструмСнтами

🟒 Когда всё-Ρ‚Π°ΠΊΠΈ стоит Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ gRPC

НСсмотря Π½Π° минусы, gRPC остаётся ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ, Ссли:

βœ… Π£ вас микросСрвисная Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°
βœ… НуТна высокая ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΉ ΠΎΠ±ΠΌΠ΅Π½ сообщСниями
βœ… Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ€Π°Π·Π½Ρ‹Π΅ языки (multi-language)
βœ… ΠšΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ β€” это backend сСрвисы, Π° Π½Π΅ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹

🏁 Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

gRPC β€” это Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ инструмСнт для построСния соврСмСнных быстрых API, особСнно Π² систСмах с микросСрвисной Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΎΠΉ. Он обСспСчиваСт Π²Ρ‹ΡΠΎΠΊΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, экономит Ρ‚Ρ€Π°Ρ„ΠΈΠΊ Π·Π° счёт Protobuf ΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Π΅ возмоТности β€” Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ стриминг ΠΈ автоматичСская гСнСрация ΠΊΠΎΠ΄Π°.

Однако стоит ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΎ Π΅Π³ΠΎ ограничСниях: Π±ΠΎΠ»Π΅Π΅ слоТная инфраструктура, нСпрямая ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°ΠΌΠΈ ΠΈ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½Π½Ρ‹Π΅ трСбования ΠΊ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅.

Если Ρ‚Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‘ΡˆΡŒ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ бэкСнд, Π³Π΄Π΅ Π²Π°ΠΆΠ½Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ, Π½Π°Π΄Ρ‘ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ β€” gRPC станСт ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΌ Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ. А для простых ΠΈΠ»ΠΈ клиСнтских API REST, ΠΊΠ°ΠΊ ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅, остаётся ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΈ понятным Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ.

Если Ρ‚Ρ‹ Π΅Ρ‰Ρ‘ Π½Π΅ ΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π» gRPC β€” ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉ.

β€” Если Π²Π°ΠΌ Π±Ρ‹Π»ΠΎ интСрСсно β€” ΡΡ‚Π°Π²ΡŒΡ‚Π΅ πŸ‘ ΠΈ Π΄Π΅Π»ΠΈΡ‚Π΅ΡΡŒ с Π΄Ρ€ΡƒΠ·ΡŒΡΠΌΠΈ!
β€” Если Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΈ вопросы β€” ΠΏΠΈΡˆΠΈΡ‚Π΅ Π² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ!

Π”ΠΎ встрСчи Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ πŸ‘‹

-17