2022. 7. 15. 15:39ㆍSoftware Architecture/MSA
++) 해당 포스팅은 이전 과정에서 진행했던 프로젝트를 사용하므로 이전 포스팅을 참고해야 합니다!
https://born2bedeveloper.tistory.com/56
저번 포스팅에서 언급했던 대로 이번에는 사용자 정의 필터를 만들어 볼 예정이다.
CustomFilter 생성
기존 apigateway 프로젝트에 filter패키지를 추가하고 그 안에 CustomFilter 클래스를 아래와 같이 생성하자.
package com.example.apigatewayservice.filter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
@Component
@Slf4j
public class CustomFIlter extends AbstractGatewayFilterFactory<CustomFIlter.Config> {
public CustomFIlter() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
// Coustom 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());
}));
};
}
// Mono : 이 객체는 웹 플럭스라고 해서 spring 5에서 추가된 기능, 비동기 방식의 서버 지원 (단일값으로)
public static class Config{
// Put the configuration properties
}
}
그 후 설정파일에 우리가 만든 filter를 등록해야한다.
Custom Filter 등록
++) CustimFilter과 - 사이에 스페이스 한 칸을 띄워야 함! (오타 주의)
이전에 설정한 필터는 주석처리하고, 내가 만든 CustomFilter를 등록하자.
그 다음 first, second 서비스에 customfilter를 통해 반환시켜줄 메소드를 새로 만들자!
각각의 컨트롤러에 추가해주자.
POSTMAN을 통한 확인
이제 우리가 설정해둔 컨트롤러를 호출해보도록 하자!
CustomFilter가 잘 적용된 것을 알 수 있다. 또한 PreCustomFilter와 PostCustomFilter에 추가한 log 출력 정보도 확인할 수 있다.
필자가 설정해둔 로그가 제대로 출력되고 있음을 확인할 수 있다!
second-service도 확인해보자
이렇듯 우리가 직접 CustomFilter를 등록하여 사전에 할 작업, 사후에 할 작업 (pre, post filter)에 대해 직접 정의내릴 수 있었다.
구현할 때에는 AbstractGatewayFilterFactory를 상속받아야 하고, 구현할 메소드는 apply이며 안에 pre 및 post filter를 정의해주면 된다. 지금은 간단한 출력 문장만 넣어놨지만 이후 로그인 관련 서비스를 구현할 때, 사용자 로그인을 이 필터에서 추가할 수 있다.
Filter의 종류는 Global , Logging등 다양하다.
https://cloud.spring.io/spring-cloud-gateway/reference/html/#global-filters
공식문서에도 자세히 나와있으니 따로 포스팅을 작성하진 않겠다.
기회가 된다면 여러분들은 따로 다뤄보는 것을 추천하겠다!
[참고 레퍼런스]
'Software Architecture > MSA' 카테고리의 다른 글
[MSA] Spring Cloud Config - (5) (0) | 2022.07.20 |
---|---|
[MSA] Spring Cloud Gateway (4) - Load Balancer (3) | 2022.07.18 |
[MSA] API Gateway Service - (4) (2) | 2022.07.15 |
[MSA] Spring Cloud Gateway (2) - Filter (0) | 2022.07.15 |
[MSA] Spring Cloud Gateway (1) - 프로젝트 생성 (0) | 2022.07.14 |