Skip to content

Latest commit

ย 

History

History
170 lines (94 loc) ยท 7.04 KB

gRPC.md

File metadata and controls

170 lines (94 loc) ยท 7.04 KB

gRPC๋ž€?

[TOC]

๋ฐฐ๊ฒฝ์ง€์‹

gRPC๋Š” Google์—์„œ ๊ฐœ๋ฐœํ•œ RPC(Remote Procedure) ์‹œ์Šคํ…œ์ด๋‹ค. ์ „์†ก์„ ์œ„ํ•ด TCP/IP ํ”„๋กœํ† ์ฝœ๊ณผ HTTP 2.0 ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๊ณ  IDL(Interface Definition Language)๋กœ protocol buffer๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

RPC(Remote Communication Mechanism)

RPC(์›๊ฒฉ ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ)๋Š” ํ•œ ํ”„๋กœ๊ทธ๋žจ์ด ๋„คํŠธ์›Œํฌ์˜ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ดํ•ดํ•˜์ง€ ์•Š๊ณ ๋„ ๋„คํŠธ์›Œํฌ ์•ˆ์˜ ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ์— ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์—์„œ ์„œ๋น„์Šค๋ฅผ ์š”์ฒญํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‹ค. RPC๋Š” client-server ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋น„์Šค๋ฅผ ์š”์ฒญ(function call)ํ•˜๋ฉด ์„œ๋ฒ„์—์„œ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

RPC ๊ฐœ๋…

img

HTTP ํ”„๋กœํ† ์ฝœ

HTTP(Hypertext Transfer Protocol)๋Š” ์›น์–ด์„œ ์“ฐ์ด๋Š” ํ†ต์‹  ํ”„๋กœํ† ์ฝœ์ด๋‹ค. ํ”„๋กœํ† ์ฝœ์ด๋ž€ ์ƒํ˜ธ๊ฐ„์— ์ •์˜ํ•œ ๊ทœ์น™์„ ์˜๋ฏธํ•œ๋‹ค.

HTTP ํ”„๋กœํ† ์ฝœ์€ TCP/IP ํ”„๋กœํ† ์ฝœ ์œ„์˜ ๋ ˆ์ด์–ด(Application layer)์—์„œ ๋™์ž‘ํ•œ๋‹ค.

img

HTTP ํ”„๋กœํ† ์ฝœ์€ stateless ํ”„๋กœํ† ์ฝœ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ์ƒํƒœ๊ฐ€ ์—†๋‹ค๋Š” ์˜๋ฏธ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ์œ„ํ•œ ๊ฐ๊ฐ์˜ ๋ฐ์ดํ„ฐ ์š”์ฒญ์ด ์„œ๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌ๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

HTTP๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์„œ๋ฒ„-ํด๋ผ์ด์–ธํŠธ ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ด ๊ตฌ์กฐ์—์„œ HTTP ํ”„๋กœํ† ์ฝœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” Request๋ฅผ ๋ณด๋‚ด๊ณ , Response๋ฅผ ๋ฐ›์•„์•ผํ•œ๋‹ค.

img

HTTP 1.1

๋‹จ์ 

  • HOLB(Head Of Line Blocking) ํŠน์ • ์‘๋‹ต ์ง€์—ฐ
  • RTT(Round Trip Time)์ฆ๊ฐ€
  • heavy header

HTTP 2.0

HTTP1.1์˜ ํ”„๋กœํ† ์ฝœ์„ ๊ณ„์Šนํ•ด ๋™์ผํ•œ API๋ฉด์„œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ์ดˆ์ ์„ ๋งž์ท„๋‹ค.

IDL(Interface Definition Language)

XML

XML์€ ์–ด๋– ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฆ„์„ ์ž„์˜๋กœ ์ง€์€ ํƒœ๊ทธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์‹ธ๋ฉฐ, ํƒœ๊ทธ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ํƒœ๊ทธ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

HTTP + XML ์กฐํ•ฉ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.

JSON

XML์ด ๊ฐ€์ง„ ์ฝ๊ธฐ ๋ถˆํŽธํ•˜๊ณ , ๋ณต์žกํ•˜๊ณ , ๋Š๋ฆฐ ์†๋„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค. ํŠนํžˆ key-value๋กœ ์ •์˜๋œ ๊ตฌ์กฐ ์ž์ฒด๊ฐ€ ๊ต‰์žฅํžˆ ์‚ฌ๋žŒ์—๊ฒŒ ์ง๊ด€์ ์ž„.

HTTP + RESTful API + JSON ์กฐํ•ฉ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉ๋จ.

Protocol buffers(proto)

XML์˜ ๋ฌธ์ œ์ ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ œ์•ˆ๋œ IDL์ด๋ฉฐ, XML๋ณด๋‹ค ์›”๋“ฑํ•œ ์„ฑ๋Šฅ์„ ์ง€๋‹Œ๋‹ค.

