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