
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/2gRPCλ 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 μμ
μμ ν λ§μ΄ν¬λ‘ μλΉμ€ μμ΅μ