1. Spring Cloud Gateway란
게이트웨이는 클라이언트의 요청을 앞단에서 우선으로 받아 API 라우팅, 인증 및 권한 부여, 로드밸런싱, 로깅 등의 역할을 수행합니다. 스프링 클라우드 게이트웨이도 게이트웨이의 한 종류이며 비동기식 처리에 특화되어 있습니다. 일반적으로 MSA를 구축할 때 사용하며 클라이언트의 요청을 스프링 클라우드 게이트웨이가 받은 후 service-discovery로부터 적절한 마이크로 서비스를 검색하여 해당 마이크로 서비스로 요청을 위임하게 됩니다.
2. 게이트웨이 설정
Route
라우트는 마이크로 서비스의 고유한 값인 id, 요청할 uri, predicate와 filter로 구성되어 있습니다. 클라이언트가 요청한 uri가 predicate와 일치한다면 해당 uri의 경로로 요청을 위임합니다. 아래 예제에서는 유레카(service discovery)에 등록된 서비스에 이름으로 경로를 지정하고 있습니다.
spring:
application:
name: apigateway-service
cloud:
gateway:
default-filters:
- name: GlobalFilter
args:
baseMessage: Spring Cloud Gateway Global Filter
preLogger: true
postLogger: true
routes:
- id: user-service
uri: lb://USER-SERVICE
predicates:
- Path=/user-service/**
- id: catalog-service
uri: lb://CATALOG-SERVICE
predicates:
- Path=/catalog-service/**
- id: order-service
uri: lb://ORDER-SERVICE
predicates:
- Path=/order-service/**
- id: first-service
uri: lb://MY-FIRST-SERVICE
predicates:
- Path=/first-service/**
filters:
- CustomFilter
Filter
- gateway로 들어오는 요청에 대해 선처리 또는 후처리를 할 수 있습니다. 이렇게 만들어진 필터는 전역적으로 적용하거나 또는 서비스 별로 적용할 수 있습니다.
@Component
@Slf4j
public class GlobalFilter extends AbstractGatewayFilterFactory<GlobalFilter.Config> {
public GlobalFilter() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
// Custom Pre Filter
return (exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
log.info("Global Filter baseMessage: {}", config.getBaseMessage());
if (config.isPreLogger()) {
log.info("Global Filter Start: request id -> {}", request.getId());
}
// Custom Post Filter
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
if (config.isPostLogger()) {
log.info("Global Filter End: response code -> {}", response.getStatusCode());
}
}));
};
}
@Data
public static class Config {
private String baseMessage;
private boolean preLogger;
private boolean postLogger;
}
}
'Spring > 스프링 클라우드' 카테고리의 다른 글
[Spring Cloud] Service Discovery (0) | 2023.05.09 |
---|