API Gateway๋?
- MSA ์์ ๋ชจ๋ ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋จ์ผ ์ง์
์ ์ญํ ์ ํ๋ ์๋ฒ
- Spring์์๋ ๋ณดํต Spring Cloud Gateway๋ฅผ ์ฌ์ฉ
- ํด๋ผ์ด์ธํธ -> Gateway -> ๋ด๋ถ ์๋น์ค๋ค
- ์๋น์ค๋ค์ ์ธ๋ถ์ ์ง์ ๋
ธ์ถ๋์ง ์์
API Gateway์ ํ์์ฑ
- ์๋น์ค ์ง์ ๋
ธ์ถ์ ๋ฌธ์
- ์๋น์ค๊ฐ ๋ง์์ง์๋ก ์๋ํฌ์ธํธ ๊ด๋ฆฌ ์ด๋ ค์
- ์ธ์ฆ/์ธ๊ฐ ๋ก์ง์ด ๊ฐ ์๋น์ค์ ์ค๋ณต
- CORS, ๋ก๊น
, ๋ชจ๋ํฐ๋ง ๋ถ์ฐ
- Gateway๊ฐ ํด๊ฒฐํ๋ ๊ฒ
- ๊ณตํต ๊ด์ฌ์ฌ ์ค์ํ
- ๋ณด์/์ธ์ฆ ์ผ๊ด์ฑ ํ๋ณด
- ํด๋ผ์ด์ธํธ๋ Gateway๋ง ์๋ฉด ๋จ
Spring Cloud Gateway ํต์ฌ ์ญํ
- ์์ฒญ ๋ผ์ฐํ
(Routing)
- URL, Header, Method ๊ธฐ์ค์ผ๋ก ์๋น์ค ๋ถ๊ธฐ
- /members/** -> member-service
- ์ธ์ฆ/์ธ๊ฐ
- JWT ๊ฒ์ฆ
- ํ ํฐ ์์ผ๋ฉด ์๋น์ค ์ง์
์ฐจ๋จ
- ํํฐ ์ฒ๋ฆฌ
- ์์ฒญ ์ , ํ ๊ณตํต ๋ก์ง
- ๋ก๊น
, ํค๋ ์ถ๊ฐ, ๊ถํ ์ฒดํฌ ๋ฑ
- ํธ๋ํฝ ์ ์ด
Gateway ๋์ ํ๋ฆ
- ํด๋ผ์ด์ธํธ ์์ฒญ ์์
- Predicate๋ก ๋ผ์ฐํ
๋์ ๊ฒฐ์
- Pre Filter ์คํ
- ์ค์ ์๋น์ค๋ก ์์ฒญ ์ ๋ฌ
- Post Filter ์คํ
- ์๋ต ๋ฐํ
์ฃผ์ ๊ฐ๋
์ ๋ฆฌ
- Route
- id : ๋ผ์ฐํธ ์๋ณ์
- uri : ๋ชฉ์ ์ง ์๋น์ค
- predicates : ์์ฒญ ์กฐ๊ฑด
spring:
cloud:
gateway:
routes:
- id: member-service
uri: lb://MEMBER-SERVICE
predicates:
- Path=/members/**
- Predicate
- ์์ฒญ์ ์ด๋ค ์๋น์ค๋ก ๋ณด๋ผ์ง ๊ฒฐ์ ํ๋ ์กฐ๊ฑด
- Path=/api/orders/**
- Method=POST
- Filter
- ์์ฒญ/์๋ต์ ๊ฐ๊ณตํ๋ ๋ก์ง
- Global Filter : ๋ชจ๋ ์์ฒญ ๊ณตํต
- Custom Filter : ํน์ ๋ผ์ฐํธ ์ ์ฉ
- ์ : JWT ๊ฒ์ฆ, ์ฌ์ฉ์ ์ ๋ณด ํค๋์ ์ฃผ์
, ์๋ต ๋ก๊น
Spring Cloud Gateway์ ํน์ง
- Non-Blocking (WebFlux ๊ธฐ๋ฐ)
- ๊ณ ์ฑ๋ฅ, ๊ณ ๋์์ฑ ์ฒ๋ฆฌ์ ์ ๋ฆฌ
- Spring ์ํ๊ณ์ ๊ถํฉ ์ข์
- Eureka, Config Server ์ฐ๋
- OAuth2, JWT ์ฐ๊ณ ์ฌ์
- ์ฝ๋ + ์ค์ ๊ธฐ๋ฐ ๋ชจ๋ ๊ฐ๋ฅ
Gateway vs Nginx
| ๊ตฌ๋ถ |
Spring Cloud Gateway |
Nginx |
| ๋ชฉ์ |
MSA ๋ด๋ถ ๋ผ์ฐํ
|
L7 ํ๋ก์ |
| ์ธ์ฆ/์ธ๊ฐ |
๋งค์ฐ ์ ์ฐ |
์ ํ์ |
| ๋น์ฆ๋์ค ๋ก์ง |
๊ฐ๋ฅ |
๋ถ๊ฐ๋ฅ |
| ๋ฌ๋์ปค๋ธ |
์์ |
๋ฎ์ |
์ธ์ ์ฌ์ฉํ๋ฉด ์ข์๊น?
- ์๋น์ค๊ฐ 3๊ฐ ์ด์
- ์ธ์ฆ/์ธ๊ฐ ๊ณตํต ์ฒ๋ฆฌ ํ์
- MSA ๊ตฌ์กฐ ๋์
๋จ๊ณ
- ํด๋ผ์ด์ธํธ ์ข
๋ฅ๊ฐ ์ฌ๋ฌ ๊ฐ (์น/์ฑ)