๐ ์ฐ๋ฆฌ๋ Spring Cloud๋ฅผ ํ์ฉํ์ฌ MSA๋ฅผ ๊ตฌ์ถํ๋ค.
๐ ์์, API Gateway์ ๋ผ์ฐํ ์ ์ค์ ํ๋๋ฐ ์คํํ์ ๋ ๊ฒฐ๊ณผ ๊ฐ์ด ๋ค๋ฅด๊ฒ ๋ํ๋ฌ๋ค. ๊ทธ ์ด์ ์ ๋ํด ์์๋ณด์.
API Gateway ํํธ 3
์ฐ์ , ์์ฑํ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
1. user-service์ UserController.java ํ์ผ
// user-service: UserController.java (8081 ํฌํธ ์ฌ์ฉ)
package com.caffeinedoctor.userservice.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@GetMapping("/")
public String getServiceName(){
return "user-service";
}
}
user- service ์๋ฒ ์คํ
http://localhost:8081/
2. apigateway-service์ application.yml ํ์ผ
# apigateway-service: application.yml
server:
port: 8000
spring:
application:
name: apigateway-service
cloud:
gateway:
routes:
- id: user-service
uri: http://localhost:8081/
predicates:
- Path=/user-service/**
- id: beverage-service
uri: http://localhost:8082/
predicates:
- Path=/beverage-service/**
- id: community-service
uri: http://localhost:8083/
predicates:
- path=/community-service/**
apigateway-service ์๋ฒ ์คํ
http://localhost:8000/user-service/
- 404 ์๋ฌ ๋ฐ์
โ๋ผ์ฐํ ์ฐ๊ฒฐ์ ํ๋๋ฐ ๋ ์ฃผ์์ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅด๊ฒ ๋ํ๋๋ค. ๋ค์ ๋งํด, API Gateway service์ ๋ผ์ฐํ ์ค์ ์ ๋ง์ณค๋๋ฐ ๊ฐ ์๋น์ค๋ก ์ฐ๊ฒฐ์ด ๋์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. apigateway-service์ yml ํ์ผ์ ์ค์ ์ ํ๋๋ฐ 8000๋ฒ ํฌํธ์์ 8081, 8082, 8083 ํฌํธ๋ก ์ฐ๊ฒฐ์ด ์ ๋๋ค.๐จ
- http://localhost:8000/user-service/์์ http://localhost:8081/๋ก ์ฐ๊ฒฐ์ด ์๋๋ค.
- http://localhost:8000/beverage-service/์์ http://localhost:8082/๋ก ์ฐ๊ฒฐ์ด ์๋๋ค.
- http://localhost:8000/community-service/์์ http://localhost:8083/์ผ๋ก ์ฐ๊ฒฐ์ด ์๋๋ค.
์ ๊ทธ๋ด๊น? ๊ทธ ์ด์ ๋ฅผ ์ฐพ๊ธฐ ์ํด ๋ ์ด์ฌํ ๊ตฌ๊ธ ๊ฒ์์ ํ๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก, ์ด ๋ฌธ์ ๋ Gateway ์ค์ ๊ฒฝ๋ก์ ์ค์ ์๋น์ค ์ฝ๋ ๊ฐ์ API ํต์ ๊ฒฝ๋ก ๋ถ์ผ์น๋ก ์ธํด ๋ฐ์ํ๋ค๋ ๊ฒ์ ์์๋๋ค. ์์ ์ฝ๋ ์ค์ ์ ๋ฐ๋ฅด๋ฉด http://localhost:8000/user-service/๋ก ๋ค์ด์ค๋ ์์ฒญ์ด http://localhost:8081/๋กํ๋ฝ์๋๋ ๊ฒ์ ์์ํ์ผ๋ ์ค์ ๋ก๋ http://localhost:8081/user-service/๋ก ์ ๋ฌ๋๋ ๊ฒ์ด์๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฐพ์๋ค.
- ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ ๊ฒฝ๋ก๋ฅผ ์์ ํ์ฌ ์๋น์ค ์ฝ๋์ ์ผ์น์ํค๋ ๊ฒ์ด๋ค.
- ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ Spring Cloud Gateway์์ URI ๊ฒฝ๋ก๋ฅผ ์ฌ์์ฑํ๋ ํํฐ๋ฅผ ์ ์ฉํ๋ ๊ฒ์ด๋ค. Gateway๋ ์ด๋ฌํ ํํฐ๋ฅผ ํตํด ๋ค์ด์ค๋ ์์ฒญ๊ณผ ๋๊ฐ๋ ์๋ต์ ์์ ํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด Gateway์ ์๋น์ค ๊ฐ์ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์๋ค.
โญAPI Gateway์์ ๋ง์ดํฌ๋ก์๋น์ค๋ก ๋ผ์ฐํ ์ฐ๊ฒฐ์ด ์ ๋๋ก ๋์ง ์์ ์ด์ ?
๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด,
Gateway ๊ตฌ์ฑ์์ ์ ์๋ ๊ฒฝ๋ก ๋ฐ ํ๋ฝ์ ์ค์ ๊ณผ ์ค์ ์๋น์ค ์ฝ๋ ๊ฐ์ ๋ถ์ผ์น ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- Gateway ์ค์ ๊ฒฝ๋ก
- http://localhost:8000/user-service/** ์ผ๋ก ์์ฒญํ๋ฉด
- http://localhost:8081/user-service/** ์ผ๋ก ์์ฒญ์ด ๋์ด๊ฐ๋ค.
- user-service ์๋น์ค ๊ฒฝ๋ก
- user-service ์๋น์ค API @GetMapping("/") ์ผ๋ก ์ค์ ๋์ด์๋ค.
- http://localhost:8081/ ์ผ๋ก API ํต์ ์ ํ๊ณ ์๋ค.
- ์ฆ, http://localhost:8000/user-service/ ์ ๋ํด์๋ API๊ฐ ์ค์ ๋์ด ์์ง ์์ 404์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
์์ธํ ์ค๋ช ํ๋ฉด,
๋จผ์ , Spring Cloud Gateway ์ค์ ์ ์ดํด๋ณด๋ฉด ๋ผ์ฐํฐ ์ค์ ์ด ๋ค์๊ณผ ๊ฐ๋ค.
# apigateway-service: application.yml
spring:
application:
name: apigateway-service
cloud:
gateway:
routes:
- id: user-service
# ์ด๋๋ก ๊ฐ๊บผ๋?
uri: http://localhost:8081/
# ์กฐ๊ฑด์
predicates:
- Path=/user-service/**
์ด ์ค์ ์ Gateway์ ๋ค์ด์ค๋ /user-service/๋ก ์์ํ๋ ์์ฒญ์ http://localhost:8081/user-service/๋ก ํ๋ก์ ํ๋ผ๋ ์๋ฏธ์ด๋ค.
ํ์ฌ Spring Cloud Gateway ์ค์ ์ http://localhost:8081/์ user-service/**๊ฐ ์ถ๊ฐ๋์ด http://localhost:8081/user-service/**๋ก ์์ฒญ๋๋ค.
- http://localhost:8081/ + user-service/**
http://localhost:8000/user-service/** ์ผ๋ก ์์ฒญํ๋ฉด http://localhost:8081/user-service/** ์ผ๋ก ์์ฒญ์ด ๋์ด๊ฐ๋ค.
user-service์ ์ปจํธ๋กค๋ฌ์ API ํต์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
// user-service: UserController.java (8081 ํฌํธ ์ฌ์ฉ)
@RestController
public class UserController {
@GetMapping("/")
public String getServiceName(){
return "user-service";
}
}
user-service์ ์ปจํธ๋กค๋ฌ๋ "/" ๊ฒฝ๋ก์ ๋ํด์๋ง ์๋ตํ๊ณ ์๋ค. ๋ฐ๋ผ์ ์ค์ ๋ก๋ http://localhost:8081/์์ ๋ํด์๋ง ๋์ํ๋ค. ํ์ง๋ง, Gateway๋ /user-service/๋ก ์์ํ๋ ์์ฒญ์ ๊ธฐ๋ํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด ์์ฒญ์ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ค.
์ ๋ฆฌํ์๋ฉด,
์ด ๋ฌธ์ ๋ Gateway ์ค์ ๊ฒฝ๋ก์ ์ค์ ์๋น์ค ์ฝ๋ ๊ฐ์ API ํต์ ๊ฒฝ๋ก ๋ถ์ผ์น๋ก ์ธํด ๋ฐ์ํ๋ค.
- ํ์ฌ ์ค์ ์ ๋ฐ๋ฅด๋ฉด, Gateway์์ ์์ฒญ์ด http://localhost:8000/user-service/** ์ผ๋ก ๋ค์ด์ค๋ฉด ์ค์ ๋ก๋ http://localhost:8081/user-service/** ์ผ๋ก ์ ๋ฌ๋๋ค.
- ๊ทธ๋ฌ๋ ์ค์ ์๋น์ค ์ฝ๋์์๋ http://localhost:8081/user-service/๊ฐ ์๋ http://localhost:8081/์์๋ง API๊ฐ ์ค์ ๋์ด ์๋ค.
- ์ด ๋ถ์ผ์น๋ก ์ธํด ์์ฒญ์ด ์ฌ๋ฐ๋ฅธ ์๋ํฌ์ธํธ๋ก ์ ๋ฌ๋์ง ์๊ณ ์๋น์ค ์ฝ๋์ ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ์ด๋ํ๊ฒ ๋์ด 404์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
๋ค๋ฅธ API ์ฃผ์๋ก ์๋ฅผ ๋ค๋ฉด,
@GetMapping("/welcome") ์ผ๋ก ๋์ด์์ ๋,
Gateway์์ http://localhost:8000/user-service/welcome๋ก ์์ฒญ์ด ์ ๋ฌ๋๋ฉด ์ค์ ๋ก๋ http://localhost:8081/user-service/welcome๋ก ์ ๋ฌ๋์ด์ผ ํ๋ค. ๊ทธ๋ฌ๋ ์ค์ ์๋น์ค ์ฝ๋์์๋ http://localhost:8081/welcome ๊ฒฝ๋ก์ API๊ฐ ์ค์ ๋์ด ์๋ค.
1. API Gateway ๋ผ์ฐํ ๊ฒฝ๋ก ์์ ํ๊ธฐ
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ user-service์ ์ปจํธ๋กค๋ฌ๊ฐ /user-service/ ๊ฒฝ๋ก์ ๋ํด์ ์๋ตํ๋๋ก ์์ ํด์ผ ํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด Gateway ์ค์ ๊ณผ ์ค์ ์๋น์ค์ ๊ฒฝ๋ก๊ฐ ์ผ์นํ๊ฒ ๋์ด ์์ฒญ์ด ์ฌ๋ฐ๋ฅด๊ฒ ํ๋ฝ์ ๋ ๊ฒ์ด๋ค.
user-service์ UserController.java ํ์ผ ์์
// user-service: UserController.java (8081 ํฌํธ ์ฌ์ฉ)
@RestController
@RequestMapping("/user-service")
public class UserController {
@GetMapping("/")
public String getServiceName(){
return "user-service";
}
}
ํด๋ผ์ด์ธํธ๊ฐ http://localhost:8000/user-service/๋ก ์์ฒญ์ ๋ณด๋ด๋ฉด, API Gateway๋ ์ด ์์ฒญ์ http://localhost:8081/user-service/๋ก ํ๋ฝ์ํ๋ค.
user- service ์๋ฒ ์คํ
apigateway-service ์๋ฒ ์คํ
์ด ๊ฒฝ์ฐ๋ ํํฐ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ๋จ์ํ ๊ฒฝ๋ก๋ฅผ ๋ผ์ฐํ ๋์์ผ๋ก ์ ๋ฌํ ๊ฒ์ด๋ค.
๊ฒฝ๋ก ์์
http://localhost:8000/user-service/name โก๏ธ http://localhost:8081/user-service/name
http://localhost:8000/beverage-service/10 โก๏ธ http://localhost:8082/beverage-service/10
http://localhost:8000/community-service/feed โก๏ธ http://localhost:8083/community-service/feed
์ฐธ๊ณ ์๋ฃ
https://spring.io/blog/2022/08/26/creating-a-custom-spring-cloud-gateway-filter
'Software Architecture > MSA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[MSA] Spring Cloud Gateway Filter (API Gateway) (0) | 2024.03.21 |
---|---|
[MSA ๊ตฌ์ถํ๊ธฐ] 8. Spring Cloud Gateway์ ํํฐ ์ ์ฉํ๊ธฐ (API Gateway) (0) | 2024.03.21 |
[MSA] API Gateway (0) | 2024.03.19 |
[MSA ๊ตฌ์ถํ๊ธฐ] 6. Spring Cloud Gateway ๋ผ์ฐํ ์ค์ ํ๊ธฐ (API Gateway) (0) | 2024.03.18 |
[MSA] Spring Cloud Gateway์ Netflix Zuul์ ์ฐจ์ด์ (API Gateway) (0) | 2024.03.16 |