Custom Filter
Locale: 사용자 인터페이스에서 사용되는 언어, 지역 설정, 출력 형식 등을 정의하는 문자열
1) pom.xml 수정
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
2) CustomFilter.java 추가
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) {
//Custom 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: request id -> {}", response.getStatusCode());
}));
};
}
public static class Config {
//Put the configuration properties for your filter here
}
}
✅ 참고
1) ServerHttpRequest, ServerHttpResponse는 reactive를 import 해야 함.
2) 동기/비동기 방식에 따라 Request/Response가 달라짐
- 동기: ServletRequest, ServletResponse
- 비동기: ServerHttpRequest, ServerHttpResponse
3) Webflux 사용
- Spring 5에 추가된 Reactive-stack의 웹 프레임워크
- 반환값으로 Mono 데이터 사용
💡 코드 설명
AbstractGatewayFilterFactory<CustomFilter.Config>
- Spring Cloud Gateway에서 사용되는 필터를 생성하는 추상 클래스
- GatewayFilter는 Spring Cloud에서 사용하는 필터로 헤더 정보를 처리하거나 요청 및 응답을 변경하는 역할을 수행
(🔗 출처: [SpringBoot] 의존성 주입과 Profile로 Filter 설정 동적 변경하기)
Filter- Pre Filer
exchange: Request와 Response 값을 얻기 위해 사용- Post Filter
Pre Filter의 반환값인 chain을 사용하여 Post Filter 적용
* Mono란?
- 비동기 방식 서버에서 사용
- WebFlux에서 사용
- 단일값을 전달하고자 할 때 사용
3) application.yml 수정
spring:
application:
name: apigateway-service
cloud:
gateway:
routes:
- id: first-service
uri: http://localhost:8081/
predicates:
- Path=/first-service/**
filters:
- CustomFilter
# - AddRequestHeader=first-request,first-request-header2
# - AddResponseHeader=first-response,first-response-header2
- id: second-service
uri: http://localhost:8082/
predicates:
- Path=/second-service/**
filters:
- CustomFilter
# - AddRequestHeader=second-request,second-request-header2
# - AddResponseHeader=second-response,second-response-header2
server:
port: 8000
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://localhost:8761/eureka
✅ 주의
application.yml 파일 수정 시 참고
🙆♀️ spring.cloud.gateway.routes
🙅 ♀️spring.cloud.gateway.mvc.routes
💡 참고사항
spring-boot-starter-web 등의 MVC 기반 라이브러리는 같이 사용하면 안됨
➡ spring-cloud-starter-gateway는 Webflux 기반이기 때문에 SpringMVC기반의 라이브러리와 함께 쓸 경우, "Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway." 메세지가 발생
(🔗 출처: Spring Cloud - Netflix Eureka, Spring Gateway)
4) 기존 서비스에 새로운 엔드 포인트 메서드 추가
@GetMapping("/check")
public String check() {
return "Hi, there. This is a message from First Service";
}
@GetMapping("/check")
public String check() {
return "Hi, there. This is a message from Second Service";
}
POSTMAN


브라우저

로그
