RoutePredicateHandlerMapping#getHandlerInternal

webflux的入口是DispatcherHandler,他这里会调用HandlerMapping的getHandler办法。AbstractHandlerMapping实现了HandlerMapping接口,他有个形象办法getHandlerInternal须要子类实现。
RoutePredicateHandlerMapping继承了AbstractHandlerMapping,所以咱们的重点就是他的getHandlerInternal办法。这外面就是用来解决是否有对应的Route。
这个办法,其实次要调用lookupRoute办法。

protected Mono<?> getHandlerInternal(ServerWebExchange exchange) {    // don't handle requests on management port if set and different than server port    if (this.managementPortType == DIFFERENT && this.managementPort != null            && exchange.getRequest().getURI().getPort() == this.managementPort) {        return Mono.empty();    }    exchange.getAttributes().put(GATEWAY_HANDLER_MAPPER_ATTR, getSimpleName());    return lookupRoute(exchange)            // .log("route-predicate-handler-mapping", Level.FINER) //name this            .flatMap((Function<Route, Mono<?>>) r -> {                exchange.getAttributes().remove(GATEWAY_PREDICATE_ROUTE_ATTR);                if (logger.isDebugEnabled()) {                    logger.debug(                            "Mapping [" + getExchangeDesc(exchange) + "] to " + r);                }                exchange.getAttributes().put(GATEWAY_ROUTE_ATTR, r);                return Mono.just(webHandler);            }).switchIfEmpty(Mono.empty().then(Mono.fromRunnable(() -> {                exchange.getAttributes().remove(GATEWAY_PREDICATE_ROUTE_ATTR);                if (logger.isTraceEnabled()) {                    logger.trace("No RouteDefinition found for ["                            + getExchangeDesc(exchange) + "]");                }            })));}

RoutePredicateHandlerMapping#lookupRoute

咱们能够看到他有个r.getPredicate().apply这样的代码,他这个apply最终会调用每个Predicate的test办法,返回false或者true。

protected Mono<Route> lookupRoute(ServerWebExchange exchange) {    return this.routeLocator.getRoutes()            // individually filter routes so that filterWhen error delaying is not a            // problem            .concatMap(route -> Mono.just(route).filterWhen(r -> {                // add the current route we are testing                exchange.getAttributes().put(GATEWAY_PREDICATE_ROUTE_ATTR, r.getId());                return r.getPredicate().apply(exchange);            })    // 其余略        }

DefaultAsyncPredicate#apply

在这里,会把每个Predicate的test办法调用过来。

public Publisher<Boolean> apply(T t) {    return Mono.just(delegate.test(t));}

FilteringWebHandler#handle

咱们曾经从下面的办法中拿到了一个Route(没有就不持续了),那就开始调用Filter。
DispatcherHandler在调用完handlerMappings后,会调用他的invokeHandler办法。

private Mono<HandlerResult> invokeHandler(ServerWebExchange exchange, Object handler) {    if (this.handlerAdapters != null) {        for (HandlerAdapter handlerAdapter : this.handlerAdapters) {            if (handlerAdapter.supports(handler)) {                return handlerAdapter.handle(exchange, handler);            }        }    }    return Mono.error(new IllegalStateException("No HandlerAdapter: " + handler));}

而后会调用webHandler.handle办法。

public Mono<HandlerResult> handle(ServerWebExchange exchange, Object handler) {    WebHandler webHandler = (WebHandler) handler;    Mono<Void> mono = webHandler.handle(exchange);    return mono.then(Mono.empty());}

咱们的FilteringWebHandler就是一个WebHandler,咱们看看他的handle办法。
他会先获取对应Route的Filters,再和通用的Filters合并排序,最初开始Filters的调用链。

public Mono<Void> handle(ServerWebExchange exchange) {    // 获取Route    Route route = exchange.getRequiredAttribute(GATEWAY_ROUTE_ATTR);    // 取出Filters    List<GatewayFilter> gatewayFilters = route.getFilters();    // 退出通用的Filters    List<GatewayFilter> combined = new ArrayList<>(this.globalFilters);    combined.addAll(gatewayFilters);    // TODO: needed or cached?    // 排序    AnnotationAwareOrderComparator.sort(combined);    if (logger.isDebugEnabled()) {        logger.debug("Sorted gatewayFilterFactories: " + combined);    }    // 调用链    return new DefaultGatewayFilterChain(combined).filter(exchange);}

整体流程

这边疏忽了DispatcherHandler局部