推荐 Spring Boot/Cloud 视频:
Spring-Cloud-Gateway 初始化,路由模型,以及路由加载等源码在上几篇学习文档中已经描述,接下来来看Spring-Cloud-Gateway是怎么通过这些来对我们的请求进行路由处理的
Spring-Cloud-Gateway整体流程图
- DispatcherHandler:所有请求的调度器,负载请求分发
- RoutePredicateHandlerMapping:路由谓语匹配器,用于路由的查找,以及找到路由后返回对应的WebHandler,DispatcherHandler会依次遍历HandlerMapping集合进行处理
- FilteringWebHandler : 使用Filter链表处理请求的WebHandler,RoutePredicateHandlerMapping找到路由后返回对应的FilteringWebHandler对请求进行处理,FilteringWebHandler负责组装Filter链表并调用链表处理请求。
DispatcherHandler
org.springframework.web.reactive.DispatcherHandler
@Override
public Mono<Void> handle(ServerWebExchange exchange) {
if (logger.isDebugEnabled()) {
ServerHttpRequest request = exchange.getRequest();
logger.debug("Processing " + request.getMethodValue() + " request for [" + request.getURI() + "]");
}
//校验handlerMapping集合是否为空
if (this.handlerMappings == null) {
return Mono.error(HANDLER_NOT_FOUND_EXCEPTION);
}
//依次遍历handlerMapping集合进行请求处理
return Flux.fromIterable(this.handlerMappings)
.concatMap(mapping ->
//通过mapping获取mapping对应的handler
mapping.getHandler(exchange))
.next()
.switchIfEmpty(Mono.error(HANDLER_NOT_FOUND_EXCEPTION))
.flatMap(handler ->
//调用handler处理
invokeHandler(exchange, handler))
.flatMap(result -&g