前言
最近使用了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模块