引言
本篇文字主要讲解spring-cloud-gateway的handler部分,参考官方的gateway处理流程图可以知道handler是gateway的核心控制部分,其控制着request在gateway的整个生命周期。我们可以看到,一个请求由Client发出,被spring-web-server监听,经过gateway-handler-mapping之后请求便进入了gateway部分的代码实现部分,也就表明gateway是通过Gateway Web Hnadler来与web框架交接工作的。那么本节的重点则用于讲解handler的工作交接部分以及如何疏通整个工作流的,扮演这个交接工作角色的是FilteringWebHandler,实现web server的WebHandler接口。
![6dc20ea39369170fc66082c5bdcee090.png](https://i-blog.csdnimg.cn/blog_migrate/9e5692ed898da2363413774159a8a121.jpeg)
FilteringWebHandler | loadFilters(List filters)
关注final List globalFilters的初始化,会将Configuration注入的GlobalFilter bean初始化至globalFilters;这里有两个目标转换类,在loadFilters方法中map函数对每一个GlobalFilter做包装转换,对于实现了Ordered接口最终转换出OrderedGatewayFilter,没有排序的则转换出GatewayFilterAdapter;两个目标类均是GatewayFilter接口的实现类,GatewayFilterAdapter是FilteringWebHandler的私有嵌套类,理想情况不应该存在不实现Ordered接口的全局过滤器;而OrderedGatewayFilter位于filter包下,与GlobalFilter在同一包下声明,仅仅是对GatewayFilterAdapter的包装,将其GatewayFilterAdapter和order映射到字段。
![5a9dcda80132d200f9ac7315f67ac614.png](https://i-blog.csdnimg.cn/blog_migrate/ec3f47ceb844f3dade24a9544c2b7700.jpeg)
FilteringWebHandler
这里的loadFilters加载的是全局过滤器,与RouteDefinitionRouteLocator中的loadFilters函数不同,RouteDefinitionRouteLocator中是加载的配置的gatewayFilter,即每次请求都需要根据Route和过滤器工厂集合来加载一次,而全局过滤器的加载只发生在进程启动时的一次性加载行为,但是最终加载结果类型一样都是OrderedGatewayFilter类型。
![641eb47b0248faaed7c262caba85ce86.png](https://i-blog.csdnimg.cn/blog_migrate/e07d572c37a7ba966f9b400a14d984e2.jpeg)
GatewayFilterAdapter