主要步骤如下:

  1. HttpServerHandle : netty 的服务端,接收客户端请求
  2. HttpWebHandlerAdapter :组装ServerWebExchange类型的exchange对象,触发跳转 DispatcherHandler;ServerWebExchange是一个HTTP请求-响应交互的契约。存放着重要的请求-响应属性、请求实例和响应实例,提供对HTTP请求和响应的访问,并公开额外的 服务器 端处理相关属性和特性,如请求属性等等,有点像 Context 的角色。
  3. DispatcherHandler : 请求调度器,负责转发到具体的请求处理器;
  4. RoutePredicateHandlerMapping : 匹配处理器后进行route的断言,成功则取执行过滤链,否则直接response;
  5. 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本地的控制器处理)。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