springcloud gateway請求處理流程


前言

最近使用了springcloud gateway,發現默認是reactor編程,處理web請求和webmvc基本相同,實現上不同,簡單分析了下gateway的web處理流程,記錄下,以后用到方便查閱。

spring cloud gateway

tomcat處理web請求流程回顧

image-20210301215527807

gateway處理web請求

gateway用作網關,接入web請求和tomcat處理web請求基本相似,只是實現上不同,具體處理web請求如下

image-20210301223143217

每個處理步驟說明如下:

NettyWebServer:等同tomcat的網絡接入。持有ReactorHttpHandlerAdapter

ReactorHttpHandlerAdapter:處理http請求。持有HttpHandler

HttpWebHandlerAdapter:是個HttpHandler,http的處理器。持有WebHandler

ExceptionHandlingWebHandler:全局異常處理器,是個WebHandler。持有WebHandler

org.springframework.web.server.handler.FilteringWebHandler:調用DefaultWebFilterChain,是個WebHandler。持有DefaultWebFilterChain

DefaultWebFilterChain:是WebFilterChain,持有List<WebFilter>,每個WebFilter等同webmvc的web filter。持有WebHandler,在filterchain執行完畢后調用WebHandler。

DispatcherHandler:等同webmvc的DispatcherServlet,是個WebHandler。

SimpleHandlerAdapter:等同webmvc的RequestMappingHandlerAdapter,根據請求映射到對應的處理方法,對於該類功能就是調用WebHandler。持有WebHandler。是個HandlerAdapter。

org.springframework.cloud.gateway.handler.FilteringWebHandler:作用就是調起gateway的filterchain。是個WebHandler。

DefaultGatewayFilterChain:gateway的filterchain,即調用由GatewayFilter組成的gateway filter。限流、路由等功能都是在GatewayFilter內實現的。

DefaultWebFilterChain說明

DefaultWebFilterChain是個WebFilterChain,是web filter chain,用於處理web請求,功能等同servlet的filter,很容易明白。對於web層的處理,我們應該XxxFilter implements WebFilter

比如DefaultWebFilterChain的實際結構如下

有5個webfilter,分別是MetricsWebFilter、WebFilterChainProxy、WeightCalculatorWebFilter、IgnoreUrlsRemoveJwtFilter、CorsWebFilter。 其中WebFilterChainProxy是spring-security,等同FilterChainProxy,里面又有webfilterchain。

DefaultGatewayFilterChain說明

DefaultGatewayFilterChain implements GatewayFilterChain,是GatewayFilter的集合,這里是用於網關的處理。一個實際結構如下

[GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.RemoveCachedBodyFilter@2d117280}, order = -2147483648]

[GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.AdaptCachedBodyGlobalFilter@fe09374}, order = -2147482648]

[GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.NettyWriteResponseFilter@e344f14}, order = -1]

[GatewayFilterAdapter{delegate=com.macro.mall.filter.AuthGlobalFilter@28d16af8}, order = 0]

[GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.ForwardPathFilter@21bd6fd1}, order = 0]

[GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.GatewayMetricsFilter@340c7479}, order = 0]

[[RewritePath /mall-admin/(?<remaining>.*) = '/${remaining}'], order = 1] RewritePathGatewayFilterFactory$1

[GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.RouteToRequestUrlFilter@6c2be147}, order = 10000]

[GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.LoadBalancerClientFilter@58932d08}, order = 10100]

[GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.WebsocketRoutingFilter@79e9c14}, order = 2147483646]

[GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.NettyRoutingFilter@45648e75}, order = 2147483647]

[GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.ForwardRoutingFilter@dddcd91}, order = 2147483647]

比如

RouteToRequestUrlFilter用於路由

LoadBalancerClientFilter用於客戶端負載

gateway擴展

基本是擴展WebFilter和GatewayFilter

擴展web層,實現WebFilter並標注是個bean即可

@Component
XxxWebFilter implements WebFilter {
    //filter邏輯
}

擴展gateway能力,實現GlobalFilter並標注是個bean即可

@Component
XxxGlobalFilter implements WebFilter {
    //filter邏輯
}

gateway的擴展是如此簡單,后面看看gateway結合sentinal,估計也是如此集成。

參考代碼 https://github.com/macrozheng/mall-swarm.git mall-gateway模塊


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM