필터 문서작업 완료
This commit is contained in:
@@ -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
|
||||||
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -25,14 +25,20 @@ spring:
|
|||||||
predicates:
|
predicates:
|
||||||
- Path=/test-server-1/**
|
- Path=/test-server-1/**
|
||||||
filters:
|
filters:
|
||||||
# - AddRequestHeader=test-server-1-request, test-server-1-request-header
|
- name: CustomFilter
|
||||||
# - AddResponseHeader=test-server-1-response, test-server-1-response-header
|
- name: LoggingFilter
|
||||||
- CustomFilter
|
args:
|
||||||
|
message: TEST-SERVER-1
|
||||||
|
showPreLogger: true
|
||||||
|
showPostLogger: true
|
||||||
- id: test-server-2
|
- id: test-server-2
|
||||||
uri: lb://TEST-SERVER-2
|
uri: lb://TEST-SERVER-2
|
||||||
predicates:
|
predicates:
|
||||||
- Path=/test-server-2/**
|
- Path=/test-server-2/**
|
||||||
filters:
|
filters:
|
||||||
# - AddRequestHeader=test-server-2-request, test-server-2-request-header
|
- name: CustomFilter
|
||||||
# - AddResponseHeader=test-server-2-response, test-server-2-response-header
|
- name: LoggingFilter
|
||||||
- CustomFilter
|
args:
|
||||||
|
message: TEST-SERVER-2
|
||||||
|
showPreLogger: true
|
||||||
|
showPostLogger: true
|
||||||
Reference in New Issue
Block a user