Protocol buffers๋Š” ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง๋ ฌํ™”(serialization)ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ๋กœ XML๋ณด๋‹ค ์ž‘๊ณ , ๋น ๋ฅด๊ณ , ๊ฐ„๋‹จํ•˜๋‹ค. XML ์Šคํ‚ค๋งˆ์ฒ˜๋Ÿผ .proto ํŒŒ์ผ์— protocol buffer ๋ฉ”์„ธ์ง€ ํƒ€์ž…์„ ์ •์˜ํ•œ๋‹ค.

Protocol buffers๋Š” ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง๋ ฌํ™”ํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ XML๋ณด๋‹ค ๋งŽ์€ ์žฅ์ ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์žฅ์ 

  • ๊ฐ„๋‹จํ•˜๋‹ค
  • ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ 3~10๋ฐฐ ์ •๋„ ์ž‘๋‹ค
  • ์†๋„๊ฐ€ 20~100๋ฐฐ ์ •๋„ ๋น ๋ฅด๋‹ค
  • XML๋ณด๋‹ค ๊ฐ€๋…์„ฑ์ด ์ข‹๊ณ  ๋ช…์‹œ์ ์ด๋‹ค.

gRPC๋ž€

gRPC๋Š” ๊ตฌ๊ธ€์—์„œ ๋งŒ๋“  RPC ํ”Œ๋žซํผ์ด๋ฉฐ protocol buffer์™€ RPC๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ตœ์‹  ๋ฒ„์ „์˜ IDL๋กœ proto3๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. Java, C++, Python, Java Lite, Ruby, JavaScript, Objective-C ๋ฐ C#์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

SSL/TLS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„๋ฅผ ์ธ์ฆํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ„์— ๊ตํ™˜๋˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•œ๋‹ค. HTTP 2.0์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ API๋ฅผ ์ง€์›ํ•œ๋‹ค.

gRPC์—์„œ ํด๋ผ์ด์–ธํŠธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์„œ๋ฒ„์—์„œ ํ•จ์ˆ˜๋ฅผ ๋ฐ”๋กœ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ์–ด ๋ถ„์‚ฐ MSA๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์„œ๋ฒ„ ์ธก์—์„œ๋Š” ์„œ๋ฒ„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  gRPC ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ถœ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

img

Protocol Buffers(proto3)

Protocol buffer๋Š” ๊ตฌ์กฐํ™” ๋ฐ์ดํ„ฐ(structured data)๋ฅผ ์ง๋ ฌํ™”(seriailize)ํ•˜๊ธฐ์œ„ํ•œ Google์˜ ์–ธ์–ด ์ค‘๋ฆฝ์ , ํ”Œ๋žซํผ ์ค‘๋ฆฝ์ ์ด๋ฉฐ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค.

XML๋ณด๋‹ค ์ž‘์ง€๋งŒ, XML๋ณด๋‹ค ๋น ๋ฅด๊ณ  ๋‹จ์ˆœํ•˜๋‹ค.

IDL(Interface Definition Language)๋กœ์„œ data structure๋ฅผ ์ •์˜ํ•œ ๋‹ค์Œ, .proto ํŒŒ์ผ์„ protocol buffer compiler(protoc)๋ฅผ ์ด์šฉํ•ด compile ํ•ฉ๋‹ˆ๋‹ค. Complie๋œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ์ŠคํŠธ๋ฆผ์—์„œ ๋‹ค์–‘ํ•œ ์–ธ์–ด๋กœ ๋‹ค์–‘ํ•œ ๊ตฌ์กฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ๋Š” ํ˜„์žฌ Java, Python Objective-C ๋ฐ C++์—์„œ ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์ง€์›ํ•œ๋‹ค. ์ƒˆ๋กœ์šด proto3๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋ฉด proto2์— ๋น„ํ•ด ๋” ๋งŽ์€ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Proto3 Guide

Protocol buffers๋Š” ํฌ๊ฒŒ proto2์™€ proto3๊ฐ€ ์žˆ์ง€๋งŒ gRPC์—์„  ์ตœ์‹  ๋ฒ„์ „์ธ proto3๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

Defining ๋ฉ”์„ธ์ง€ type

syntax = "proto3"; //syntax๊ฐ€ ์—†์œผ๋ฉด ์ž๋™์œผ๋กœ proto2๋กœ ์ธ์‹๋จ

message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
}

