[MSA] Custom Filter

jineey·2024년 11월 1일

MSA

목록 보기
3/36

API Gateway

Custom Filter

📌 Custom Filter란?

  • 사용자 정의 필터
  • 로그, 로케일(Locale) 등을 수정 가능

    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) 기존 서비스에 새로운 엔드 포인트 메서드 추가

  • firstServiceController.java 수정
@GetMapping("/check")
    public String check() {
        return "Hi, there. This is a message from First Service";
    }
  • secondServiceController.java 수정
@GetMapping("/check")
    public String check() {
        return "Hi, there. This is a message from Second Service";
    }

📌 실행결과

  • POSTMAN

  • 브라우저

  • 로그

profile
새싹 개발자

0개의 댓글