728x90
GateWayFilter
실제 GateWayFilter는 직접 생성할 수 없고 구현한 OrderedGatewayFilter로 생성할 수 있다.
요청 -> globalFilter -> CustomFilter -> logginFilter -> MicroService
LogginFilter
@Component
@Slf4j
public class LoggingFilter extends AbstractGatewayFilterFactory<LoggingFilter.Config> {
public LoggingFilter(){
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
GatewayFilter filter = new OrderedGatewayFilter((exchange, chain)->{
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
log.info("Logging PRE Filter baseMessage: {}", config.getBaseMessage());
if(config.isPreLogger()){
log.info("Logging Filter Start: request id -> {}", request.getId());
}
//Logging Post Filter
return chain.filter(exchange).then(Mono.fromRunnable(()-> {
if (config.isPostLogger()) {
log.info("Logging Filter End: response id -> {}", response.getStatusCode());
}
}));
}, Ordered.LOWEST_PRECEDENCE); //순서를 입력 받는다.
return filter;
}
@Data
public static class Config{
//Configure 정보를 입력한다.
private String baseMessage;
private boolean preLogger;
private boolean postLogger;
}
}
- 두 번째 파라미터로 입력받는 우선순위에 따라 필터 적용 순서를 지정할 수 있다.
- Ordered.HIGHEST_PRECEDENCE : 가장 높은 우선 순위
- Ordered.LOWEST_PRECEDENCE : 가장 낮은 우선 순위
OrderedGatewayFilter

- 생성자로, GateWayFilter와, order를 받는다.
- filter 메서드로 해당 Filter가 해야 될 동작을 정의를 할 수 있다.

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
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
- id: second-service
uri: http://localhost:8082/
predicates:
- Path=/second-service/** #해당 정보 모두가 URI 뒤에 붇게 된다. http://localhost:8082/second-service/**
filters:
# - AddRequestHeader= second-request, second-request-header2
# - AddResponseHeader= second-response, second-response-header2
- name: CustomFilter
- name: LoggingFilter
args:
baseMessage: Hi, there
preLogger: true
postLogger: true
- firstService는 CustomFilter만 가지고 있다.
- secondService는 CustomFilter, LogFilter 두 개다 가지고 있다
- name 속성을 이용해서 구분한다.
- args 옵션을 통해 값을 전달해 준다.
728x90
'Spring Cloud로 개발하는 MSA > API Gateway Service' 카테고리의 다른 글
| Spring Cloud Gateway - Load Balancer (0) | 2022.05.03 |
|---|---|
| Spring Cloud Gateway - Global Filter (0) | 2022.05.03 |
| Spring Cloud Gateway - Custom Filter 적용 (0) | 2022.05.03 |
| Spring Cloud Gateway - Filter 적용 (0) | 2022.05.03 |
| Spring Cloud Gateway - 프로젝트 생성 (0) | 2022.05.03 |