티스토리 뷰

OpenSource

Deep Dive! Zuul

Jinhyy 2020. 8. 7. 10:08

[ Zuul 개요 ]

RequestContext holds Request, response, state information and data for ZuulFilters to access and share.

The requestContext lives for the duration of the request and is ThreadLocal.

- ZuulFilter는 Pre -> Route -> Post 필터 순서로 Thread가 진행되는데 이때 쓰레드 안에 Local Storage 이용하여 필요한 데이터를 쉽게 전파하기 위하여 RequestContext 구현체를 사용한다.

 

extensions of RequestContext can be substituted by setting the contextClass.

- threadLocal은 현재 contextClass 라는 이름으로 전파하고 있고, 해당 클래스를 상속하는 클래스를 사용하여 전파하려는 데이터를 확장할 수 있다.

 

ReqeustContext is an extension of a ConcurrentHashMap.

- Why ConcurrentHashMap? 아마도 필터가 여러개이고, 레벨도 같을 경우 동시에 해당 필터들을 진행하기 위하여 ConcurrentHashMap을 사용하지 않았나 생각이 든다.

 

(전파하는 데이터 종류)

HttpRequest, Response 관련 : HttpServletRequest, HttpServletResponse, Throwable,

HashMap<String,Object> : 라우팅정보, Request/Response 데이터 ( 바디부, 헤더부, Input.OutputStream )

 

[ Zuul Routing ]

- 주울의 라우팅은 실제 URL 정보를 숨기는것을 지양하고 있어 실제 어디로 라우팅 되는지 IP주소등은 알기 어렵다.

ThreadLocal에 있는 라우팅 정보를 필터를 거치면서 숨기게 되는데 해당 IP 정보는 실제로 

PreDecorationFilter에서 업데이트 되며 숨겨지게 된다.

 

- Zuul은 각 요청 스레드가 Zuul Pre Filter => Route Filter => ( RibbonClient) => HystrixCommand, Fallback => PostFilter 순으로 진행되게 된다...

 

- Routing 되어 진행되는 모든 요청 Thread는 Hystrix Thread Pool로 격리되고 관리된다. => Zuul의 Tomcat Thread와 분리되어 Zuul에 들어오는 톰캣 Thread와 독립성을 유지한다.

- 관련 option

zuul.ribbionIsolationStrategy: THREAD ( 쓰레드풀로 격리한다 ), zuul.threadPool.useSeparateThreadPools: true ( 라우팅 대상 서비스마다 Hystrix Thread Pool을 배정한다.)

- Hystrix 격리 전략 관련 참고 : https://github.com/Netflix/Hystrix/wiki/How-it-Works#isolation

 

* Routing 시에 에러가 났을 경우 Zuul Request Context 안의 Throwable 객체에 해당 Exception이 담겨지지 않는 문제 : 각 요청은 HystrixCommand라는 구현체에서 Wrapping 되어있어서.. 에러가 발생햇을 시 StackTrace를 해도 ZuulFilterException 이라고 밖에 나오지 않는다. 이 문제를 해결하기 위해서 HystrixCommand와 Fallback을 구현하여 RequestContext에 해당 Exception 객체를 넘겨주어야 한다..

=> 추후에 작성예정

 

[ Zuul의 Filter 종류 - 출처: https://12bme.tistory.com/509 [길은 가면, 뒤에 있다.]]

ServletDetectionFilter: Pre. 요청이 스프링 디스패처를 통해서 들어오는지를 점검한다. FilterConstants.IS_DISPATCHER_SERVLET_REQUEST_KEY를 사용해 설정한다.
FormBodyWrapperFilter: Pre. 다운스트림 요청을 위해 폼 데이터를 파싱하고 다시 인코딩한다.
PreDecorationFilter: Pre.제공된 RouteLocator를 기반으로 요청을 어디로 어떻게 전달할지 결정한다. 또한 프록시와 관련된 헤더를 요청에 설정한다.
SendForwardFilter: Route. RequestDispatcher를 사용해 요청을 전달한다.
RibbonRoutingFilter: Route. 이것은 요청을 보내기 위해 리본, 히스트릭스, 그리고 Apache HttpClient, OkHttpClient와 같은 외부 HTTP 클라이언트, 또는 리본 HTTP 클라이언트를 사용한다. Service ID는 요청 컨텍스트에서 가져온다.
SimpleHostRoutingFilter: Route. Apache HTTP 클라이언트를 통해 요청을 URL로 보낸다. URL은 요청 컨텍스트에 있다.

SendResponseFilter: Post. 프록시 요청과 현재 응답으로부터 응답을 작성한다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함