RPC
(Remote Procedure Call, μ격 νλ‘μμ νΈμΆ)λ ν νλ‘κ·Έλ¨μ΄ λ€νΈμν¬μ μΈλΆ μ 보λ₯Ό μ΄ν΄νμ§ μκ³ λ λ€νΈμν¬ μμ λ€λ₯Έ μ»΄ν¨ν°μ μλ νλ‘κ·Έλ¨μμ μλΉμ€λ₯Ό μμ²νλ νλ‘ν μ½RPC
λ Client-Server λͺ¨λΈ
μ μ¬μ©IDL
λ±μ μΈμ΄λ‘ μ μν ν, ν΄λΉ νλ‘κ·Έλλ° μΈμ΄κ° λΆλ₯Ό μ μλ ννμ μ½λλ‘ μμ±μ ν΄μ€μΌ νλλ° μ΄λ₯Ό Stubκ³Ό Skeleton μ½λ
λΌκ³ ν¨HTTP
κΈ°λ°μ REST
κ° μ ννλ©΄μ RPC
λ λ§μ΄ μ¬λΌμ‘λλ°, λ°λλ‘ REST
μ κ²½μ° νΈμΆ νλ 맀κ°λ³μμ μλ΅ κ°μ΄ λͺ
μμ μ΄μ§ μκΈ° λλ¬Έμ μ€λ₯μ μ¬μ§κ° λ§κ³ JSON
μ HTTP
λ₯Ό ν΅ν΄μ μκΈ° λλ¬Έμ λ€μ μλκ° λ¨μ΄μ§λ€λ λ¨μ μ κ°μ§κ³ μμRPC
κ°λ
μ΄ λ€μ μ ννκΈ° μμνλλ°, νμ΄μ€λΆμ κ²½μ°μλ Thrift
λΌλ λ°μ΄λ리 κΈ°λ°μ RPC
νλ μμμ λ°νRPC
μ체λ μ§μνμ§ μκ³ , λ©μΈμ§(JSON
λ±)μ μ§λ ¬ν ν μ μλ νλ μμμΌλ‘ Protocol Buffers
λ₯Ό μ 곡ν΄μμgRPC
λΌλ κ°λ
μΌλ‘ Protocol Buffers
λ₯Ό κΈ°λ³ΈμΌλ‘ HTTP/2
λ₯Ό λΆμ¬μ RPC
νλ μμμ 릴리μ¦HTTP
(Hypertext Transfer Protocol)λ μΉμμ μ°μ΄λ ν΅μ νλ‘ν μ½HTTP
νλ‘ν μ½μ TCP/IP
νλ‘ν μ½ μμ Application layer
μμ λμHTTP
νλ‘ν μ½μ Stateless
νλ‘ν μ½HTTP
λ κΈ°λ³Έμ μΌλ‘ Server-Client
ꡬ쑰λ₯Ό λ°λ¦HTTP
νλ‘ν μ½λ‘ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°κΈ° μν΄μλ μλμ κ°μ΄ μμ²μ 보λ΄κ³ μλ΅μ λ°μμΌ ν¨Tip! HTTP λ²μ λ³ μ°¨μ΄
IDL
(Interface Definition Language, μΈν°νμ΄μ€ μ μ μΈμ΄)μ μ 보λ₯Ό μ μ₯νλ κ·μΉIDL
λ‘λ XML
, JSON
, Protocol Buffers
3κ°μ§κ° μ‘΄μ¬XML
(eXtensible Markup Langauge)μ μ΄λ ν λ°μ΄ν°λ₯Ό μ€λͺ
νκΈ° μν΄ μ΄λ¦μ μμλ‘ μ§μ νκ·Έλ‘ λ°μ΄ν°λ₯Ό κ°μΈλ©°, νκ·Έλ‘ μ¬μ©μκ° μ§μ λ°μ΄ν° ꡬ쑰λ₯Ό μ μ ν μ μμXML
μ HTML
μ²λΌ λ°μ΄ν°λ₯Ό 보μ¬μ£Όλ κ²μ΄ λͺ©μ μ΄ μλ λ°μ΄ν°λ₯Ό μ μ₯νκ³ μ λ¬ν λͺ©μ μΌλ‘ λ§λ€μ΄μ‘μHTTP
+ XML
μ‘°ν©μΌλ‘ λ§μ΄ μ¬μ©λ¨JSON
(JavaScript Object Notation)μ Javascript
μ λΆμμΌλ‘ λ§μ΄ μ°μ΄κ³ μλ λ°μ΄ν° ꡬ쑰XML
μ΄ κ°μ§ μ½κΈ° λΆνΈνκ³ λ³΅μ‘νκ³ λλ¦° μλ λ¬Έμ λ₯Ό ν΄κ²°νμΌλ©° νΉνλ Key-Value
λ‘ μ μλ ꡬ쑰 μμ²΄κ° κ΅μ₯ν μ§κ΄μ HTTP
+ RESTful API
+ JSON
μ‘°ν©μΌλ‘ λ§μ΄ μ¬μ©λ¨XML
μ λ¬Έμ μ μ κ°μ νκΈ° μν΄ μ μλ IDL
μ΄λ©°, XML
λ³΄λ€ μλ±ν μ±λ₯μ μ§λProtocol Buffers
λ ꡬ쑰ν(Structured)λ λ°μ΄ν°λ₯Ό μ§λ ¬ν(Serialization)νκΈ° μν νλ‘ν μ½λ‘ XML
λ³΄λ€ μκ³ λΉ λ₯΄κ³ κ°λ¨.proto
νμΌμ Protocol Buffers
λ©μΈμ§ νμ
μ μ μProtocol Buffers
λ ꡬ쑰νλ λ°μ΄ν°λ₯Ό μ§λ ¬ννλλ° μμ΄μ XML
λ³΄λ€ λ§μ μ₯μ λ€μ κ°μ§κ³ μμXML
λ³΄λ€ κ°λ
μ±μ΄ μ’κ³ λͺ
μμ IDL
λ‘μ λ°μ΄ν° ꡬ쑰λ₯Ό μ μν λ€μ, .proto
νμΌμ Protocol Buffer Compiler
(Protoc
)λ₯Ό μ΄μ©ν΄ μ»΄νμΌν¨Protocol Buffers
λ νμ¬ Java
, Python
, Objective-C
λ° C++
μμ μμ±λ μ½λλ₯Ό μ§μproto3
λ²μ μ μ¬μ©νλ©΄ proto2
μ λΉν΄ λ λ§μ μΈμ΄(Dart
, Go
, Ruby
λ° C#
)μ μ¬μ©ν μ μμTip! Protocol Buffers
- μλ²μμλ ν¨μμ μ΄λ¦, νλΌλ―Έν° κ·Έλ¦¬κ³ λ¦¬ν΄κ°μ μ μ
- ν΄λΌμ΄μΈνΈμμ ν¨μλ₯Ό νΈμΆνκΈ° μν΄μ μ λ ₯κ³Ό ν¨μμ μ΄λ¦μ ν΅ν΄μ ν¨μλ₯Ό νΈμΆ
- μ΄λ° κ³Όμ μ΄ κ°λ₯νκΈ° μν΄μλ λ¨Όμ μλ²μ ν΄λΌμ΄μΈνΈ λͺ¨λ 곡ν΅λ μΈν°νμ΄μ€λ₯Ό κ°μ ΈμΌνλλ° μ΄λ₯Ό κ°λ₯νκ² ν΄μ£Όλ κ²μ΄
IDL
(Interface Definition Language)gRPC
λIDL
λ‘Protocol Buffers
λ₯Ό μ΄μ©νκ³ μμ# Protocol Bufferμ κΈ°λ³Έ νμ syntax = "proto3"; service HelloService { rpc SayHello (HelloRequest) returns (HelloResponse); } message HelloRequest { string greeting = 1; } message HelloResponse { string reply = 1; }
HelloService
λΌλ μλΉμ€μSayHello
ν¨μκ° μμ
- κ·Έλ¦¬κ³ κ·Έ μμ²μ΄
HelloRequest
μ΄λ©° μλ΅μΌλ‘HelloResponse
μ νμμ κ°μ§κ² λλ€λ μλ―Έ
gRPC
(google Remote Procedure Calls)λ ꡬκΈμ΄ μ΅μ΄λ‘ κ°λ°ν μ€ν μμ€ RPC μμ€ν
RPC
(Remote Communication Mechanism, μ격 νλ‘μμ νΈμΆ)μ ν μ’
λ₯λ‘, RPC
λ REST APIμ λ€λ₯Έ λλμ κ°μ§RPC
λ μλ²μ μλ νΉμ ν¨μλ₯Ό νΈμΆνλ€λΌκ³ μκ°νλ©΄ λ¨TCP/IP
νλ‘ν μ½κ³Ό HTTP/2
νλ‘ν μ½μ μ¬μ©νκ³ IDL
(Interface Definition Language, μΈν°νμ΄μ€ μ μ μΈμ΄)λ‘ Protocol Buffers
λ₯Ό μ¬μ©gRPC
λ HTTP/2
μ κΈ°λ°μΌλ‘ Protocol Buffers
λ‘ μ μνλ©° ν΅μ μ λ°μ΄νΈ μ€νΈλ¦ΌμΌλ‘ ν΅μ JSON
κΈ°λ°μΌλ‘ ν΅μ νλ Rest API λ³΄λ€ λ κ°λ²ΌμgRPC
λ HTTP/2
κΈ°λ°μ΄κΈ° λλ¬Έμ νλμ μ±λ 컀λ₯μ
μ λ§Ίκ³ κ·Έ 컀λ₯μ
μ ν΅ν΄μ λμμ λ©μμ§λ₯Ό 보λ΄κ³ μ²λ¦¬ν μ μμgRPC
μμ ν΄λΌμ΄μΈνΈ μμ© νλ‘κ·Έλ¨μ μλ²μμ ν¨μλ₯Ό λ°λ‘ νΈμΆ ν μ μμ΄ λΆμ° MSA
(Micro Service Architecture, λ§μ΄ν¬λ‘ μλΉμ€ μν€ν
μ³)λ₯Ό μ½κ² ꡬνν μ μμgRPC
μλ²λ₯Ό μ€ννμ¬ ν΄λΌμ΄μΈνΈ νΈμΆμ μ²λ¦¬gRPC
λ νΉμ§μΌλ‘ λ€μν κ°λ° νκ²½μμ RPC
κ° κ°λ₯νλλ‘ μ§μν΄μ£Όκ³ μμTip! μΆκ° λ΄μ©
gRPC
(google Remote Procedure Call)λ ꡬκΈμμ λ§λ μ격 νλ‘μμ νΈμΆ νλ μμν¬
- κΎΈμ€ν μ λ°μ΄νΈ λκ³ μλ μ€ν μμ€λ‘ μ±λ₯μ΄ λ§€μ° μ’κ³ μ΄λ ν νκ²½μμλ μ€νμν¬ μ μλ€λ μ₯μ μ κ°μ§κ³ μμ΄ μ΄λ―Έ λͺ λ μ λΆν° κ°κ΄λ°λ κΈ°μ
- λ‘λ λ°Έλ°μ±, μΆμ (trace), μν νμΈ λ° μΈμ¦μ μν νλ¬κ·Έν μ§μμ ν΅ν΄ μλΉμ€λ₯Ό ν¨μ¨μ μΌλ‘ μ°κ²°ν μ μμ
- λν λλ°μ΄μ€, λͺ¨λ°μΌ μ ν리μΌμ΄μ λ° λΈλΌμ°μ λ₯Ό λ°±μλ μλΉμ€μ μ°κ²°νκΈ° μν λΆμ° μ»΄ν¨ν μ λ§μ§λ§ λ¨κ³μλ μ μ©ν μ μμ
- κ°λ ₯ν λ°μ΄λ리 μ§λ ¬ν λꡬμ΄μ μΈμ΄μΈ νλ‘ν μ½ λ²νΌ(
Protocol Buffer
)λ₯Ό μ΄μ©νμ¬ μλΉμ€λ₯Ό μ μνκ³ , κ°κ²°νκ² λ°νμ λ° κ°λ° νκ²½μ μ€μΉνκ³ νλ μμν¬λ₯Ό μ¬μ©νμ¬ μ΄λΉ μλ°±λ§ κ°μRPC
λ‘ νμ₯ν μ μλ μ€μΌμΌλ§ κΈ°λ₯μ μ 곡- λ€μν μΈμ΄ λ° νλ«νΌμ λν΄ ν΄λΌμ΄μΈνΈ λ° μλ² μ€ν (
Stub
)μ μλ μμ±ν΄μ€ λΏλ§ μλλΌ μλ°©ν₯ μ€νΈλ¦¬λ° λ° μμ ν ν΅ν© μΈμ¦μHTTP/2
κΈ°λ° μ μ‘μ ν΅ν΄ μ 곡
Protocol Buffers
λΌλ λ°©μμ XML
κ³Ό κ°μ΄ ꡬ쑰νλ λ°μ΄ν°λ₯Ό μ§λ ¬ννλ λ°©μμΈλ° μμΆμ ν΄μ ν¨μ¬ λΉ λ₯΄κ³ , μ¬μ©λ²λ κ°λ¨νκ³ , λ°μ΄ν°μ ν¬κΈ°λ μμJSON
μ§λ ¬νλ³΄λ€ μ΅λ 8λ°° λ λΉ λ₯Ό μ μλ€κ³ ν¨IDL
)gRPC
λ‘ ν΅μ νκΈ° μν΄μλ Protocol Buffers
λ‘ μ΄λ»κ² λ°μ΄ν°λ₯Ό μ£Όκ³ λ°μ κ²μΈμ§ μ μν΄λμΌ ν¨gRPC
λ₯Ό μ¬μ©νλ κ²½μ°κ° λ€μ μμHTTP/2
gRPC
λ HTTP/2
λ₯Ό μ§μgRPC
λ HTTP/1.1
κ³Ό νΈνλμ§λ§ HTTP/2
λ§μ κ³ κΈ κΈ°λ₯λ€λ μ¬μ©ν μ μμHTTP 1.1
μ μΉμμ κ°μ₯ λ§μ΄ μ¬μ©νλ νλ‘ν μ½μ΄κ³ , JSON
μ λ§€μ° κ°λ¨νλ©΄μ ν¨μ¨μ μΈ IDL
μ΄μ§λ§ μΌλΆ λ¬Έμ μ μ‘΄μ¬JSON
IDL
μ ν¬κΈ°λ HTTP 1.1
μ HOLB λ¬Έμ λ±gRPC
μ Protocol Buffers
λ‘ λ¦¬μμ€ μ¬μ©λμ ν¬κ² μ€μ¬ JSON
μ μ¬μ©ν λλ³΄λ€ μλ΅μλλ₯Ό μ€μΌ μ μμ JSON
λ° XML
λ‘μ λ³νλ μ§μServer-Client
μ€νΈλ¦¬λ°HTTP/2
νΉμ§μΌλ‘ Multiduplex Bidirectional Streaming
κΈ°λ₯ μ 곡proto3
μμ C#
, C+
, Dart
, Go
, Java
, Kotline
, Node
, Object-C
, PHP
, Python
, Ruby
μ§μproto
νμΌμ κ°μ§κ³ μμ μ μμΌλ―λ‘ μ¬μ€μ μ¬μ© λΆκ°λ₯.proto
νμΌμ μ
λ°μ΄νΈ ν΄μ£Όμ΄μΌ ν¨proto
νμΌμ λ³νκ° μκΈΈ κ²½μ° ν΄λΌμ΄μΈνΈμ proto
νμΌλ μ
λ°μ΄νΈ νμgRPC
λ λ€μν μμ² & μλ΅ λͺ¨λΈμ μ 곡νκ³ μμgRPC
λ HTTP/2
λ₯Ό κΈ°λ°μΌλ‘ μ¬μ©νκ³ μμΌλ©° μ΄μ λ°λΌ νλμ 컀λ₯μ
μΌλ‘ μ¬λ¬ κ°μ λ°μ΄ν°λ₯Ό λ³΄λΌ μ μλ μ€νΈλ¦Όμ μ§μνκΈ° λλ¬Έuju's Tech - Node.jsμμ gRPC μ€μΉ
gRPC μμ
μμ ν λ§μ΄ν¬λ‘ μλΉμ€ μμ΅μ