Spring Cloud Gateway
ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋ฐ์ ๋ด๋ถ ๋ง์ดํฌ๋ก์๋น์ค๋ก ์ ๋ฌํ๋ API Gateway
์ ์ฌ์ฉํ๋์ง
ํด๊ฒฐํ๋ ๋ฌธ์
ํต์ฌ ํน์ง
์์ฒญ URL ๊ธฐ์ค์ผ๋ก ์๋น์ค ๋ถ๊ธฐ ์ฒ๋ฆฌ
Client โ Gateway โ Service
์์ฒญ์ ์ด๋ค ์๋น์ค๋ก ๋ณด๋ผ์ง ๊ฒฐ์
Gateway์์ ์์ฒญ ์ /ํ ๋ก์ง ์ํ
์๋น์ค ์ด๋ฆ์ผ๋ก ํธ์ถ ๊ฐ๋ฅ
lb://PRODUCT-SERVICE
์ ์ฒด ํ๋ฆ
Client ์์ฒญ
โ Gateway ์์
โ Predicate ์กฐ๊ฑด ํ์ธ
โ Filter (์์ฒญ ์ ์คํ)
โ ์๋น์ค ํธ์ถ (Eureka ์กฐํ)
โ Filter (์๋ต ํ ์คํ)
โ Client ์๋ต
Microservices
spring:
cloud:
gateway:
routes:
- id: product-service
uri: lb://PRODUCT-SERVICE
predicates:
- Path=/products/**
- id: order-service
uri: lb://ORDER-SERVICE
predicates:
- Path=/orders/**
@Component
public class LoggingFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
System.out.println("Request URI: " + request.getURI());
return chain.filter(exchange)
.then(Mono.fromRunnable(() -> {
ServerHttpResponse response = exchange.getResponse();
System.out.println("Response Status: " + response.getStatusCode());
}));
}
@Override
public int getOrder() {
return -1;
}
}
์์
Client โ /products/1 ์์ฒญ
โ Gateway
โ product-service ํธ์ถ
โ ์๋ต ๋ฐํ
GET /products/1
โ Gateway
โ Predicate ๋งค์นญ (/products/**)
โ product-service๋ก ๋ผ์ฐํ
โ ์๋ต ๋ฐํ
์์ฒญ โ [Request Filter] โ Service โ [Response Filter] โ ์๋ต
ํํฐ๋ ๊ตฌ์กฐ๊ฐ ๋์ผํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋๋ก ๋ณต์ฌํด์ ์ฌ์ฉ ๊ฐ๋ฅ
์ฌ์ฉ ๋ฐฉ๋ฒ
์์ (์๋ต ๋ก๊น ๋ง ๋ณ๊ฒฝ)
@Component
public class ResponseLoggingFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return chain.filter(exchange)
.then(Mono.fromRunnable(() -> {
ServerHttpResponse response = exchange.getResponse();
System.out.println("Custom Response Log: " + response.getStatusCode());
}));
}
@Override
public int getOrder() {
return -2;
}
}
ํต์ฌ ์ ๋ฆฌ