반응형
Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Spring Cloud Gateway - Custom Filter 적용
CustomFilter.java 생성
@Component
@Slf4j
public class CustomFilter extends AbstractGatewayFilterFactory<CustomFilter.Config> {
public CustomFilter() {
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("Custom PRE filter : request id -> {}", request.getId());
// Custom Post Filter
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
log.info("Custom POST filter : response id -> {}", response.getStatusCode());
}));
};
}
public static class Config {
// Put the configuration properties
}
}
Mono 객체는 웹 플럭스라고 spring5에서 추가된 기능이다. 웹 서버 동기 방식이 아닌 비동기 방식에서 단일 값을 전달하기 위해 사용한다.
application.yml 필터 추가
filters:
# - AddRequestHeader=first-request, first-request-header2
# - AddResponseHeader=first-response, first-response-header2
- CustomFilter
// ....생략
filters:
# - AddRequestHeader=second-request, second-request-header2
# - AddResponseHeader=second-response, second-response-header2
- CustomFilter
기존에 적용했던 필터들을 주석처리 후 CustomFilter를 적용한다.
서버 종료 후 재시작한다.
check 메서드 추가
first-service의 FirstServiceController.java
@GetMapping("/check")
public String check() {
return "Hi, there. This is a message from first Service";
}
second-service의 SecondServiceController.java
@GetMapping("/check")
public String check() {
return "Hi, there. This is a message from second Service";
}
각 서버를 재시작한다.
크롬에서 확인한다.
apigateway-service 콘솔에 보면 filter가 잘 적용되어있는 걸 확인할 수 있다.
Spring Cloud Gateway - Global Filter
Custom Filter와 만드는 방식은 비슷하다. Custom Filter와의 차이점은 어떠한 Route 정보가 실행되더라도 공통적으로 적용할 수 있는 필터라는 점이다.
GlobalFilter는 어떤 Filter보다 먼저 실행되고, 또 제일 마지막에 실행된다. GlobalFilter와 CustomFilter 두 개 사용 시
- GlobalFilter PRE
- CustomFilter PRE
- CustomFilter POST
- GlobalFilter POST
순으로 로그가 출력 될 것이다.
GlobalFilter.java 생성
@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;
}
}
application.yml 설정
spring:
cloud:
gateway:
default-filters:
- name : GlobalFilter
args :
baseMessage : Spring Cloud Gateway Global Filter
preLogger : true
postLogger : true
위와 같은 설정 정보는 수정할 때마다 서비스를 재실행해야하는 부담이 있다. 만약 배포되고 있는 서비스라면 과정은 더 번거로울 것이다. 그래서 많은 MSA 환경에서는 이러한 설정 정보를 외부에 따로 분리해두어 서비스를 재실행, 재배포하지 않도록 한다. (추후 더 설명)
서버 재실행 후 크롬에서 확인
apigateway-service 프로젝트 콘솔 확인
- 출처 : 인프런 Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) 강의
반응형