-
스프링 클라우드 게이트웨이 글로벌 필터와 지역 필터스프링/스프링 클라우드 MSA 2024. 8. 5. 16:40
MSA 환경에서 각각의 마이크로 서비스로 요청을 하기 전에 jwt 검증, IP에 대한 접근 권한 등을 해야 하기에 필터를 적용해야 한다.
order라고 필터의 숫자가 있는데, 숫자가 작을 수록 가장 먼저 필터가 수행된다.
- 글로벌 필터 - 모든 서비스를 거치기 전에 거치는 필터
- 지역 필터 - 특정 마이크로 서비스 라우팅에 대해서만 동작하는 필터
1. 글로벌 필터 - 모든 서비스를 거치기 전에 거치는 필터
@Component public class G1Filter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { System.out.println("pre global filter order -1"); // 마이크로 서비스를 거치기 전의 pre filter return chain.filter(exchange) .then(Mono.fromRunnable(() -> { System.out.println("post global filter order -1"); // 마이크로 서비스를 거치고 난 후의 post filter })); } @Override public int getOrder() { return -1; } }
위와 같은 코드가 글로벌 필터이다. @Component 어노테이션으로 필터로 지정하고, 이미 구현된 GlobalFilter, Ordered를 상속받아서 구현한다.
그리고 filter와 getOrder를 오버라이딩 해준다.
filter 함수를 보면 return 이전의 코드들은 마이크로 서비스에 접근하기 전에 수행되는 pre filter이며, return 이후의 코드들은 마이크로 서비스를 거치고 난 후에 실행되는 post filter이다.
getOrder 함수는 필터의 순서 값을 return 해주는 함수이다.
맨 위의 사진에서 보면 pre filter는 숫자가 낮은 필터부터 실행되지만, post filter는 마이크로 서비스를 거치고 난 이후기에 숫자가 큰 것부터 실행된다.
-2의 pre filter -> -1의 pre filter -> -1의 post filter -> -2의 post filter 순으로 실행된다.
server.port=8080 spring.application.name=SCG-2 spring.cloud.gateway.routes[0].id=ms1 spring.cloud.gateway.routes[0].predicates[0].name=Path spring.cloud.gateway.routes[0].predicates[0].args.pattern=/ms1/** spring.cloud.gateway.routes[0].uri=http://localhost:8081
application.properties에 위와 같이 8081 포트에 라우팅 해주고 8081/ms1/fisrt로 요청을 보내면 아래와 같이 나온다.
예상했던 것과 정확히 같은 순서로 동작한다.
2. 지역 필터 - 특정 마이크로 서비스 라우팅에 대해서만 동작하는 필터
@Component public class L1Filter extends AbstractGatewayFilterFactory<L1Filter.Config> { public L1Filter() { super(Config.class); } @Override public GatewayFilter apply(Config config) { return (exchange, chain) -> { if (config.isPre()) { System.out.println("pre local filter 1"); } return chain.filter(exchange) .then(Mono.fromRunnable(() -> { if (config.isPost()) { System.out.println("post local filter 1"); } })); }; } @NoArgsConstructor @AllArgsConstructor @Data public static class Config { private boolean pre; private boolean post; } }
위의 코드가 지역 필터의 코드이다.
생성자를 super 클래스로 만들어주고, apply 메서들을 오버라이딩 시켜준다.
이 때, return이 2번 등장하는데, 첫 번째 return은 pre filter의 부분이고, 두 번째 return은 post filter의 부분이다.
Config 클래스를 통해 변수 값 또한 받을 수 있다. 이 때는 lombok을 사용해서 받아줬다.
application.properties
server.port=8080 spring.application.name=SCG-2 spring.cloud.gateway.routes[0].id=ms1 spring.cloud.gateway.routes[0].predicates[0].name=Path spring.cloud.gateway.routes[0].predicates[0].args.pattern=/ms1/** spring.cloud.gateway.routes[0].uri=http://localhost:8081 # 지역 필터 관련 설정 spring.cloud.gateway.routes[0].filters[0].name=L1Filter spring.cloud.gateway.routes[0].filters[0].args.pre=true spring.cloud.gateway.routes[0].filters[0].args.post=true
지역 필터는 라우터에 대해 여러개의 필터를 등록할 수 있기에 index를 붙여주고, 위와 같이 설정을 추가해준다.
그리고 args를 통해 pre와 post를 true로 넣어줬다.
각 로직에서 true일 때만 로그를 찍기 때문에 이러한 변수를 설정해준 것이다.
위에서 작성한 글로벌 필터를 포함해서 로그가 총 6개가 찍힌 것을 확인할 수 있다.
application.properties의 변수를 false로 설정하면, 해당하는 필터는 로그를 찍지 않는다.
지금까지 스프링 클라우드 MSA를 공부해봤는데, 어려우면서도 재밌는 개념이라 공부를 하는데 즐겁게 할 수 있었다.
스프링 클라우드와 MSA의 개념은 매우 중요하고 많이 쓰이는 개념이기 때문에 앞으로도 잘 공부해야겠다는 생각이 들었다.
'스프링 > 스프링 클라우드 MSA' 카테고리의 다른 글
SCG 라우팅 추가와 삭제 (0) 2024.08.05 SCG - Eureka 연동 및 로드밸런싱 (0) 2024.08.05 스프링 클라우드 게이트웨이(SCG) (0) 2024.08.05 Eureka Client 등록 설정 (0) 2024.08.05 Eureka 서버 구축 (0) 2024.08.05