[Spring Cloud로 개발하는 마이크로서비스 애플리케이션]-API GATEWAY(Filter)

Sungjin·2021년 6월 22일
0
post-thumbnail

https://velog.io/@sungjin0757/Spring-Cloud%EB%A1%9C-%EA%B0%9C%EB%B0%9C%ED%95%98%EB%8A%94-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-API-GATEWAYRoutes
이전 시간에 만들었던 Project를 추가로 개발 하겠습니다.

Spring Cloud Gateway Filter란??

Client가 Spring Cloud Gateway로 요청을 하게 되면 Gateway는 해당하는 서비스로 요청을 분기 하여줌. Gateway안에서 Gateway Hnadler Mapping으로 어떤 요청이 들어왔는지 요청 정보를 받고 요청에 대한 사전 조건으로 인하여 설정 정보의 predicate영역에서 분기 시켜주는 것!
Gateway는 요청을 분기 시켜주기 전 과 서비스에게 요청에 대한 응답을 받은 후에 각각 Filter 처리를 해 줄 수 있습니다. 이를 pre filter 와 post filter라고 합니다!

  • 동작 방식
    1. Client Request
    2. Gateway Handler (진입점)
    3. predicate 영역에서의 분기
    4. pre-filter 처리
    5. 서비스에서의 요청 처리
    6. post-filter
    7. Gateway Handler
    8. Client

Test 방식

  • Custom Filter 개발
  • Global Filter 개발
  • Logging Filter 개발
  • gateway-service 설정 정보 (first-service는 이전 정보 그대로 사용)
  • pre-filter로는 requestId를 post-filter로는 response Status를 로깅할 것

Custom Filter

  • gateway-service

  • Bean으로 등록 필요
  • AbstractGatewayFilterFactory를 상속 받음. apply메소드를 override함으로 gatewayfilter를 반환 시킴
  • (exchange,chain)형태로 반환

    exchange로 request 및 response를 가져올 수 있고 동기 방식인 Tomcat이 아닌 비동기 방식인 Netty를 사용하고 있기 때문에 서블릿이 아닌 serverHttpRequest와 serverHttpResponse를 사용. 사전 처리가 끝나게 되면 chain을 이용하여 post filter를 추가할 수 있음.

  • 여기서 Mono란??

    Servlet이 아닌 WebFlux기법
    webflux에서도 Mono와 Flux로 나뉘게 됨. 비동기 방식을 활용하기위해 servlet을 활용하지 않음

    • Mono는 0~1개의 결과만을 처리하기 위한 Reactor 객체
      • 보통 여러 스트림을 하나의 결과로 모아줄 때 사용
    • Flux는 0~N개의 결과물을 처리하기 위한 Reactor 객체
      • 각각의 Mono를 합쳐서 여러개의 값을 처리할 때 사용
    • 의문점-굳이 그럼 Mono를 쓰는 이유??
      • 자바에서의 메소드에서 결과값이 하나면 List를 반환하지 않고 하나의 데이터만 반환하는 것 처럼 비슷한 이유! 시스템에서의 Multi Result가 아닌 하나의 결과셋만 있는 경우가 있기 때문에 Mono도 활용

Global Filter

  • 공통적으로 실행 될 수 있는 filter
  • 위의 Custom filter는 개별적으로 서비스마다 등록을 시켜야함
  • gateway-service
  • config라는 클래스에 configuration의 정보를 담을 수 있음. configuration의 정보는 위의 gateway-service에서의 환경설정을 참조함. 즉, baseMessage는 Spring Cloud Gateway Filter, preLogger와 postLogger는 Boolean타입이므로 true가 됨.

Logging Filter

  • gateway-service
  • Logging Filter 의 우선순위를 정해주고 있음

Test 결과

  • first-service에게 요청을 보낼 것임.
  • 성공적으로 구현된 Filter들의 실행 순서
    1. Client Request
    2. Gateway Handler
    3. pre-filter 처리(Global Filter -> Custom Filter -> Logging Filter 순으로 처리)
    4. Request 실행
    5. post-filter 처리(Logging Filter -> Custom Filter -> Global Filter 순으로 처리)
    6. Gateway Handler
    7. Client
  • 실행 결과
    • first-service에 요청을 보낸 모습
    • filter 처리 결과
    • 예상된 순서로 Filter가 처리 되는 것을 확인!

이렇게 해서 3편에 걸쳐 API GATEWAY의 이론 부터 Routes,Filter 까지 살펴 보았습니다. 블로그 포스팅을 마치겠습니다. 감사합니다 :)


이 글은 인프런 이도원님의 'Spring Cloud로 개발하는 마이크로서비스 애플리케이션'을 수강하고 작성합니다.
출처:https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard

profile
WEB STUDY & etc.. HELLO!

0개의 댓글