BE

What is gRPC? gRPC Overview ์†Œ๊ฐœ

Taylor Kang 2021. 3. 7. 14:53

 

๐Ÿ™‹๐Ÿป‍โ™€๏ธ

์•ˆ๋…•ํ•˜์„ธ์š”! ํ…Œ์ผ๋Ÿฌ์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ gPRC ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

gRPC๋Š” ๋‹ค์–‘ํ•œ Language/Framework๋กœ ๊ตฌ์„ฑ๋œ ๋ถ„์‚ฐ application, service ๋“ค์„ ํšจ์œจ์ ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ๋œ ์˜คํ”ˆ์†Œ์Šค์ž…๋‹ˆ๋‹ค.

 

gRPC์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ธฐ ์ „์— RPC(Remote Procedure Call)์— ๋Œ€ํ•ด ๋จผ์ € ์•Œ์•„๋ณด๊ณ ,

gRPC์— ๋Œ€ํ•œ ์†Œ๊ฐœ, gRPC์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” protocol buffer ์†Œ๊ฐœ, ์ž‘๋™์›๋ฆฌ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์ด ๋ฌธ์„œ๋Š” gRPC ๊ณต์‹๋ฌธ์„œ ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

Background: RPC


 

๐Ÿ’๐Ÿป‍โ™€๏ธ
RPC(Remote Procedure Call): ์›๊ฒฉ ํ”„๋กœ์‹œ์ ธ ํ˜ธ์ถœ

์›๊ฒฉ ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ(์˜์–ด: remote procedure call, ๋ฆฌ๋ชจํŠธ ํ”„๋กœ์‹œ์ € ์ฝœ, RPC)์€ ๋ณ„๋„์˜ ์›๊ฒฉ ์ œ์–ด๋ฅผ ์œ„ํ•œ ์ฝ”๋”ฉ ์—†์ด ๋‹ค๋ฅธ ์ฃผ์†Œ ๊ณต๊ฐ„์—์„œ ํ•จ์ˆ˜๋‚˜ ํ”„๋กœ์‹œ์ €๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒํ•˜๋Š” ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹  ๊ธฐ์ˆ ์ด๋‹ค.

์œ„ํ‚คํ”ผ๋””์•„ https://ko.wikipedia.org/wiki/์›๊ฒฉ_ํ”„๋กœ์‹œ์ €_ํ˜ธ์ถœ

 

์š”์ฆ˜ ๋งŽ์€ ์„œ๋น„์Šค๋“ค์ด MSA ๊ตฌ์กฐ๋กœ ๊ฐœ๋ฐœ๋˜๋ฉด์„œ ๋‹ค์–‘ํ•œ ์–ธ์–ด, ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ํ™˜๊ฒฝ์—์„œ ํ”„๋กœํ† ์ฝœ์„ ๋งž์ถฐ์„œ ํ†ต์‹ ํ•ด์•ผํ•˜๋Š” ๋น„์šฉ์ด ๋ฐœ์ƒ๋˜์—ˆ๊ณ , ์ด ๋•Œ RPC๋ฅผ ์ด์šฉํ•ด ๊ฐœ๋ฐœํ™˜๊ฒฝ์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๊ณ  ๊ฐ ํ”„๋กœ์‹œ์ €๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

Introduction to gRPC


๐Ÿ’๐Ÿป‍โ™€๏ธ
gRPC

A high performance, open source, general-purpose RPC framework

 

์ด ํŽ˜์ด์ง€์—์„œ๋Š” gRPC์™€ protocol buffer์— ๋Œ€ํ•ด ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

gRPC๋Š” protocol buffer๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ , ์•„๋ž˜ ๋‘๊ฐ€์ง€ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • Interface Defintion Language(IDL)
  • Message Interchange Format

 

Overview

gRPC์—์„œ๋Š”, ํด๋ผ์ด์–ธํŠธ application์€ ๋‹ค๋ฅธ ๋จธ์‹ ์— ์œ„์น˜ํ•œ ์„œ๋ฒ„ application์„ ๋งˆ์น˜ local object์— ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ง์ ‘ ํ˜ธ์ถœํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด distributed application, service๋ฅผ ๋”์šฑ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋งŽ์€ RPC ์‹œ์Šคํ…œ๋“ค์ฒ˜๋Ÿผ, gRPC๋„

  • ์„œ๋น„์Šค๋ฅผ ์ •์˜ํ•˜๊ณ ,
  • parameters, return types๋กœ ์›๊ฒฉํ˜ธ์ถœ์ด ๋  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์ •

ํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

  • Server side Interface๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ถœ์„ ํ•ธ๋“ค๋งํ• ์ˆ˜ ์žˆ๋Š” gRPC Server๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • Client side ์„œ๋ฒ„์˜ ๋™์ผ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” gRPC Stub์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. *gRPC Stub: ํŠน์ • ์–ธ์–ด์—์„œ๋Š” ๋‹จ์ˆœํžˆ Client๋ผ๊ณ  ์ง€์นญ

 

 

gRPC ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋Š” ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์—์„œ ์ˆ˜ํ–‰๋˜๋ฉฐ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๊ณ , gRPC์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด gRPC ์„œ๋ฒ„๋Š” Java๋กœ ๋งŒ๋“ค๊ณ , client๋Š” Go, Python ํ˜น์€ Ruby๋กœ ๋งŒ๋“ค์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ์‹  Google API์—์„  ์ธํ„ฐํŽ˜์ด์Šค์— gRPC ๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ Google์˜ ๊ธฐ๋Šฅ๋“ค์„ ์‰ฝ๊ฒŒ ๋‹น์‹ ์˜ application์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

