728x90
Spring Cloud Filter - Global Filter
차이점
CustomFilter : Route마다 지정해줘야 한다.
Global Filter
- 공통 필터
- 어떤 Filter보다 먼저 실행되고, 제일 마지막에 종료된다.
- GlobalFilter PRE
- CustomFilter PRE
- CustomFilter POST
- GlobalFilter POST
순으로 로그가 출력 될 것이다.
Global Filter
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(); // exchange로부터 request, response 값을 얻는다
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
// post filter를 적용하기 위해서 반환시켜주는 chain에 연결시켜서
return chain.filter(exchange).then(Mono.fromRunnable(() -> { // Mono : spring5에서 추가되었음
if(config.isPostLogger()) {
log.info("Global Filter END: response code -> {}", response.getStatusCode());
}
}));
});
}
@Data
public static class Config {
// put the configuration properties
private String baseMessage;
private boolean preLogger;
private boolean postLogger;
}
}
application.yml
spring:
application:
name: apigateway-service
cloud:
gateway:
default-filters:
- name: GlobalFilter #GlobalFilter클래스 이름
args:
baseMessage: Spring Cloud Gateway Global Filter
preLogger: true
postLogger: true
application.yml 전체 코드보기
더보기
server:
port: 8000
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http;//localhost:8761/eureka
spring:
application:
name: apigateway-service
cloud:
gateway:
default-filters: // ✔ 여기추가!
- name: GlobalFilter #GlobalFilter클래스 이름
args:
baseMessage: Spring Cloud Gateway Global Filter
preLogger: true
postLogger: true
routes:
- id: first-service
uri: http://localhost:8081/
predicates:
- Path=/first-service/**
filters:
# - AddRequestHeader=first-request, first-request-header2
# - AddResponseHeader=first-response, first-response-header2
- CustomFilter # ✔ CustomFilter는 Route마다 지정해줘야 한다.
- id: second-service
uri: http://localhost:8082/
predicates:
- Path=/second-service/**
filters:
# - AddRequestHeader=second-request, second-request-header2
# - AddResponseHeader=second-response, second-response-header2
- CustomFilter # ✔ CustomFilter는 Route마다 지정해줘야 한다.
위와 같은 application.yml 설정 정보는 마이크로 서비스 내장 데이터이기 때문에
수정할 때마다 서비스를 재실행해야 하는 부담이 있다.
만약 배포되고 있는 서비스라면 변경하기 위해서는 값을 바꾼 다음 다시 빌드하고 다시 패키징해서 다시 배포해야 한다.
그래서 많은 MSA 환경에서는 이러한 설정 정보를 외부에 따로 분리해두어 서비스를 재실행, 재배포하지 않도록 한다. (추후 설명)
서버 재실행 후 확인
apigateway-service 콘솔을 확인해보면 Global Filter먼저 실행됐다는 걸 알 수 있다.