DMS-SMS/V1
API Gateway ์ด์ธ์ ์๋น์ค๋ค์ ๋ํ Repository๋ ์๋น์ค ๋ถํด ๋ถ๋ถ์์ ํ์ธํ์ค ์ ์์ต๋๋ค!
INDEX
-
SMS๋ School Management System์ ์ฝ์ด๋ก, ์ค์ ๋ก ํ์๋ค์ ๋์์ผ๋ก ์ด์์ค์ธ ํ๊ต ๊ด๋ฆฌ ์์คํ
์ ์๋ฏธํฉ๋๋ค
-
๋๋์ํํธ์จ์ด๋ง์ด์คํฐ๊ณ ๋ฑํ๊ต์ ๊ธฐ์์ฌ ๊ด๋ฆฌ ์์คํ
(DMS, Dormitory Management System)์ ๊ฐ๋ฐํ๋ ๋์๋ฆฌ์ธ DMS์์ 5๊ธฐ ๋ถ์๋ค(ํ 2021๋
๊ธฐ์ค 3ํ๋
)์ด ๊ฐ๋ฐํ๋ ์๋ก์ด ์๋น์ค์
๋๋ค.
-
์๋ฒ ๊ฐ๋ฐ์๋ ํ์ฌ README.md๋ฅผ ์์ฑ์ค์ธ ๋ฐ์งํ(PM)๊ณผ ์๋ฏผ๊ธฐ ํ์์ด ์ฐธ์ฌํด ์ฃผ์๊ณ , MSA ๊ธฐ๋ฐ์ ์๋ฒ๋ฅผ ๊ฐ๋ฐํ์๊ณ ํ์ฌ ์ด์์ค์
๋๋ค.
์๋น์ค ๊ธฐ๋ฅ
-
์ธ์ถ์ฆ ์๋น์ค
- ์ ํฌ ์๋น์ค์ ์ฃผ๊ธฐ๋ฅ์ผ๋ก, ์คํ๋ผ์ธ ํ์์ด์๋ ๊ธฐ์กด์ ์ธ์ถ ํ๋ก์ธ์ค๋ฅผ ์จ๋ผ์ธ ํ์์ผ๋ก ๋ง๋ ๊ฒ ์
๋๋ค.
- ํ์์ด ์ ์ฒญํ๊ณ ์ ์๋ ๋ฐ ํ๋ถ๋ชจ๊ฐ ์น์ธ ๋ฐ ์กฐํ๋ฅผ ํ ์ ์์ต๋๋ค.
-
ํ์ฌ ์ผ์ ์๋น์ค
- ํ์ฌ ์ผ์ ๊ด๋ จ ์ ๋ณด๋ค์ ๊ด๋ฆฌํ๋ ์๋น์ค๋ก, ์ธ๋ถ์ ์ผ๋ก๋ ์๊ฐํ์ ์บ๋ฆฐ๋ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ด ์์ต๋๋ค.
- ํ์์ด ๋ณผ ์ ์๊ณ , ๋ํ ์บ๋ฆฐ๋๋ ์ ์๋์ด ์ผ์ ์ ๊ด๋ฆฌํ ์๋ ์์ต๋๋ค.
-
๋์๋ฆฌ ์๋น์ค
- 1ํ๋
์น๊ตฌ๋ค ๋์์ ์๋น์ค๋ก, ๋์๋ฆฌ ์ ๋ณด ๋ฐ ๋์๋ฆฌ ๋ชจ์ง ๊ณต๊ณ ๋ฅผ ๊ด๋ฆฌํ๋ ์๋น์ค์
๋๋ค.
- ๋์๋ฆฌ ๊ด๋ฆฌ์(๋ถ์ฅ) ๊ฐ ๊ด๋ฆฌํ๊ณ ํ์์ด ์กฐํํ ์ ์์ต๋๋ค.
-
๊ณต์ง ์๋น์ค
- ๋ง์ง๋ง์ผ๋ก ์ ์๋ ๋ฐ ๋์๋ฆฌ ๊ด๋ฆฌ์(๋ถ์ฅ) ๊ฐ ๊ด๋ฆฌํ๊ณ ํ์์ด ํ์ธํ ์ ์๋ ๊ณต์ง ์๋น์ค๊ฐ ์์ต๋๋ค.
- ์ฐธ๊ณ ๋ก ์ ์๋์ด ์ฌ๋ฆฌ์๋ ํ๊ต ๊ณต์ง์๋ ๋์(ํ๋
๋ฐ)์ ์ค์ ํ ์ ์์ต๋๋ค.
์๋น์ค ๋ถํด
API Gateway์ ๋ํ HTTP API ๋ฐ gRPC ์๋น์ค๋ค์ ๋ํ RPC API์ ๋ํด ์ค๊ณํ ๋ด์ฉ๋ค์ HTTP API ์ค๊ณ์ RPC API(Proto) ์ค๊ณ์์ ์ถ๊ฐ๋ก ํ์ธํ์ค ์ ์์ต๋๋ค.
์ฐธ๊ณ ๋ก, protocol-buffer ๊ด๋ จ ํ์ผ๋ค์ ๋ชจ์๋ ๋ ํฌ์งํ ๋ฆฌ์์๋ ์ฐธ๊ณ ํ์ค ์ ์์ต๋๋ค.
-
- ์ด๋ฆ -> DMS.SMS.v1.api.gateway
- ์ค๋ช
-> ์ ์ ํ ์๋น์ค์ ์ฌ์ฉ์ ์์ฒญ ๋ผ์ฐํ
์๋น์ค
- ๊ฐ๋ฐ -> ๋ฐ์งํ
-
- ์ด๋ฆ -> DMS.SMS.v1.api.health-checker
- ๊ธฐ๋ฅ -> Consul์ ์ด์ฉํ ์๋น์ค ๋ฐ ์๋ํฌ์ธํธ๋ฅผ ์ด์ฉํ API ์ํ ์ฒดํฌ ๋ฐ ๊ธฐ๋ก ๊ด๋ฆฌ
- ๊ฐ๋ฐ -> ๋ฐ์งํ
-
- ์ด๋ฆ -> DMS.SMS.v1.service.outing
- ๊ธฐ๋ฅ -> ์ธ์ถ์ฆ ๊ด๋ฆฌ ์๋น์ค
- ๊ฐ๋ฐ -> ์๋ฏผ๊ธฐ
-
- ์ด๋ฆ -> DMS.SMS.v1.service.auth
- ์ค๋ช
-> ํ์, ์ ์๋, ๋ถ๋ชจ๋ ๊ณ์ ๋ฐ ์ ๋ณด ๊ด๋ฆฌ ์๋น์ค
- ๊ฐ๋ฐ -> ๋ฐ์งํ
-
- ์ด๋ฆ -> DMS.SMS.v1.service.announcement
- ๊ธฐ๋ฅ -> ๊ณต์ง(ํ๊ต, ๋์๋ฆฌ) ๊ด๋ฆฌ ์๋น์ค
- ๊ฐ๋ฐ -> ์๋ฏผ๊ธฐ
-
- ์ด๋ฆ -> DMS.SMS.v1.service.schedule
- ๊ธฐ๋ฅ -> ํ์ฌ ์ผ์ (์๊ฐํ, ์บ๋ฆฐ๋) ๊ด๋ฆฌ ์๋น์ค
- ๊ฐ๋ฐ -> ์๋ฏผ๊ธฐ
-
- ์ด๋ฆ -> DMS.SMS.v1.service.club
- ๊ธฐ๋ฅ -> ๋์๋ฆฌ(์ ๋ณด, ๋ชจ์ง) ๊ด๋ฆฌ ์๋น์ค
- ๊ฐ๋ฐ -> ๋ฐ์งํ
API Gateway ๊ธฐ๋ฅ
-
์์ฒญ ์ ํจ์ฑ ๊ฒ์ฌ
- ์๋ฒ์ ์ ์กํ payload์ ๊ผญ ํ์ํ ๋ฐ์ดํฐ๊ฐ ๋ค ์กด์ฌํ๋์ง, ๋ฐ์ดํฐ ์ ์ฝ์กฐ๊ฑด์ ๋ค ๋ง์กฑํ๋์ง ํ์ธ (x -> 400 Bad Request)
-
์ธ์ฆ ์ฒ๋ฆฌ
- ํ ํฐ์ด ํค๋์ ์กด์ฌํ๊ณ ์ ํจํ์ง, ํด๋น ํ ํฐ์ payload์ ํ์์ด ์ณ๋ฐ๋ฅธ์ง ํ์ธ (X -> 401 Unauthorized)
ํธ์ถํ ์๋น์ค๊ฐ ๋ณธ์ธ ๊ณ์ ์ ๊ถํ์ผ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ ์๋น์ค์ธ์ง ํ์ธ (X -> 403 Forbidden)
-
์๋น์ค ํ์ ๋ฐ ๋ถํ ๋ถ์ฐ
์ฐธ๊ณ ๋ก ์๋น์ค์ ์ฅ์ ๋ฅผ ๋ฐฉ์งํ๊ณ ํฌ๊ธฐ๋ฅผ ๋์ ์ผ๋ก ์กฐ์ ํ๊ธฐ ์ํด ์ด Service Discovery๋ฅผ ์ ์ฐํ๊ฒ ์ฌ์ฉํ ์ค ์์์ผ ํจ!
- ์๋น์ค๋ค์ด ๋์ IP ์ฃผ์์ ํธ์คํ
๋๋ ํน์ฑ์ ํน์ ์๋น์ค์ ์์ฒญ์ ๋ฃ์ ๋ ๋ง๋ค ํด๋น ์๋น์ค์ IP ์ฃผ์๋ฅผ ์์์ผํ๊ธฐ ๋๋ฌธ์ Service Discovery(consul ์ฌ์ฉ)์์ ์กฐํ (์กฐํ ๊ฒฐ๊ณผ X -> 503 Service Unavailable)
- ๋ํ ์๋น์ค ์กฐํ ๊ฒฐ๊ณผ๊ฐ ์ฌ๋ฌ ๊ฐ์ผ ๊ฒฝ์ฐ, ๊ทธ ์ค ์์ฒญ์ ๋ณด๋ผ ์๋น์ค๋ฅผ ์ ํด์ผ ํ๋ฏ๋ก Load Balancing์ด ํ์ํจ (Round Robin ์๊ณ ๋ฆฌ์ฆ ์ฌ์ฉ)
-
๊ณ๋จ์ ์ค๋ฅ ๋ฐฉ์ง
ํน์ ์๋น์ค์ ๋๊ธฐ ํต์ ์ ํ ๊ฒฝ์ฐ, ํด๋น ์๋น์ค์ ์๋ต์ด ๋ฌด๊ธฐํ ์ฐ๊ธฐ๊ฐ ๋๋ค๋ฉด ์ด๋ ๊ณง ์
์คํธ๋ฆผ ์๋น์ค์ ๋ฉ๋ชจ๋ฆฌ๊น์ง ์ก์๋จน๊ฒ ๋์ด ๊ณ๋จ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ด์ ๋ํ ๋์ฑ
์ด ํ์ํจ!
- ์๋ต์ ์ต๋๋ก ๋๊ธฐํ ์ ์๋ ์๊ฐ ์ค์ (์๊ฐ ๋ง๋ฃ -> 408 Request Timeout)
- ์์ ๊ฐ์ด ํน์ ์๋น์ค๊ฐ ๋ถ๋ฅ ์ํ๊ฐ ๋์์ ๊ฒฝ์ฐ, ํด๋น ์๋น์ค๋ก ์์ฒญ์ด ๊ฐ๋ ๊ฒ์ ์ฐจ๋จํ๊ธฐ ์ํด Circuit Breaker ํจํด ์ ์ฉ
- ์ฐจ๋จ๊ธฐ ์ด๋ฆผ -> Service Discovery์ Health Check์ Fatal๋ก ๋ณ๊ฒฝ (์กฐํ X)
- ์ฐจ๋จ๊ธฐ ๋ซํ -> Service Discovery์ Health Check์ Pass๋ก ๋ณ๊ฒฝ (์กฐํ O)
-
Dos ๊ณต๊ฒฉ ๋๋น
- ๋์ผํ IP์ ์์ฒญ์ด 1์ด์ ํน์ ํ์ ์ด์ ๋ค์ด์ฌ ๊ฒฝ์ฐ, ํด๋น IP ์ฐจ๋จ ๋ฐ ์์ผ๋ก์ ์์ฒญ 403 Forbidden ๋ฐํ (ํน์ ํ์ ์ด์ ์์ ์ดํ์ ์์ฒญ -> 429 Too Many Request)
-
๊ด์ธก์ฑ ํจํด ์ ์ฉ
- ELK Stack(Elasticsearch + Logstash + Kibana + Filebeat)๋ก ๊ตฌ์ฑ๋ ๋ก๊ทธ ์์คํ
์ ๋ก๊ทธ ์์ฑ
- ์ธ๋ถ API์ ๋ํ ์ง์ฐ ์๊ฐ ๋ฐ ์๋ต ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๊ธฐ ์ํ Distributed Trace(jaeger ์ฌ์ฉ)๋ฅผ ์์ํ๊ธฐ ์ํด Span ์์ฑ ๋ฐ Metadata๋ก ๋ค์ ์๋น์ค์ Span-Context ์ ๋ฌ
-
์๋ ์ ํ
- ์๋น์ค๋ณ๋ก 1์ด๊ฐ ์์ฉ๋ ์ ์๋ ์์ฒญ์ ์ต๋ ํ์ ์ค์ (ํด๋น ํ์ ์ด๊ณผ -> 429 Too Many Request)
-
HTTP API ์๋ต ์บ์ฑ
- ๋ฆฌ์์ค๊ฐ ๋น๊ต์ ๋ง์ด ์๋ชจ๋๋ API๋ค์ ์ฑ๋ฅ ํฅ์์ ์ํด ์๋ต redis์ ์ ์ฅ (๋ง๋ฃ ์๊ฐ -> 1๋ถ)
- ์๋ต ์บ์๊ฐ ์กด์ฌํ๋ฉด ํด๋น ์บ์๋ฅผ ๋ฐํํ๊ณ , ํน์ ์บ์์ ๋ณ๊ฒฝ์ด ๊ฐ์ง๋๋ฉด ํด๋น ์บ์ ์ญ์
๋ฐฐํฌ ๋ฐฉ์
(2020-09-19)
๊ฐ๊ฐ์ ์๋น์ค๋ค์ AWS EKS ํด๋ฌ์คํฐ์ ๋
ธ๋๋ง๋ค ํ๋์ฉ Public Subnet๋ฐ Private Subnet์ ์๋ง๊ฒ ๋ฐฐ์น๋์ด ์คํ์ค์
๋๋ค.
๋ฐฐํฌ ์๋น์ค ์
๋ฐ์ดํธ ๋ฐฉ์์ ์๋ก์ด ๋ฒ์ ์ ์๋น์ค ์คํ ํ์ผ์ด ๋ด๊ธด Docker Image๋ฅผ Docker Hub์ ์ฌ๋ฆฐ ํ AWS EKS ํด๋ฌ์คํฐ์ ์ฐ๊ฒฐ๋ kubectl ๋ช
๋ น์ด๋ฅผ ์ด์ฉํด์ deployment ๊ฐ์ฒด์ ์ด๋ฏธ์ง ๋ฒ์ ์ ๋ณ๊ฒฝํฉ๋๋ค.
(2020-11-24)
AWS EKS ๋น์ฉ ์ง์ ๋ฌธ์ ๋ก ์ธํด EC2์์ ์ง์ k8s ํด๋ฌ์คํฐ๋ฅผ ์คํ์์ผ์ ์ด์ํ๊ณ ์์ต๋๋ค.
(2020-12-29)
- ๋ฆฌ์์ค(๋ฉ๋ชจ๋ฆฌ) ์ฉ๋ ๋ฌธ์ ๋ก k8s์์ docker swarm๋ก ์ปจํ
์ด๋ ๊ด๋ฆฌ ํ๋ ์์ํฌ๋ฅผ ๋ฐ๊ฟ์ ์ด์์ค์
๋๋ค.
๋ฒ์ ๋ณ ๊ฐ์
- ๋ฐฐํฌ ๋ ์ง -> 2020.11.21
- ๋ฒ์ ๊ฐ์ -> Auth, Club Service ์ฐ๊ฒฐ
- PR link -> github.com/DMS-SMS/v1-api-gateway/pull/25
- Docker -> jinhong0719/dms-sms-api-gateway:1.0.0.RELEASE
- ๋ณ๊ฒฝ ๋ด์ฉ
- Auth & Club Service์ gRPC ๊ธฐ๋ฐ API๋ก ์์ฒญ์ ์คํธ๋ฆผํ๋ HTTP API ์ถ๊ฐ
- ๋ฐฐํฌ ๋ ์ง -> 2020.12.12
- ๋ฒ์ ๊ฐ์ -> Outing, Schedule, Announcement Service ์ฐ๊ฒฐ
- PR link -> github.com/DMS-SMS/v1-api-gateway/pull/28
- Docker -> jinhong0719/dms-sms-api-gateway:1.0.1.RELEASE
- ๋ณ๊ฒฝ ๋ด์ฉ
- Outing & Schedule & Announcement Service์ gRPC ๊ธฐ๋ฐ API๋ก ์์ฒญ์ ์คํธ๋ฆผํ๋ HTTP API ์ถ๊ฐ
- ๋ฐฐํฌ ๋ ์ง -> 2021.01.27
- ๋ฒ์ ๊ฐ์ -> ์ฑ๋ฅ ํฅ์์ ์ํ ์ ์ฒด์ ์ธ consul ์๋น์ค ๋
ธ๋ ์กฐํ ๋ฐฉ์ ๋ณ๊ฒฝ
- PR link -> github.com/DMS-SMS/v1-api-gateway/pull/34
- Docker -> jinhong0719/dms-sms-api-gateway:1.0.2.RELEASE
- ๋ณ๊ฒฝ ๋ด์ฉ
- Consul์์ ๋ณ๊ฒฝ ์ด๋ฒคํธ ๊ฐ์ง ์, Gateway ํฌํจ ๊ฐ๊ฐ์ ์๋น์ค์ ์ฐ๊ฒฐ๋์ด ์๋ AWS SNS์ ๋ฉ์์ง ๋ฐํ
- ์๋น์ค ๋ณ๋ก AWS SQS Pulling์ ํตํด ๋ฉ์์ง๋ฅผ ๋ฐ์ผ๋ฉด, ํด๋น ์์ ์ consul ์๋น์ค ๋
ธ๋ ์ ์ฒด ์กฐํ ํ ์ ์ฅ
- ๊ทธ ํ, ์์์ ๋ก์ปฌ์ ์ ์ฅํ ๋
ธ๋ ๋ชฉ๋ก์ ๊ธฐ์ค์ผ๋ก ์์ฒญ์ ์คํธ๋ฆผํ ์๋น์ค ๋
ธ๋ ์ ํ
- ์์
- '์์ฒญ ๋ฐ์ ์ ๋ง๋ค ๋งค๋ฒ ์กฐํ -> consul ๋ณ๊ฒฝ ์์ ์๋ง ์กฐํ ํ ์ ์ฅ'
- ๋ฐฐํฌ ๋ ์ง -> 2021.02.06
- ๋ฒ์ ๊ฐ์ -> API ๋ณ๋ก ์ค๋ณต๋๋ ๊ธฐ๋ฅ๋ค middleware๋ก ๋ฌถ์ ํ router์ ๋ฑ๋ก
- PR link -> github.com/DMS-SMS/v1-api-gateway/pull/35
- Docker -> jinhong0719/dms-sms-api-gateway:1.0.3.RELEASE
- ๋ณ๊ฒฝ ๋ด์ฉ
- tracer span ๊ด๋ฆฌ(์์, ์ข
๋ฃ ๋ฐ ๋ก๊ทธ ๊ธฐ๋ก), ์ธ์ฆ ์ฒ๋ฆฌ, ์์ฒญ ๋ฐ์ธ๋ฉ ๊ธฐ๋ฅ๋ค middleware๋ก ๋ฐ๋ก ๋นผ์ ์ฒ๋ฆฌ
- ๋ฐฐํฌ ๋ ์ง -> 2021.02.15
- ๋ฒ์ ๊ฐ์ -> ์ฑ๋ฅ ํฅ์์ ์ํ API ์๋ต ์บ์ฑ ํธ๋ค๋ง ๊ธฐ๋ฅ ์ถ๊ฐ (in redis)
- PR link -> github.com/DMS-SMS/v1-api-gateway/pull/38
- Docker -> jinhong0719/dms-sms-api-gateway:1.0.4.RELEASE
- ๋ณ๊ฒฝ ๋ด์ฉ
- Outing, Schedule, Announcement ์๋น์ค์ ์กฐํ ๊ด๋ จ API ์๋ต redis์ ์ ์ฅ
- ์๋ต ์บ์๊ฐ redis์ ์กด์ฌํ ๊ฒฝ์ฐ, ๋ฐ๋ก ์์ฒญ์ ๋ณด๋ด์ง ์๊ณ json์ผ๋ก ๋ณํ ํ ๋นํ
- ํน์ ๋ฆฌ์์ค์ ๋ํ ๋ณ๊ฒฝ ๊ฐ์ง ์(์ํ ์ฝ๋๋ก ํ๋ณ), ํด๋น ๋ฆฌ์์ค์ ๊ด๋ จ๋ ์บ์ ์ญ์
- consul change event ์ ๋ฌ ๋ฐฉ์ ๋ณ๊ฒฝ (AWS SNS & SQS -> gRPC)
๋ฐ์ดํฐ ์๊ฐํ
์๋ ๊ฐ์ด Kibana๋ฅผ ์ด์ฉํด ์๋น์ค๋ณ ์์ฒญ ํ์ ๋ฐ ํ๊ท ์ฒ๋ฆฌ ์๊ฐ์ ์ํ ๋ํ์ ์ ๋ํ๋ฅผ ์ด์ฉํ์ฌ ํํํ์์ต๋๋ค.
