A structure of gRPC applied microservices - yunkon-kim/test-on-github-actions GitHub Wiki
gRPC๋ ๊ตฌ๊ธ์ด ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ(Microservice Architecture (MSA))์์ ๋งค์ฐ ๊ฑฐ๋ํ ์๋น์ค๋ฅผ ์ด์ํ๋ฉด์ ๊ฒช๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ Stubby๋ผ๋ ๋ด๋ถ ํ๋ ์์ํฌ๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ค๊ฐ ์ด๋ฅผ ์คํ์์คํ ํ๋ฉด์ ํ์ํ์์ต๋๋ค. ๐
2,000,000,000 ? ๊ตฌ๊ธ์ด 1์ฃผ์ผ ๋์ ๋์ฐ๋ ์ปจํ ์ด๋์ ์
10,000,000,000 ? ๊ตฌ๊ธ์ด 1์ด ๋์ ๋์ง๋ ์๊ฒฉ ํธ์ถ์ ์
- ์ค๋ช ์ด, gใ ๋ฒผ์ด RPC, gRPC(๋น ๋ฅด๊ณ ๊ฐ๋ฒผ์ด Polyglot RPC framework), ์คํ๋ง์บ ํ 2017 [Day1 B5]
gRPC ๊ด๋ จ ๋ง์ ๊ธ์์ "๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ์ํ ํ๋ ์์ํฌ๋ค", "๋ง์ดํฌ๋ก์๋น์ค ์คํ์ผ ์ํคํ ์ฒ์ ์ ์ฉํ๊ธฐ ์ข๋ค", "๋ง์ดํฌ๋ก์๋น์ค์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ค" ๋ผ๋ ๋ด์ฉ์ ์ฌ์ฌ์น์๊ฒ ์ ํ ์ ์์์ต๋๋ค.
ํ์ง๋ง, "gRPC๋ฅผ ๊ฐ์ง๊ณ ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ๊ตฌํํ๋ฉด ์ด๋ค ํ์์ด ๋๋๊ฐ?"์ ๋ํ ๊ถ๊ธ์ฆ์ ์์ํ๊ฒ ํด๊ฒฐํด์ฃผ๋ ๊ธ์ ์ ํ์ง ๋ชปํ์์ต๋๋ค. ๐ข
๊ทธ๋์, ์คํฐ๋๋ฅผ ํตํด "gRPC๋ฅผ ์ ์ฉํ ๋ง์ดํฌ๋ก์๋น์ค์ ๊ตฌ์กฐ"์ ๋ํด ์ดํดํ ๋ฐ๋ฅผ ์ค๋ช ํ๊ณ ์ ํฉ๋๋ค.
๋ค์ํ ํฌ์คํธ์ gRPC ๊ด๋ จ ์์ ์์ ๋ด์ฉ, ๊ตฌ์กฐ, ์์ค์ฝ๋๋ฅผ ์คํฐ๋ ํ๋ฉด์ ๋ง์ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค. ํฌ์คํธ ์ ์ ๋ฐ ์ฑ ์ ์ ๋ฐ ์ฎ๊ธด์ด์๊ฒ ๊ฐ์ฌ์ ๋ง์์ ์ ํฉ๋๋ค.
- ์์: gRPC: Up and Running by Kasun Indrasiri and Danesh Kuruppu (O'Reilly). Copyright 2020 Kasun Indrasiri and Danesh Kuruppu, 978-1-492-05833-5
- ๋ฒ์ญ์: gRPC ์์์์ ์ด์๊น์ง(์ง์์ด: ์นด์ ์ธ๋๋ผ์๋ฆฌ, ๋ค๋ค์ฌ ์ฟ ๋ฃจํธ, ์ฎ๊ธด์ด: ํ์ฑ๊ณค), ์์ด์ฝ์ถํ์ฃผ์ํ์ฌ, 2021๋ 1์ 4์ผ ๋ฐํ, 979-11-6175-463-5
- ์ฐธ๊ณ ํฌ์คํธ: ์ ์ผ ํ๋จ๋ถ์ ์ ๋ฆฌํ์์ต๋๋ค.
ํ์ง๋ง, ์ค์ ํ๊ฒฝ์ ์ ์ฉ ๋ฐ ํ ์คํธ ํ๊ฒ์ด ์๋ ์คํฐ๋์ ๊ฒฐ๊ณผ๋ฌผ ์ ๋์ด๋ ์ฐธ๊ณ ๋ฐ๋ผ๋ฉฐ, ์ ์ ํ ๋ถ๋ถ์ด ์์ผ๋ฉด ๋ง์ํด์ฃผ์ธ์. ์ดํ ์ค์ ํ๊ฒฝ์ ์ ์ฉํ๋ฉด ํ๊ฒฝ์ ๋ณด, ์์ค์ฝ๋์ ํจ๊ป ๊ตฌ์กฐ๋ฅผ ์ ๋ฐ์ดํธ ํ๊ฒ ์ต๋๋ค. ๐
์ฌ์ค "๊ฐ์๋ฅผ ์ ๋ฆฌํด์ผํ๋?"๋ผ๋ ๊ณ ๋ฏผ์ ํ๋๋ฐ์. ๋ค๋ฅธ๋ถ๋ค๊ป์ gRPC ๊ฐ์๋ฅผ ์์ฒญ ์ ์์ฑํด๋์ผ์ จ๊ธฐ ๋๋ฌธ์ ์๋ตํ๊ฒ ์ต๋๋ค. ์๋ ์ฐธ๊ณ ์๋ฃ ์ค์์ ์ ๋ง์ ๋ง๋ ๊ธ์ ๋ณด์๊ธฐ ๋ฐ๋๋๋ค.
"gRPC ์์์์ ์ด์๊น์ง" ์์ ์ "ํ๋ก์ธ์ค๊ฐ ํต์ ์ ์ญ์ฌ" ๋ถ๋ถ์์ "gRPC์ ์ฅ๋จ์ "์ ์กฐ๋ชฉ์กฐ๋ชฉ ์ ์ ๋ฆฌํด ๋์๊ธฐ์ ์ด๋ฅผ ๊ฐ๋จํ ๋ณด์ด๊ณ ์ ํฉ๋๋ค.
- ํ๋ก์ธ์ค ๊ฐ ํต์ ํจ์จ์ฑ: gRPC๋ JSON์ด๋ XML๊ฐ์ ์ฌ๋์ด ์ฝ์ ์ ์๋(Humand-readable) ํ ์คํธ ๋์ ํ๋กํ ์ฝ ๋ฒํผ(Protocol buffer) ๊ธฐ๋ฐ ๋ฐ์ด๋๋ฆฌ ํ๋กํ ์ฝ์ ์ฌ์ฉํด gRPC ์๋น์ค ๋ฐ ํด๋ผ์ด์ธํธ์ ํต์ ํจ, HTTP/2 ์์ ๊ตฌํ๋จ
- ๊ฐ๋จ ๋ช ํํ ์๋น์ค ์ธํฐํ์ด์ค์ ์คํค๋ง: gRPC๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ฉ ๊ณ์ฝ ์ฐ์ (Contract-first) ์ ๊ทผ ๋ฐฉ์์ ๊ถ์ฅํ์ฌ ์๋น์ค ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ ํ ๊ตฌํ ์ธ๋ถ์ฌํญ์ ์์ ํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋จํ๊ณ ์ผ๊ด๋๋ฉด์๋ ์์ ์ ์ธ ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ๊ฒฝํ ์ ๊ณต
- ์๊ฒฉํ ํ์ ์ ๊ฒ ํ์: gRPC ์๋น์ค ์ ์ ์ ํ๋กํ ์ฝ ๋ฒํผ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ ํต์ ์ ์ฌ์ฉํ ๋ฐ์ดํฐ ํ์ ์ด ๋ช ํํ๊ฒ ์ ์๋จ, ๋ฐํ์๊ณผ ์ํธ์ด์ฉ ์๋ฌ๋ฅผ ๊ทน๋ณตํ๋๋ฐ ๋์์ด ๋จ
- ํด๋ฆฌ๊ธ๋: ํ๋กํ ์ฝ ๋ฒํผ ๊ธฐ๋ฐ์ gRPC ์๋น์ค๋ ํน์ ์ธ์ด์ ๊ตฌ์ ๋ฐ์ง ์์
- ์ด์ค ์คํธ๋ฆฌ๋ฐ: gRPC๋ ํด๋ผ๋ฆฌ์ธํธ๋ ์๋ฒ ์ธก ์คํธ๋ฆฌ๋ฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํ๋ฏ๋ก ์คํธ๋ฆฌ๋ฐ ์๋น์ค๋ ์คํธ๋ฆฌ๋ฐ ํด๋ผ์ด์ธํธ๋ฅผ ํจ์ฌ ์ฝ๊ฒ ๊ฐ๋ฐ ๊ฐ๋ฅ
- ์ ์ฉํ ๋ด์ฅ ๊ธฐ๋ฅ ์ง์: gRPC๋ ์ธ์ฆ, ์ํธํ, ๋ณต์๋ ฅ(๋ฐ๋๋ผ์ธ๊ณผ ํ์์์), ๋ฉํ๋ฐ์ดํฐ ๊ตํ, ์์ถ, ๋ก๋๋ฐธ๋ฐ์ฑ, ์๋น์ค ๊ฒ์ ๋ฑ๊ณผ ๊ฐ์ ํ์ ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์
- ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ์ํ๊ณ์ ํตํฉ: gRPC๋ CNCF์ ์ผ๋ถ์ด๋ฉฐ ๋๋ถ๋ถ์ ์ต์ ํ๋ ์์ํฌ(์, Envoy)์ ๊ธฐ์ ์ gRPC๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํจ
- ์ฑ์ํ๊ณ ๋๋ฆฌ ์ฑํ๋จ: gRPC๋ ๊ตฌ๊ธ์ ๊ฐ๋ ฅํ ํ ์คํธ๋ฅผ ํตํด ์์ฑ๋์์ผ๋ฉฐ ์คํ์ด, ๋ฆฌํํธ, ๋ทํ๋ฆญ์ค, ๋์ปค, ์์ค์ฝ, CoreOS์ ๊ฐ์ ์ฃผ์ ๊ธฐ์ ํ์ฌ์ ์ฑํ๋จ
- ์ธ๋ถ ์๋น์ค ๋ถ์ ํฉ: ์ธ๋ถ ์ฌ์ฉ์๋ gRPC๊ฐ ์๋กญ๊ธฐ ๋๋ฌธ์ ์ ํฉํ์ง ์์ ์ ์์, ๊ณ์ฝ ๊ธฐ๋ฐ์ด๋ฉด์ ๊ฐ๋ ฅํ ํ์ ์์ฑ์ ๊ฐ๋ gRPC ์๋น์ค๋ ์ธ๋ถ ๋น์ฌ์์๊ฒ ๋ ธ์ถ๋๋ ์๋น์ค์ ์ ์ฐ์ฑ์ ๋ฐฉํดํ ์ ์์
- ์๋น์ค ์ ์์ ๊ธ๊ฒฉํ ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ ๊ฐ๋ฐ ํ๋ก์ธ์ค ๋ณต์ก์ฑ: gRPC ์๋น์ค ์ ์๊ฐ ๊ธ๊ฒฉํ ๋ณ๊ฒฝ๋๋ฉด ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ฝ๋ ๋ชจ๋ ๋ค์ ์์ฑํด์ผํ๊ณ , CI ํ๋ก์ธ์ค์ ํตํฉ๋์ผ ํ๊ธฐ ๋๋ฌธ์ ์ ์ฒด ๊ฐ๋ฐ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๋ณต์กํ๊ฒ ํ ์ ์์ (์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋ํ ๋ค๋ฅธ ๋ฒ์ ์ ํ๋กํ ๋ฅผ ์ฌ์ฉํด ๋ฌธ์ ์์ด ์ํธ์ด์ฉ ํ ์ ์์)
- ์๋์ ์ผ๋ก ์์ ์ํ๊ณ: gRPC ์ํ๊ณ๋ ๊ธฐ์กด REST๋ HTTP ํ๋กํ ์ฝ์ ๋นํด ์๋์ ์ผ๋ก ์์
๐ [์ฐธ๊ณ ] gRPC ์ ์ฉ ํฌ์ธํธ: gRPC์ ์ฅ์ ์ด ๋ง์ง๋ง ์ ํด์ผํ ๊ท์น์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ API๋ฅผ ์ง์ํ๋ ๋ด๋ถ ์๋น์ค ๊ฐ๋ฐ์ gRPC๋ฅผ ์ ์ฉํ๊ณ , ์ธ๋ถ ์๋น์ค๋ API์๋ REST๋ GraphQL์ ์ฌ์ฉํด ๊ตฌํํ๊ฒ์ด ์ข๊ฒ ๋ค๊ณ ํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ๋ง์ด ์ ํ๋ "ํด๋ผ์ด์ธํธ-์๋ฒ ๊ตฌ์กฐ"์์ ์์ํ์ฌ ํ ๋จ๊ณ์ ์ค๋ช ์ ์งํํด ๋ณด๊ฒ ์ต๋๋ค.
๊ฐ์ฅ ๋ง์ด ์ ํ๋ ํด๋ผ์ด์ธํธ-์๋ฒ ๊ตฌ์กฐ ์ ๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ Service A๋ฅผ ์์ฒญํ๋ฉด ์๋ฒ๊ฐ ์๋ต ํฉ๋๋ค.
์ ๊ตฌ์กฐ์ gRPC์ ์ฉํ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ stub์ ํตํด Service A๋ฅผ ์์ฒญํ๋ฉด, gRPC ์๋ฒ๊ฐ ์๋ต ํฉ๋๋ค.
์ ๊ตฌ์กฐ์์ Service A๊ฐ Microservice a์ b๋ก ๋ถ๋ฆฌ๋๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ก ๋ณํํ ๊ฒ์ด๊ณ , ๋ค์๊ณผ ๊ฐ์ ์์๋ก ์์ ์ ์งํํ ๊ฒ ์ ๋๋ค.
- ํด๋ผ์ด์ธํธ๋ stub์ ํตํด Service A๋ฅผ ์์ฒญ
- (์ค์ ๋ก Backend์์๋) Microservice a ์ ๊ณต์ ์ํ ์์ ์์
- ์์ ๋์ค stub์ ํตํด Microservice b๋ฅผ ์์ฒญ
- Microservice b ์ ๊ณต์ ์ํ ์์ ์์
- Microservice b ์๋ต
- Microservice a ๋๋จธ์ง ์์ ์ํ
- Microservice a ์๋ต (Service A ์๋ต์ผ๋ก ๋ด๋ ๋ฌด๋ฐฉ)
- ํด๋ผ์ด์ธํธ๋ Service A ๊ฒฐ๊ณผ ์์
ํ์ง๋ง, ๋ง์ดํฌ๋ก์๋น์ค๋ ์ด๋ ๊ฒ ์ ์ ์ธ ๊ตฌ์กฐ๊ฐ ์๋๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ์ ์์ฒญ ๋ถํ์ ๋ฐ๋ผ ๋งค์ฐ ๋์ ์ผ๋ก ์๋น์ค ํ์ฅ ๋ฐ ์ถ์(Autoscaling)๋ฅผ ์ํํ๊ฒ ์ง์. ๋ฐ๋ผ์, Microservice a์ b๋ ์๋ ๊ตฌ์กฐ์ ๊ฐ์ด Endpoint ๋ฐ์ ์์นํ์ฌ ๋์ ํ์ฅ ๋ฐ ์ถ์(Autoscaling)์ ๋ฐ๋ณตํ ๊ฒ์ ๋๋ค. (์๋ ๊ทธ๋ฆผ์ ๋ณด์ค๋ Endpoint๋ฅผ LoadBalancer๋ผ๊ณ ์๊ฐํ๊ณ ๋ณด์ ๋ ๊ด์ฐฎ์ต๋๋ค.)
- ํด๋ผ์ด์ธํธ๋ stub์ ํตํด Endpoint๋ก Service A๋ฅผ ์์ฒญ
- Endpoint์์ ์ ์ ํ gRPC ์๋ฒ๋ก ์์ฒญ ์ ๋ฌ
- ์์ฒญ์ ์ ๋ฌ๋ฐ์ gRPC ์๋ฒ์์ Microservice a ์ ๊ณต์ ์ํ ์์ ์์
- ์์ ๋์ค stub์ ํตํด Endpoint๋ก Microservice b๋ฅผ ์์ฒญ
- Enpoint์์ ์ ์ ํ gRPC ์๋ฒ๋ก ์์ฒญ ์ ๋ฌ
- ์์ฒญ์ ์ ๋ฌ ๋ฐ์ gRPC ์๋ฒ์์ Microservice b ์ ๊ณต์ ์ํ ์์ ์์
- Microservice b ์๋ต
- Microservice a ๋๋จธ์ง ์์ ์ํ
- Microservice a ์๋ต (Service A ์๋ต์ผ๋ก ๋ด๋ ๋ฌด๋ฐฉ)
- ํด๋ผ์ด์ธํธ๋ Service A ๊ฒฐ๊ณผ ์์
(์์ฒญ ์๋ต์ ์ํ ๊ฒฝ๋ก๋ IP transparency, Proxy ๋ฑ์ ์ ์ฉ ์ ๋ฌด์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์๊ธฐ ๋๋ฌธ์ ํ๊ธฐํ์ง ์์์ต๋๋ค.)
- (๋ฒ์ญ์) gRPC ์์์์ ์ด์๊น์ง(์ง์์ด: ์นด์ ์ธ๋๋ผ์๋ฆฌ, ๋ค๋ค์ฌ ์ฟ ๋ฃจํธ, ์ฎ๊ธด์ด: ํ์ฑ๊ณค), ์์ด์ฝ์ถํ์ฃผ์ํ์ฌ, 2021๋
1์ 4์ผ ๋ฐํ, 979-11-6175-463-5
- (์์) gRPC: Up and Running by Kasun Indrasiri and Danesh Kuruppu (O'Reilly). Copyright 2020 Kasun Indrasiri and Danesh Kuruppu, 978-1-492-05833-5
- NAVER CLOUDPLATFORM, [NBP ๊ธฐ์ &๊ฒฝํ] ์๋์ ํ๋ฆ, gRPC ๊น๊ฒ ํ๊ณ ๋ค๊ธฐ #1, 2020
- livlikwav, REST๋ฅผ ์ํํ๋ gRPC์ ๋ฑ์ฅ๋ฐฐ๊ฒฝ๊ณผ, HTTP/2๋ฅผ ๋น๋กฏํ ํน์ง๋ค, 2020
- alice_k106, [Network] gRPC ๊ธฐ๋ณธ ๊ฐ๋ ๋ฐ ์ฌ์ฉ ์์ (golang, python), gRPC์ Load Balancing, 2019
- Chaewon Kong, gRPC์ ์ถํ๋ฐฐ๊ฒฝ๊ณผ ํน์ง, 2019
- James Newton-King, gRPC ์๋น์ค์ HTTP API ๋น๊ต, 2019
- yundream, gRPC, 2019
- ๋์งํธ ์ธ์์ ๋ง๋๋ ์๋ ๋ก๊ฑฐ, Microservices with gRPC, 2017
- ์ํค๋ฐฑ๊ณผ - gRPC
- hoon.choi, GraphQL ๊ฐ๋ ์ก๊ธฐ, 2019