필터 문서작업 완료

This commit is contained in:
roy-zz
2022-04-20 21:42:21 +09:00
parent 806b5f022e
commit e116dcedf0
3 changed files with 162 additions and 6 deletions

View File

@@ -315,6 +315,110 @@ c.r.s.gateway.filter.GlobalFilter : Global Filter End: response code -> 2
---
### Logging Filter
이번에는 Logging Filter를 만드는 방법에 대해서 다뤄본다.
Custom Filter와 거의 동일한 방식으로 진행되며 추가로 Filter가 적용되는 순서를 지정하는 방법에 대해서 알아본다.
1. Filter 역할을 하게 될 클래스 파일을 작성한다.
이전과 다르게 apply에서 반환하는 타입이 OrderedGatewayFilter로 구체화 되었다.
또한 파라미터로 Ordered.LOWEST_PRECEDENCE를 전달받아서 적용되어 있는 Filter 중 가장 낮은 우선권을 가지도록 구현하였다.
```java
@Slf4j
@Component
public class LoggingFilter extends AbstractGatewayFilterFactory<LoggingFilter.Config> {
public LoggingFilter() {
super(Config.class);
}
@Override
public GatewayFilter apply(LoggingFilter.Config config) {
return new OrderedGatewayFilter((exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
log.info("Logging filter message: {}", config.getMessage());
if (config.isShowPreLogger()) {
log.info("Logging filter pre process: request uri -> {}", request.getURI());
}
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
if (config.isShowPostLogger()) {
log.info("Logging filter post process: response code -> {}", response.getStatusCode());
}
}));
}, Ordered.LOWEST_PRECEDENCE);
}
@Data
public static class Config {
private String message;
private boolean showPreLogger;
private boolean showPostLogger;
}
}
```
2. application.yml 수정
filters 부분에 LoggingFilter가 추가되어 CustomFilter와 함께 총 두 개의 필터가 적용되었다.
```yaml
spring:
application:
name: gateway-service
cloud:
gateway:
default-filters:
- name: GlobalFilter
args:
message: Spring Cloud Gateway GlobalFilter Message
showPreLogger: true
showPostLogger: true
routes:
- id: test-server-1
uri: lb://TEST-SERVER-1
predicates:
- Path=/test-server-1/**
filters:
- name: CustomFilter
- name: LoggingFilter
args:
message: TEST-SERVER-1
showPreLogger: true
showPostLogger: true
- id: test-server-2
uri: lb://TEST-SERVER-2
predicates:
- Path=/test-server-2/**
filters:
- name: CustomFilter
- name: LoggingFilter
args:
message: TEST-SERVER-2
showPreLogger: true
showPostLogger: true
```
3. 정상작동 확인
Discovery, Gateway, test-server1, test-server2 모든 서비스를 실행시키고 브라우저에 아래의 주소를 입력하고 접속해본다.
- localhost:8000/test-server-1/custom-filter
- localhost:8000/test-server-2/custom-filter
출력되는 결과는 아래와 같다.
가장 낮은 우선순위를 가지고 있던 Logging Filter가 가장 늦게 출력된 것을 확인할 수 있다.
```bash
c.r.s.gateway.filter.GlobalFilter : Global Filter Message: Spring Cloud Gateway GlobalFilter Message
c.r.s.gateway.filter.GlobalFilter : Global Filter Start: request id -> 87b06d4e-1
c.r.s.gateway.filter.CustomFilter : Custom pre process filter: request uri -> 87b06d4e-1
c.r.s.gateway.filter.LoggingFilter : Logging filter message: TEST-SERVER-1
c.r.s.gateway.filter.LoggingFilter : Logging filter pre process: request uri -> http://localhost:8000/test-server-1/custom-filter
c.r.s.gateway.filter.LoggingFilter : Logging filter post process: response code -> 200 OK
c.r.s.gateway.filter.CustomFilter : Custom post process filter: response code -> 200 OK
c.r.s.gateway.filter.GlobalFilter : Global Filter End: response code -> 200 OK
```
---

View File

@@ -0,0 +1,46 @@
package com.roy.springcloud.gateway.filter;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.OrderedGatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.core.Ordered;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
@Slf4j
@Component
public class LoggingFilter extends AbstractGatewayFilterFactory<LoggingFilter.Config> {
public LoggingFilter() {
super(Config.class);
}
@Override
public GatewayFilter apply(LoggingFilter.Config config) {
return new OrderedGatewayFilter((exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
log.info("Logging filter message: {}", config.getMessage());
if (config.isShowPreLogger()) {
log.info("Logging filter pre process: request uri -> {}", request.getURI());
}
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
if (config.isShowPostLogger()) {
log.info("Logging filter post process: response code -> {}", response.getStatusCode());
}
}));
}, Ordered.LOWEST_PRECEDENCE);
}
@Data
public static class Config {
private String message;
private boolean showPreLogger;
private boolean showPostLogger;
}
}

View File

@@ -25,14 +25,20 @@ spring:
predicates:
- Path=/test-server-1/**
filters:
# - AddRequestHeader=test-server-1-request, test-server-1-request-header
# - AddResponseHeader=test-server-1-response, test-server-1-response-header
- CustomFilter
- name: CustomFilter
- name: LoggingFilter
args:
message: TEST-SERVER-1
showPreLogger: true
showPostLogger: true
- id: test-server-2
uri: lb://TEST-SERVER-2
predicates:
- Path=/test-server-2/**
filters:
# - AddRequestHeader=test-server-2-request, test-server-2-request-header
# - AddResponseHeader=test-server-2-response, test-server-2-response-header
- CustomFilter
- name: CustomFilter
- name: LoggingFilter
args:
message: TEST-SERVER-2
showPreLogger: true
showPostLogger: true