前言
最近使用了springcloud gateway,發現默認是reactor編程,處理web請求和webmvc基本相同,實現上不同,簡單分析了下gateway的web處理流程,記錄下,以后用到方便查閱。
spring cloud gateway
tomcat處理web請求流程回顧
gateway處理web請求
gateway用作網關,接入web請求和tomcat處理web請求基本相似,只是實現上不同,具體處理web請求如下
每個處理步驟說明如下:
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模塊