๐ ์ฐ๋ฆฌ๋ Spring Cloud๋ฅผ ํ์ฉํ์ฌ MSA๋ฅผ ๊ตฌ์ถํ๋ค.
๐ ์ด๋ฒ์๋, Spring Cloud Gateway Routes์ Filters๋ฅผ ์ค์ ํ ๊ฒ์ด๋ค.
API Gateway ํํธ 4
Spring Cloud Gateway ๋ผ์ฐํ ์ ์ค์ ํ์ง๋ง ์๋ฒ๋ฅผ ์คํํ์ ๋ ์ ๋๋ก ์ฐ๊ฒฐ๋์ง ์์๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ Gateway ์ค์ ๊ฒฝ๋ก ๋ฐ ํ๋ก์ ์ค์ ๊ณผ ์ค์ ์๋น์ค ์ฝ๋ ๊ฐ์ ๋ถ์ผ์น ๋๋ฌธ์ ๋ฐ์ํ๋ค.
Gateway ์ค์ ๊ฒฝ๋ก์ ์๋น์ค ๊ฒฝ๋ก ์ผ์น๋ฅผ ์ํด user-service์ ์ปจํธ๋กค๋ฌ ๊ฒฝ๋ก๋ฅผ ์์ ํ๋ค. ์ด ๊ฒฝ์ฐ๋ ํํฐ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ๋จ์ํ ๊ฒฝ๋ก๋ฅผ ๋ผ์ฐํ ๋์์ผ๋ก ์ ๋ฌํ๋ ๊ฒ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
โ๊ฒฝ๋ก ์์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉด, user-service์ ๋ชจ๋ ์ปจํธ๋กค๋ฌ์ @RequestMapping("/user-service") ์ ์ถ๊ฐํด์ผ ํ๋ ์ํฉ์ด ๋ฐ์ํ๋ค. ๋ค๋ฅธ ๋ง์ดํฌ๋ก์๋น์ค๋ค๋ ๊ฐ ์๋น์ค์ ์ด๋ฆ์ผ๋ก @RequestMapping์ ์ถ๊ฐํด์ผ ํ๊ณ ์ด๋ฌํ ๋ถ๋ถ์ด ์๋นํ ๋นํจ์จ์ ์ด๋ผ๊ณ ๋๊ปด์ก๋ค. ๊ตฌ๊ธ ๊ฒ์์ ํตํด ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์์๋ค. Gateway์ Filter๋ฅผ ์ฌ์ฉํ์ฌ URI ๊ฒฝ๋ก๋ฅผ ์ฌ์์ฑํ์ฌ ์์ฒญ์ ๋ฐฑ์๋ ์๋น์ค๋ก ๋ผ์ฐํ ํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
โญAPI Gateway ๋ผ์ฐํ ํํฐ ์ค์ ์ ํด์ผ ํ๋ ์ด์ ?
ํด๋ผ์ด์ธํธ๊ฐ http://localhost:8000/user-service/์ผ๋ก ์์ฒญ์ ๋ณด๋์ ๋ http://localhost:8081/user-service/๋ก ํ๋ก์ํ๊ธฐ ์ํด์๋ user-service์ ๋ชจ๋ ์ปจํธ๋กค๋ฌ์@RequestMapping("/user-service")์ ์ถ๊ฐํด์ค์ผ ํ๋ ์ํฉ์ด ๋ฐ์ํ๋ค.
๊ทธ๋ฌ๋ ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ ๋ง์ ์์ ์ฝ๋๋ฅผ ์์ ํด์ผ ํ๊ณ , ์ ์ง๋ณด์์ ์ด๋ ค์์ ์ค ์ ์๋ค. ๋ํ, ์๋น์ค๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ๋๋ง๋ค ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ฏ๋ก ์ ์ฐ์ฑ์ด ๋จ์ด์ง๋ค.
๋ฐ๋ผ์, Gateway์ Filter๋ฅผ ์ฌ์ฉํ์ฌ URI ๊ฒฝ๋ก๋ฅผ ์ฌ์์ฑํ์ฌ ์์ฒญ์ ๋ฐฑ์๋ ์๋น์ค๋ก ๋ผ์ฐํ ํ ์ ์๋ค.
ํด๋ผ์ด์ธํธ๊ฐ http://localhost:8000/user-service/๋ก ์์ฒญ์ ๋ณด๋ด๋ฉด, Gateway์ Filter๊ฐ ์์ฒญ์ URI๋ฅผ ์์ ํ์ฌ http://localhost:8081๋ก ํ๋ก์ ํ๊ฒ ๋๋ค.
๋ค์ ๋งํด, ์๋์ ํํ๋ก ๋ผ์ฐํ ํ๋ ค๋ฉด Gateway์ Filter๋ฅผ ์ฌ์ฉํ์ฌ URI ๊ฒฝ๋ก๋ฅผ ์ฌ์์ฑํด์ผ ํ๋ค.
http://localhost:8000/user-service/name โก๏ธ http://localhost:8081/name
Spring Cloud Gateway Filter ์ ์ฉ ๋ฐฉ๋ฒ
Filter ๋ฅผ ์ ์ํ๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ 2๊ฐ์ง๊ฐ ์๋ค.
- yml ๋๋ properties ํ์ผ์ ์ ์ํ ์ ์๋ค.
- Java ์ฝ๋๋ก ์ ์ํ ์ ์๋ค.
๐ ํ์ฌ, ์ฐ๋ฆฌ๋ yml ํ์ผ์ ํตํด Spring Cloud Gateway Filter๋ฅผ ์ ์ํ ๊ฒ์ด๋ค.
์ฐ๋ฆฌ์ ์๋น์ค์๋ 3๊ฐ์ ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ์๋ค.
- user-service
- beverage-service
- community-service
2. application.yml๋ฅผ ํตํ ๊ฒฝ๋ก ์ค์
apigateway-service์ application.yml์ filters ์ถ๊ฐ
RewritePath ํํฐ๋ฅผ ์ฌ์ฉํ์ฌ, ๊ฒ์ดํธ์จ์ด๊ฐ ์์ฒญ์ ํ๋ก์ํ ๋ ๋ฐฑ์๋ ์๋น์ค๊ฐ ์๊ตฌํ๋ ๊ฒฝ๋ก๋ก ์์ฒญ์ ์ฌ์์ฑํ๋ค.
# apigateway-service: application.yml
spring:
application:
name: apigateway-service
cloud:
gateway:
routes:
- id: user-service
uri: http://localhost:8081
predicates:
- Path=/user-service/**
filters:
- RewritePath=/user-service/(?<segment>.*),/$\{segment} # ์ถ๊ฐ
- RewritePath ํํฐ๋ ์์ฒญ์ ๊ฒฝ๋ก๋ฅผ ์ฌ์์ฑํ๋ค.
- =/user-service/(?<segment>.*)๋ ์ ๊ท ํํ์์ ์ฌ์ฉํ์ฌ ๊ฒฝ๋ก๋ฅผ ๋ค์ ์ฐ๋ ํจํด์ ์ ์ํ๋ค.
- ์ฌ๊ธฐ์ /user-service/ ๋ค์์ ์ค๋ ๋ชจ๋ ๊ฒ์ ํฌํจํ๋ ๋ถ๋ถ์ ์บก์ฒํ์ฌ $\{segment}์ ํ ๋นํ๋ค.
- ์ด๊ฒ์ URI ๊ฒฝ๋ก์์ /user-service/ ๋ถ๋ถ์ ์บก์ฒํ์ง ์๊ณ ๊ทธ ๋ค์ ๋ชจ๋ ๊ฒ์ ์บก์ฒํ๋ค.
- /$\{segment}๋ ์ฌ์์ฑ๋ ๊ฒฝ๋ก๋ฅผ ๋ํ๋ธ๋ค.
- ${segment}๋ ์์ ์บก์ฒํ ์๋ก์ด ๊ฒฝ๋ก ์ธ๊ทธ๋จผํธ๋ฅผ ๋ํ๋ธ๋ค.
- ๋ฐ๋ผ์, ์ด ํํฐ๋ /user-service/ ๋ค์ ์ค๋ ๋ชจ๋ ๊ฒ์ ๋์ ์ฌ๋์๊ฐ ์๋ ๊ฒฝ๋ก๋ก ์ฌ์์ฑํ๋ค.
๋ค์ ๋งํด,
RewritePath ํํฐ๋ ์์ฒญ์ด ๊ฒ์ดํธ์จ์ด๋ฅผ ํต๊ณผํ ๋ /user-service/๋ก ์์ํ๋ ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ํด๋น ๊ฒฝ๋ก ๋ค์ ์ฌ๋์๊ฐ ์๋ ํํ๋ก ์ฌ์์ฑํ๋ค. ์๋ฅผ ๋ค์ด, /user- service/profile์ /profile๋ก ์ฌ์์ฑ๋๋ค.
์ด๋ฌํ ํํฐ๋ ๋ผ์ฐํฐ๊ฐ ๋ฐฑ์๋ ์๋น์ค์ ์ ๋ฌ๋๊ธฐ ์ ์ ์์ฒญ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์์ ํ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ์ ์ ์ฉํ๋ค.
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/**
filters:
- RewritePath=/user-service/(?<segment>.*),/$\{segment}
- id: beverage-service
uri: http://localhost:8082/
predicates:
- Path=/beverage-service/**
filters:
- RewritePath=/beverage-service/(?<segment>.*),/$\{segment}
- id: community-service
uri: http://localhost:8083/
predicates:
- Path=/community-service/**
filters:
- RewritePath=/community-service/(?<segment>.*),/$\{segment}
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@GetMapping("/")
public String getServiceName(){
return "user-service";
}
}
๊ฐ ๋ง์ดํฌ๋ก์๋น์ค ์๋ฒ ์คํ
http://localhost:8081/
http://localhost:8082/
http://localhost:8083/
apigateway-service ์๋ฒ ์คํ
http://localhost:8000/user-service/
http://localhost:8000/beverage-service/
http://localhost:8000/community-service/
๐ ์ ๋ฆฌํ์๋ฉด,
์ฒซ ๋ฒ์งธ "7. Spring Cloud Gateway๋ฅผ ํ์ฉํ ๊ฒฝ๋ก ์์ " ๋ฐฉ๋ฒ์ ์์ฒญ๋ ๊ฒฝ๋ก๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๊ทธ๋๋ก ์ ๋ฌํ๊ณ ,
๋ ๋ฒ์งธ "8. Spring Cloud Gateway์ ํํฐ ์ ์ฉํ๊ธฐ" ๋ฐฉ๋ฒ์ ์์ฒญ๋ ๊ฒฝ๋ก๋ฅผ ์์ ํ์ฌ ์๋ฒ๋ก ์ ๋ฌํ๋ค.
์ฐธ๊ณ ์๋ฃ
https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/
'Software Architecture > MSA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[MSA ๊ตฌ์ถํ๊ธฐ] 9. API Gateway์ Eureka ์๋ฒ ์ฐ๋ํ๊ธฐ (API Gateway) (0) | 2024.03.22 |
---|---|
[MSA] Spring Cloud Gateway Filter (API Gateway) (0) | 2024.03.21 |
[MSA ๊ตฌ์ถํ๊ธฐ] 7. Spring Cloud Gateway๋ฅผ ํ์ฉํ ๊ฒฝ๋ก ์์ (API Gateway) (0) | 2024.03.20 |
[MSA] API Gateway (0) | 2024.03.19 |
[MSA ๊ตฌ์ถํ๊ธฐ] 6. Spring Cloud Gateway ๋ผ์ฐํ ์ค์ ํ๊ธฐ (API Gateway) (0) | 2024.03.18 |