Gateway处理请求流程简单分析
主要步骤如下:HttpServerHandle : netty 的服务端,接收客户端请求HttpWebHandlerAdapter :组装ServerWebExchange类型的exchange对象,触发跳转 DispatcherHandler;ServerWebExchange是一个HTTP请求-响应交互的契约。存放着重要的请求-响应属性、请求实例和响应实例,提供对HTTP请求和响应的访问,并公
主要步骤如下:
- HttpServerHandle : netty 的服务端,接收客户端请求
- HttpWebHandlerAdapter :组装ServerWebExchange类型的exchange对象,触发跳转 DispatcherHandler;ServerWebExchange是一个HTTP请求-响应交互的契约。存放着重要的请求-响应属性、请求实例和响应实例,提供对HTTP请求和响应的访问,并公开额外的 服务器 端处理相关属性和特性,如请求属性等等,有点像
Context
的角色。 - DispatcherHandler : 请求调度器,负责转发到具体的请求处理器;
- RoutePredicateHandlerMapping : 匹配处理器后进行route的断言,成功则取执行过滤链,否则直接response;
- FilteringWebHandler:这个handler在Gateway启动时会将所有的 GlobalFilter 构建一个GatewayFilterAdapter(内部类),而GatewayFilterAdapter对象仅持有GlobalFilter接口方法,GatewayFilterAdapter对象在转换成OrderedGatewayFilter后也持有了getOrder方法,根据getOrder方法的返回值顺序组成ArrayList。处理请求时会调用DefaultGatewayFilterChain 用来处理filter,DefaultGatewayFilterChain 类持有了filter链;整个过滤链都是在这个过滤器中进行的,过滤器的执行顺序由order决定;
系统提供的重要的全局过滤器:
- RemoveCachedBodyFilter
清除exchange的attributes中cachedRequestBody值。这个key的名称来自exchangeUtile中CACHED_REQUEST_BODY_ATTR = "cachedRequestBody"。
- GatewayMetricsFilter
如果项目中添加 spring-boot-starter-actuator 依赖,且配置文件中配置 spring.cloud.gateway.metrics.enabled 的值为true时,才会创建该filter,用来整合监控相关,提供监控指标。
- AdaptCachedBodyGlobalFilter
作用是从exchange的attributes中获取cachedRequestBody属性值作为request的body,注意使用此功能首先必须预设cachedRequestBody属性至attributes中。
- NettyWriteResponseFilter
将代理响应写回网关的客户端侧。
- RequestStatisticsFilter(我们自定义的Filter)
用来处理请求统计分析的埋点过滤器 。
- ForwardPathFilter
处理uri为forword开头的服务地址,形如:forword://xxxxxx.com,否则也忽略。
- RouteToRequestUrlFilter
过滤器RouteToRequestUrlFilter是必须的全局过滤器,将从request里获取的原始url转换成Gateway进行请求转发时所使用的url。当请求进来时,RouteToRequestUrlFilter
会从 exchange 中获取 ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR
属性的值,该值是一个 Route
对象。若该对象不为空的话,RouteToRequestUrlFilter
会基于请求 URL 及 Route
对象里的 URL 来创建一个新的 URL。新 URL 会被放到 exchange 的 ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR
属性中。
- LoadBalancerClientFilter(我们可以在此处做自定义负载均衡)
这个Filter是用来整合Ribbon的,其核心就是解析 scheme 为lb
的 url,以此获取微服务的名称,然后再通过Ribbon获取实际的调用地址
- WebsocketRoutingFilter
过滤器实现了gateway对于Websocket 的支持,使用Spring Web Socket将转发 Websocket 请求
- NettyRouting
使用Netty的 HttpClient
转发http、https请求。
- ForwardRoutingFilter
最终将exchange交还给Webhandler做http请求处理,已经准备返回数据给客户端(如果是forward则会发送到gateway本地的控制器处理)。
更多推荐
所有评论(0)