spring cloud gateway 구조

https://cloud.spring.io/spring-cloud-gateway/spring-cloud-gateway.html#gateway-how-it-works

spring-cloud-gateway의 공식문서 how it works를 보다가 조금더 자세하게 Diagram을 그려봤다.

1. ReactorHttpHandlerAdapter.apply(request, response)

HttpServerRequest와 HttpServerResponse를 HttpWebHandlerAdapter에 ReactorServerRequest / ReactorServerResponse로 NettyBufferFactory와 함께 wrapping해 전달해준다.

2. HttpWebHandlerAdapter

ReactorHttpHandlerAdapter로부터 받은 ReactorServerRequest / ReactorServerResponse를 ServerWebExchange로 만들어 DispatcherHandler에게 넘겨준다.

3. DispatcherHandler

HandlerMappings - RouterFunction / RequestMapping / RoutePredicateHandlerMapping

  • HandlerMapping에 WebFlux가 지원하는 RouterFounction과 RequestMapping이 있고 그 이외의 spring-cloud-gateway의 RoutePredicateHandlerMapping이 있다.

Gateway로 들어오는 request는 RoutePredicateHandlerMapping이 handler를 찾게 된다.

  • RoutePredicateHandlerMapping.getHandler(ServerWebExchange).getHandlerInternal(ServerWebExchange)

4. RoutePredicateHandlerMapping

getHandlerInternal()

5. DispatcherHandler

invokeHandler()

  • RoutePredicateHandlerMapping에서 return 받은 FilteringWebHandler를 지원하는 handlerAdapter를 찾고 handling한다.
  • FilteringWebHandler를 지원하는 handlerAdapter는 SimpleHandlerAdapter이다.

6. SimpleHandlerAdapter

SimpleHandlerAdapter.handle()은 항상 Mono.empty()를 return한다.
그러므로 DispatcherHandler는 handlerAdapter로부터 return받아 handleResult를 call하게 되는데 값이 empty이기 때문에 DispatcherHandler.resultHandlers는 아무 일도 하지 않게 된다.

7. FilteringWebHandler

handle()

  • Route instance에서 GatewayFilter를 가져와 GlobalFilters와 Order에 따라 chaning해서 수행하게 된다.
  • For example as GatewayFilter, AddRequestHeaderGatewayFilterFactory, and so on..
  • NettyWriteResponseFilter
    • NettyWriteResponseFilter는proxy한 reponse를 ServerWebExchange.response에 쓰는 역할을 한다.

And Finally HttpServerResponse will be passed.