GateWay作为Spring Cloud的全新项目用来取代旧版本中的Netflix Zuul,从而实现更高的性能,本系列将会以下三个部分:
- 整体流程全局CORS配置动态路由刷新
使用配置文件配置的样例:
Gateway接收到来自客户端的请求之后,请求首先进入HttpWebHandlerAdapter 类:
@Override public Monohandle(ServerHttpRequest request, ServerHttpResponse response) { if (this.forwardedHeaderTransformer != null) { request = this.forwardedHeaderTransformer.apply(request); } //过滤器中使用的ServerWebExchange就是在这里创建的DefaultServerWebExchange ServerWebExchange exchange = createExchange(request, response); LogFormatUtils.traceDebug(logger, traceOn -> exchange.getLogPrefix() + formatRequest(exchange.getRequest()) + (traceOn ? ", headers=" + formatHeaders(exchange.getRequest().getHeaders()) : "")); //getDelegate()返回的是ExceptionHandlingWebHandler return getDelegate().handle(exchange) .doonSuccess(aVoid -> logResponse(exchange)) .onErrorResume(ex -> handleUnresolvedError(exchange, ex)) .then(Mono.defer(response::setComplete)); }
ExceptionHandlingWebHandler类的handle(exchange)方法调用其父类WebHandlerDecorator的handle(exchange)方法,最终会调用FilteringWebHandler的hanlde(exchange)方法。
//ExceptionHandlingWebHandler类 @Override public Monohandle(ServerWebExchange exchange) { Mono completion; try { //调用父类WebHandlerDecorator的handle方法 completion = super.handle(exchange); } catch (Throwable ex) { completion = Mono.error(ex); } for (WebExceptionHandler handler : this.exceptionHandlers) { completion = completion.onErrorResume(ex -> handler.handle(exchange, ex)); } return completion; } //WebHandlerDecorator类 @Override public Mono handle(ServerWebExchange exchange) { //调用FilteringWebHandler.handle(exchange)方法 return this.delegate.handle(exchange); } //FilteringWebHandler类 @Override public Mono handle(ServerWebExchange exchange) { return this.chain.filter(exchange); }
然后进入DefaultWebFilterChain的filter(exchange)方法
@Override public Monofilter(ServerWebExchange exchange) { return Mono.defer(() -> this.currentFilter != null && this.next != null ? this.currentFilter.filter(exchange, this.next) : this.handler.handle(exchange)); }
核心类DispatcherHandler:
@Override public Monohandle(ServerWebExchange exchange) { if (this.handlerMappings == null) { return createNotFoundError(); } return Flux.fromIterable(this.handlerMappings) .concatMap(mapping -> mapping.getHandler(exchange)) .next() .switchIfEmpty(createNotFoundError()) .flatMap(handler -> invokeHandler(exchange, handler)) .flatMap(result -> handleResult(exchange, result)); }
mapping.getHandler(exchange)方法会执行AbstractHandlerMapping的getHandler(exchange)方法,我们在配置文件中指定的全局跨域规则就是在这个方法里生效的!
@Override public Mono
HandlerMapping接口有很多实现类,只关注用来处理路由转发的RoutePredicateHandlerMapping类。