SearchRequest ๋ฉ”์‹œ์ง€ ์ •์˜๋Š” ์ด ์œ ํ˜•์˜ ๋ฉ”์‹œ์ง€์— ํฌํ•จํ•˜๋ ค๋Š” ๊ฐ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ํ•˜๋‚˜์”ฉ ์„ธ ๊ฐœ์˜ ํ•„๋“œ(ํ‚ค, ๊ฐ’)๋ฅผ ์ง€์ •ํ•œ๋‹ค. ๊ฐ ํ•„๋“œ์—๋Š” ํ‚ค์™€ ๊ฐ’์ด ์žˆ๋‹ค.

Specifying Field Types(ํ•„๋“œ ์œ ํ˜• ์ง€์ •)

์œ„์˜ ์˜ˆ์‹œ์—์„œ ๋‚˜์˜จ Field types๋Š” ๋ชจ๋‘ scalar types์ด๋‹ค. (int32, string)

ํ•˜์ง€๋งŒ scalar type ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ enum๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ field type๋„ ์„ ์–ธ ๊ฐ€๋Šฅํ•˜๋‹ค.

Assigning Field Numbers(ํ•„๋“œ ๋ฒˆํ˜ธ ํ• ๋‹น)

๊ฐ field๋Š” unique number๋ฅผ ๊ฐ–๋Š”๋‹ค.

์ด field number๋Š” ๋ฉ”์„ธ์ง€ binary format์—์„œ field๋ฅผ ์‹๋ณ„ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์ฆ‰ field number๊ฐ€ key๊ฐ€ ๋˜๊ณ  field type์ด value๊ฐ€ ๋˜๋Š” ํ•ด์‹œ ๊ตฌ์กฐ๋ฅผ ์ง€๋‹Œ๋‹ค.

Field numbers์˜ ๊ฐ’์ด 1~15 ์‚ฌ์ด๋ฉด 1 byte๋กœ encoding๋œ๋‹ค.

Field numbers์˜ ๊ฐ’์ด 16~2047์ด๋ฉด 2 bytes๋กœ encoding๋œ๋‹ค.

๊ทธ๋ ‡๊ธฐ์— Field numbers์˜ ๊ฐ’์„ 1~15 ์‚ฌ์ด๋กœ encoding ํ•˜๋Š”๊ฒƒ์ด ํšจ์œจ์ ์ด๋‹ค.

Specifying Field Rules(ํ•„๋“œ ๊ทœ์น™ ์ง€์ •)

๋ฉ”์„ธ์ง€ fields๋Š” ๋‹ค์Œ ์ค‘ ํ•œ ๊ฐ€์ง€๋ฅผ ๋”ฐ๋ฅธ๋‹ค.

  1. singular: well-formed๋œ ๋ฉ”์„ธ์ง€๋Š” ํ•˜๋‚˜ ์ดํ•˜์˜ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
  2. repeated: ์ด field๋Š” ์—ฌ๋Ÿฌ๋ฒˆ ๋ฐ˜๋ณต๋  ์ˆ˜ ์žˆ๋‹ค.

Adding Message Type

ํ•˜๋‚˜์˜ .proto ํŒŒ์ผ ์•ˆ์— ๋‹ค์ค‘ ๋ฉ”์„ธ์ง€ type์ด ์ •์˜๋  ์ˆ˜ ์žˆ๋‹ค.

message SearchRequest {
	string query = 1;
	int32 page_number = 2;
	int32 result_per_page = 3;
}

message SearchResponse {
	...
}

.proto๊ฐ€ ์ปดํŒŒ์ผ๋ผ์„œ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ

.proto ํŒŒ์ผ์„ protocol buffer compiler์— ์˜ํ•ด compiled๋˜๋ฉด, ๋ฉ”์„ธ์ง€๋Š” serializing๋˜์–ด output stream์œผ๋กœ ๋‚˜๊ฐ€๊ณ  parsing๋˜์–ด input stream์œผ๋กœ ๋“ค์–ด์˜จ๋‹ค.

C ++

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํŒŒ์ผ์— ์„ค๋ช… ๋œ ๊ฐ ๋ฉ”์„ธ์ง€ type์— ๋Œ€ํ•œ class์™€ ํ•จ๊ป˜ ๊ฐ .proto์—์„œ .h ๋ฐ .ccํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค.

Java

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฐ ๋ฉ”์„ธ์ง€ type์— ๋Œ€ํ•œ class์™€ ๋ฉ”์„ธ์ง€ class instance ์ž‘์„ฑ์„ ์œ„ํ•œ builder class๊ฐ€ ์žˆ๋Š” .java ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค.

Python

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฐ ๋ฉ”์„ธ์ง€ type์˜ static discriptor๊ฐ€ ์žˆ๋Š” ๋ชจ๋“ˆ์„ ์ƒ์„ฑํ•œ ๋‹ค์Œ, meta class์™€ ํ•จ๊ป˜ ๋Ÿฐํƒ€์ž„์— ํ•„์š”ํ•œ Python data access class๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.