栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring Cloud Gateway系列(一):整体流程

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring Cloud Gateway系列(一):整体流程

GateWay作为Spring Cloud的全新项目用来取代旧版本中的Netflix Zuul,从而实现更高的性能,本系列将会以下三个部分:

    整体流程全局CORS配置动态路由刷新

使用配置文件配置的样例:

Gateway接收到来自客户端的请求之后,请求首先进入HttpWebHandlerAdapter 类:

@Override
public Mono handle(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 Mono handle(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 Mono filter(ServerWebExchange exchange) {
    
	return Mono.defer(() ->
	this.currentFilter != null && this.next != null ?
			this.currentFilter.filter(exchange, this.next) :
			this.handler.handle(exchange));
}

核心类DispatcherHandler:

@Override
public Mono handle(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 getHandler(ServerWebExchange exchange) {
		return getHandlerInternal(exchange).map(handler -> {
			if (logger.isDebugEnabled()) {
				logger.debug(exchange.getLogPrefix() + "Mapped to " + handler);
			}
            
			if (CorsUtils.isCorsRequest(exchange.getRequest())) {
				CorsConfiguration configA = this.corsConfigurationSource.getCorsConfiguration(exchange);
				CorsConfiguration configB = getCorsConfiguration(handler, exchange);
				CorsConfiguration config = (configA != null ? configA.combine(configB) : configB);
                */users*/users*/users*/users*/users
				if (!getCorsProcessor().process(config, exchange) ||
						CorsUtils.isPreFlightRequest(exchange.getRequest())) {
					return REQUEST_HANDLED_HANDLER;
				}
			}
			return handler;
		});
} 

HandlerMapping接口有很多实现类,只关注用来处理路由转发的RoutePredicateHandlerMapping类。

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号