Working with Protocol Buffers


Protocol Buffer ์ด๋ž€?

๊ธฐ๋ณธ์ ์œผ๋กœ gRPC๋Š” Protocol Buffer๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’๐Ÿป‍โ™€๏ธ
Protocol Buffer

structured data(๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ)๋ฅผ serializing(์ง๋ ฌํ™”)ํ•˜๊ธฐ ์œ„ํ•ด Google์—์„œ ๊ฐœ๋ฐœํ•œ ์˜ค๋ž˜๋œ ์˜คํ”ˆ์†Œ์Šค ๋ฉ”์นด๋‹ˆ์ฆ˜์œผ๋กœ JSON๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํฌ๋งท๋“ค๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Protocol Buffer ์ž‘๋™ ์›๋ฆฌ

proto ํŒŒ์ผ์„ ์ž‘์„ฑํ•จ์œผ๋กœ์จ protocol buffer message๋ฅผ ๊ตฌ์ฒดํ™”ํ•˜๊ณ  ์ด๋ฅผ method parameter, return type์œผ๋กœ ๊ฐ€์ง€๋Š” gRPC ์„œ๋น„์Šค๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

1. proto file๋กœ ์‹œ๋ฆฌ์–ผ๋ผ์ด์ฆˆ ํ•˜๊ณ ์žํ•˜๋Š” ๋ฐ์ดํ„ฐ structure ์ •์˜

  • proto file: .proto ํ…์ŠคํŠธํŒŒ์ผ
  • Protocol Buffer data๋Š” message๋กœ ๊ตฌ์กฐํ™” ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ฉ”์‹œ์ง€๋Š” ์ž‘์€ ๋…ผ๋ฆฌ์  ์ •๋ณด ๋ ˆ์ฝ”๋“œ๋กœ field๋ผ๊ณ  ์ง€์นญ๋˜๋Š” name-value ์กฐํ•ฉ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.
    message Person {
      string name = 1;
      int32 id = 2;
      bool has_ponycopter = 3;
    }

     

2. protoc์„ ์‚ฌ์šฉํ•˜์—ฌ data access class๋ฅผ ์›ํ•˜๋Š” language๋กœ ์ƒ์„ฑ

  • protoc: protocol buffer compiler
    • ๊ฐ field ์ ‘๊ทผ์ž๋ฅผ ์ œ๊ณต. ex. name(), set_name()
      • ๊ฐ ๊ตฌ์กฐ์ฒด๋ฅผ raw bytes๋กœ serialize/parse ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ
    • ๋งŒ์•ฝ ๋‹น์‹ ์ด ์„ ํƒํ•œ ์–ธ์–ด๊ฐ€ C++์ด๋ผ๋ฉด, ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ตํ•ด ์œ„ Person์ด๋ผ๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ C++ class๋กœ ์ƒ์„ฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ ํด๋ž˜์Šค๋ฅผ ๋‹น์‹ ์˜ application์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

.proto Example

// gRPC ์„œ๋น„์Šค์ •์˜
// The greeter service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// protocol buffer message ์ •์˜
// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

 

gRPC์—์„œ๋Š” ํŠน๋ณ„ํ•œ gRPC ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ํ•จ๊ป˜ protoc์„ ์‚ฌ์šฉํ•˜์—ฌ proto file ๋กœ๋ถ€ํ„ฐ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด gRPC client, server ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

protocol buffer์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…๊ณผ, ๋‹น์‹ ์ด ์„ ํƒํ•œ ์–ธ์–ด๋ฅผ ์ง€์›ํ•˜๋Š” gRPC ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ํ•จ๊ป˜ protoc์„ค์น˜๋ฐฉ๋ฒ•์ด ๊ถ๊ธˆํ•˜๋‹ค๋ฉด protocol buffers documentaion์„ ์ฐธ์กฐํ•˜์„ธ์š”.

 

 

Protocol buffer versions


protocol buffer๋Š” ์˜คํ”ˆ์†Œ์Šค๋กœ ๊ณต๊ฐœ๋˜์–ด์žˆ์–ด ํ•ด๋‹น ์‚ฌ์ดํŠธ์˜ ๋Œ€๋ถ€๋ถ„์˜ ์˜ˆ์‹œ๋“ค์€ Proto3(protocol buffer version 3)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Proto3๋Š” ๊ฐ„๋‹จํ•œ ๋ฌธ๋ฒ•, ์—ฌ๋Ÿฌ ์œ ์šฉํ•œ ํ”ผ์ฒ˜๋“ค, ๊ทธ๋ฆฌ๊ณ  ๋” ๋‹ค์–‘ํ•œ ์–ธ์–ด๋“ค์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

 

์ง€์› ์–ธ์–ด๋ณ„ GitHub Repo

 

์–ธ์–ด๋ณ„ ์ž์„ธํ•œ ๊ฐ€์ด๋“œ

  • reference documentation : .proto ํŒŒ์ผ ํฌ๋งท ๋ช…์„ธ๋„ ์ด๊ณณ์—์„œ ํ™•์ธ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

Proto2(ํ˜„์žฌ์˜ ๊ธฐ๋ณธ protocol buffer version)๋„ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜์ง€๋งŒ gRPC์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ ์–ธ์–ด๋“ค์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Proto3๋ฅผ ์‚ฌ์šฉํ•œ๋Š”๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. proto2-proto3 ๊ฐ„ ํ˜ธํ™˜์„ฑ ์ด์Šˆ๋„ ํ”ผํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

Link


 

https://media.vlpt.us/images/jakeseo_me/post/cbee941a-abc3-40a0-bab3-69c03bb25cba/image.png