首先来看一下Spring Cloud Gateway的工作流程图:

Spring请求处理流程之WebHandler、HandleMapping
实际上是spring webflux中的概念。虽然 HttpHandler 的目标很简单,即抽象化不同 HTTP 服务器的使用,但 WebHandler API 旨在提供更广泛的一组在 Web 应用中常用的功能。
Bean name | Bean type | Count | Description |
---|---|---|---|
<any> | WebExceptionHandler | 0..N | Provide handling for exceptions from the chain of WebFilter instances and the target WebHandler . For more details, see Exceptions. |
<any> | WebFilter | 0..N | Apply interception style logic to before and after the rest of the filter chain and the target WebHandler . For more details, see Filters. |
webHandler | WebHandler | 1 | The handler for the request. |
在spring中,都是通过WebHandler
的子类DispatcherHandler
来组合HandlerMapping
和HandlerAdapter
。在处理请求的时候,从HandlerMapping
中通过getHandler
方法获得到里面的handler,然后交给对应的HandlerAdapter
来执行handler。(HandlerAdapter
的存在是为了让handler的执行逻辑和DispatcherHandler
解耦,因为执行handler的时候可能不是简单的去调用handler的handle方法,还需要额外的逻辑,因此将handler的具体执行交给HandlerAdapter
)。
在进行拓展的时候,HandlerMapping
实际上有子抽象类AbstractHandlerMapping
,只需要继承这个抽象类然后重写里面的getHandlerInternal
方法就可以。
spring也内置了HandlerAdapter
,通过supports
方法判断,来处理不同功能的HandlerMapping
。

关于在DispatcherHandler
遍历HandlerMapping
的时候的一些执行细节,在遍历handlerMappings和获取handler之后得到的是一个流,里面可能匹配到了多个handler,通过next操作只会取第一个handler进行处理。

Gateway的请求处理实现
RoutePredicateHandlerMapping
下面说一下spring gateway的实现方式。spring gateway在进行拓展的时候,则是提供了一个继承自AbstractHandlerMapping
抽象类的子类RoutePredicateHandlerMapping
,作为gateway功能的入口。重写了里面的getHandlerInternal()
方法, 首先会从所有的路由定义routes中找到与断言匹配的route, 最终将匹配到的route存放到请求上下文中。然后使用过滤器org.springframework.cloud.gateway.handler.FilteringWebHandler
执行route中的过滤规则。
FilteringWebHandler
FilteringWebHandler
类实现了WebHandler
接口,这样可以共用spring预置的Handlerdapter的实现(SimpleHandlerAdapter)而不需要再自定义一个HandlerAdapter实现类。在FilteringWebHandler
的handler
方法中,将全局过滤器GlobalFilter和GatewayFilter的实现统一合并处理。通过DefaultGatewayFilterChain
进行过滤器的传递。
在spring cloud gateway中,每一个过滤器的形式为:[过滤器的功能名称+GatewayFilterFactory],例如AddRequestHeader
过滤器,它的实现就是对应着一个AddRequestHeaderGatewayFilterFactory
的工厂方法,通过工厂的apply方法生成对应的GatewayFilter
的接口匿名类实现方法中实现不同的过滤逻辑。
过滤器工厂允许我们修改传入的HTTP请求和传出的HTTP响应。通过过滤器,对所有的服务调用执行大量操作;这里的重点是执行操作,也就是指修改请求头信息,修改请求路径,修改响应信息等操作;
FilteringWebHandler
中GlobalFilter的注入是在声明为bean的时候自动注入的。

上面只是注入了所有的GlobalFilter
,在handle方法中从route中获取出配置的GatewayFilter
与全局过滤器进行合并处理:

补充知识点
GlobalFilter和GatewayFilter的区别
GlobalFilter
:- 定义:全局过滤器,作用于所有路由。
- 作用范围:全局过滤器会对 所有请求 进行处理,无论请求匹配哪个路由规则。
- 用途:通常用于全局性的功能,如 日志记录、权限验证、异常处理 等。
GatewayFilter
:- 定义:网关过滤器,作用于特定路由。
- 作用范围:网关过滤器只对 特定路由 生效,需要在路由配置中明确指定。
- 用途:通常用于对特定路由的请求进行 定制化处理,如 修改请求头、添加响应头、路径重写 等。
Gateway中的全局过滤器默认全部启用,可以在配置文件中修改配置:
