环境:SpringBoot2.7.10 + Spring Cloud gateway3.1.6
1 RouteToRequestUrlFilter
根据路由配置的url信息,构建成为要访问的目标地址,如下路由配置:
访问:http://localhost:8088/api-1/demos
转换后:http://localhost:8787/demos
该过滤器最后会将转换后的url保存到上下文中

注意:上面的StripPrefixGatewayFilterFactory#apply过滤器执行完后,才会执行该过滤器。
总结:
访问:http://localhost:9090/api-x/orders ,路由地址:lb://order-service
转换地址转换后:http://localhost:9090/orders
合并地址将上一步的地址进一步合并为:lb://order-service/orders将地址存储到上下文中:exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, mergedUrl);
2 ReactiveLoadBalancerClientFilter
如果URL有一个lb(例如lb://order-service),它使用Spring Cloud ReactorLoadBalancer将名称(在本例中为order-service)解析为一个实际的主机和端口,并替换相同属性中的URI。






总结:
获取地址获取上一步中保存在上下文的地址URI url = exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR);
获取LoadBalancerLifecycle取得当前服务(order-service),对应的AnnotationConfigApplicationContext中配置的LoadBalancerLifecycle,该负载均衡生命周期能够监控负载均衡的执行过程。该类是泛型类,3个泛型参数,类型依次为:RequestDataContext.class, ResponseData.class, ServiceInstance.class。
获取ReactorServiceInstanceLoadBalancer获取当前服务(order-server),对应的AnnotationConfigApplicationContext中配置的ReactorServiceInstanceLoadBalancer。每一个服务都有一个对应的默认配置类LoadBalancerClientConfiguration,该配置类中有默认的RoundRobinLoadBalancer。我们可以为具体的服务提供LoadBalancerClientSpecification 类型的Bean,该类我们可以指定你要配置的serviceId及配置类,在配置类中我们可以自定义ReactorServiceInstanceLoadBalancer 的实现类Bean。
选择服务在上一步中获得ReactorServiceInstanceLoadBalancer后,接下来就是选取一个服务实例了。
重构URI上一步中获取了ServiceInstance 后就能够重构URL了,当前的URL为: http://localhost:9090/orders 构建后:http://localhost:9093/storages ,将该URL保存到上下文中 exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, requestUrl);
3 NettyRoutingFilter
总结:



获取URL获取上一步保存在上下文中的URLURI requestUrl = exchange.getRequiredAttribute(GATEWAY_REQUEST_URL_ATTR);
设置当前路由状态设置当前路由已经路由状态setAlreadyRouted(exchange);exchange.getAttributes().put(GATEWAY_ALREADY_ROUTED_ATTR, true);
获取路由Route route = exchange.getAttribute(GATEWAY_ROUTE_ATTR);获取当前的Route信息。主要就用来获取配置路由时提供的配置信息,比如:超时时间设置,如上配置。RoutePredicateHandlerMapping#getHandlerInternal方法中保存路由到上下文中
构建HttpClient通过上一步取得的Route对象,配置HttpClient相关属性,比如:超时时间。配置基本的http相关信息,建立连接后将Connection对象保存到上下文中,供下一个过滤器获取响应数据
4 NettyWriteResponseFilter
该过滤器的作用是处理由NettyRoutingFilter中建立的HTTP请求(包括:请求参数,请求头,建立连接);在NettyRoutingFilter中会将建立连接后的Connection保存到ServerWebExchange上下文中。


总结:
取得Connection取得上一步中保存的ConnectionConnection connection = exchange.getAttribute(CLIENT_RESPONSE_CONN_ATTR);
响应内容输出微服务端响应的数据

以上就是Gateway在处理一个路由请求的执行流程
完毕!!!