Software Architecture/MSA

[MSA] Spring Cloud Gateway (2) - Filter

jimkwon 2022. 7. 15. 09:49
반응형

이전 포스팅 참고

 

API Gateway는 클라이언트와 서비스 사이의 통신을 담당하며 단일 진입점을 통해 일괄적으로 요청을 처리할 수 있다.

Spring Cloud Gateway는 현재 스프링 클라우드에서 제시한 API Gateway 라이브러리이며, 비동기 방식을 지원한다.

 

이전에 간단한 프로젝트를 통해 Gateway를 사용해봤으니 이제 필터에 대한 실습을 진행해보자.

 

 Spring Cloud Gateway - Filter

 

스프링 클라우드 게이트웨이의 필터는 이렇게 구성되어있다.

  • Gateway Handler Mapping
    • 클라이언트로부터 어떤 요청이 들어왔는지 요청 정보를 받는 곳
  • Predicate
    • 그 요청에 대한 사전 조건, 즉 어떤 이름으로 요청됐는지 조건을 분기해줌
  • Filter
    • 사전, 사후 필터로 나뉨 (PreFilter & PostFilter)
    • 요청 정보가 PreFilter를 통해 어떤 프로세스의 정보를 처리한다
    • 다시 PostFilter를 통해 원래 있었던 클라이언트에게 돌려주게 된다.

 

백문이 불여일견! 직접 프로젝트를 통해 진행 과정을 살펴보자.

Filter 구현은 자바코드 & yml 파일 두 가지 방식 모두 진행해볼 것이다.

 

 

 

 Java Code로 구현하는 Filter

 

이전 포스팅에서 다루던 프로젝트에서 그대로 진행할 예정이다.

 

https://born2bedeveloper.tistory.com/55

 

[MSA] Spring Cloud Gateway (1) - 프로젝트 생성

https://born2bedeveloper.tistory.com/57 [MSA] API Gateway Service - (4) 이전 포스팅 링크 (Service Discovery) 이전에는 Service Mesh 부분의 Service Discovery를 다뤘다. 이번엔 API Gateway에 대해 다뤄보..

born2bedeveloper.tistory.com

 

이제 apigatewayservice 프로젝트의 설정파일에서 이전에 만들었던 yml 설정파일을 주석처리한다.

필터 처리를 자바 코드에서 하기 위함!

 

 

그 다음, config 패키지를 생성하여 그 안에 FilterConfig 클래스를 생성하자.

 

코드를 간단하게 살펴보면

  • .route -> 라우터를 등록한다. 패턴은 "first-service/" 경로로 들어오는 모든 것
  • .uri -> 해당 경로로 들어오면 url ("http://localhost:8081")로 이동한다.
  • .filters ->  request 필터 (first-request) 및 response 필터 (response-filter)를 설정한다.

즉,

  1. 사용자로부터 /first-service/... 라는 요청이 들어온다.
  2. uri로 이동하기 전 중간에 request필터와 response필터에 각각 인자로 들어간 값을 추가한다.

 

second-service 설정도 마저 등록하자.

 

application.yml파일에서 할 동작을 자바 코드로 구현한 모습이다.

 

그 후, first-service 프로젝트로 이동하여 controller에 메소드를 새로 추가해주자.

이전에 yml파일에서 설정해준것과 다른 한가지는 @RequestHeader부분이다.

자바 코드로 FilterConfig 파일에서 RequestFilter를 구현해두었기 때문에 우리가 설정한 headerName으로 받아오면 클라이언트에서 요청한 정보의 헤더값이 넘어오게 된다.

이 곳의 이름과 매핑시켜주면 된다.

second-service의 컨트롤러에서 메소드를 구현해놓자.

롬복에서 쓰이는 @Slf4J 어노테이션을 활용해서 각 서비스의 message 메소드가 호출 되었을 때, 필터를 통해 들어온 header값에 무엇이 들어있을 지 로그를 출력하는 코드를 넣어보았다.

 

새로 추가된 함수를 확인해봐야겠지? first, second 프로젝트를 실행해보자.

(물론 apigatewayservice 프로젝트도 실행해야한다!)

 

 

포트번호 8000번 sevice에서 해당 url로 요청했을 때, 각 8001, 8002에 있는 service 내 컨트롤러까지 요청이 잘 전달된 것을 볼 수 있다! 야호!

 

그리고 우리가 컨트롤러에서 설정해둔 로그가 어떻게 출력되었는지 냉큼 확인해보자!

각 프로젝트 내의 로그 기록을 보니 무사히 request header값이 잘 출력되어있음을 확인할 수 있다!

그럼 필터에서 설정해둔 response header값은 어떻게 확인할까? 인터넷 창으로 이동해보자!

크롬 (권장함) 에서 개발자 도구를 켜보자! 윈도우는 f12, 맥은 option + command + I를 누르면 된다.

 

 

 개발자 도구의 Network탭을 누른 후 새로고침하자. 그럼 우리가 요청한 message에 대한 정보가 뜬다! 클릭해보자.

 

우리가 부여했던 response의 값을 확인할 수 있다!

 

 설정파일(.yml)로 구현하는 Filter

 

이제 작성했던 FilterConfig 자바 파일을 지우거나, @Configuration 어노테이션을 주석처리해두자.

 

그 후 yml파일의 주석을 해제하고 filter 부분을 추가해주자.

각 필터는 키, value값으로 나눠져 있으며 이번엔 구분을 위해 value값에 yml을 붙여보았다.

 

이번에는 웹페이지에 직접 구동해보지 않고 PostMan을 써볼까 한다!

(사용법을 모르거나 귀찮으신 분들은 위의 실행 처럼 크롬에서 직접 확인하면 된다.)

 

https://www.postman.com/downloads/

 

Download Postman | Get Started for Free

Try Postman for free! Join 20 million developers who rely on Postman, the collaboration platform for API development. Create better APIs—faster.

www.postman.com

 

GET방식으로 요청을 보냈더니 Controller에서 써놓은 문장이 잘 뜨는 것을 확인할 수 있다!

 

Response도 확인해보자!

Headers 탭에 보면 내가 Filter에 등록한 key, value값이 잘 설정되어있음을 확인할 수 있다!

 

 

다음 게시글에서는 로그 출력, 인증 처리등을 자유롭게 사용자 정의 필터로 등록하는 과정을 진행해보겠다!

 

 

[참고 레퍼런스]

 

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

 

Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) - 인프런 | 강의

Spring framework의 Spring Cloud 제품군을 이용하여 마이크로서비스 애플리케이션을 개발해 보는 과정입니다. Cloud Native Application으로써의 Spring Cloud를 어떻게 사용하는지, 구성을 어떻게 하는지에 대해

www.inflearn.com