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

gateway学习——转发的过程 源码解读(4)

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

gateway学习——转发的过程 源码解读(4)

问题:

访问gateway的地址:localhost:8080/spring-nacos/user/info
是如何转发到 localhost:8081/spring-nacos/user/info 项目的

DispatcherHandler类就是gateway的请求入口,
(怎么知道这是入口,大概是:http请求——>netty线程模型,处理read事件——>然后调用DispatcherHandler.hanlder方法。这一块没去研究,百度到的)。

DispatcherHandler
先介绍一下这个类:
public class DispatcherHandler implements WebHandler, ApplicationContextAware {
	//1: 实现了 ApplicationContextAware 接口,setApplicationContext(ApplicationContext applicationContext)方法,
	//2: 实现了WebHandler 接口,handle(ServerWebExchange exchange); 方法。
}

看下其实现该方法的逻辑:

1:setApplicationContext:
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) {
		//初始化策略
		initStrategies(applicationContext);
	}

	//这里初始化是给 属性handlerMappings ,handlerAdapters ,resultHandlers 赋值。
	protected void initStrategies(ApplicationContext context) {
		//这里是获取所有的 HandlerMapping 的Bean,
		//例如:RoutePredicateHandlerMapping, 是在:GatewayAutoConfiguration中 用@Bean注入
		//RequestMappingHandlerMapping, 是在:WebFluxAutoConfiguration中内部类:EnableWebFluxConfiguration的RequestMappingHandlerAdapter--->super.createRequestMappingHandlerAdapter();
		//RouterFunctionMapping, 与上面 RequestMappingHandlerMapping 实在同一个类中: @Bean RouterFunctionMapping
		//SimpleUrlHandlerMapping 是在 WebFluxConfigurationSupport 的 @Bean的HandlerMapping
		Map mappingBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors(
				context, HandlerMapping.class, true, false);
		//排序
		ArrayList mappings = new ArrayList<>(mappingBeans.values());
		AnnotationAwareOrderComparator.sort(mappings);
		//定义为 不可以修改
		this.handlerMappings = Collections.unmodifiableList(mappings);
		
		//获取 HandlerAdapter ,有三个。
		// RequestMappingHandlerAdapter 是在 WebFluxConfigurationSupport  的@Bean RequestMappingHandlerAdapter
		// HandlerFunctionAdapter 是在 WebFluxConfigurationSupport   的@Bean HandlerFunctionAdapter
		// SimpleHandlerAdapter 是在 WebFluxConfigurationSupport   的@Bean SimpleHandlerAdapter 
		Map adapterBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors(
				context, HandlerAdapter.class, true, false);

		this.handlerAdapters = new ArrayList<>(adapterBeans.values());
		AnnotationAwareOrderComparator.sort(this.handlerAdapters);
		// 这里获取 :HandlerResultHandler, 都是在 WebFluxConfigurationSupport类中注入的Bean
		// ResponseEntityResultHandler 
		// ResponseBodyResultHandler
		// ViewResolutionResultHandler
		// ServerResponseResultHandler
		Map beans = BeanFactoryUtils.beansOfTypeIncludingAncestors(
				context, HandlerResultHandler.class, true, false);

		this.resultHandlers = new ArrayList<>(beans.values());
		AnnotationAwareOrderComparator.sort(this.resultHandlers);
	}

2:handle(ServerWebExchange exchange)方法
@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转换。
				.flatMap(result -> handleResult(exchange, result));
	}
2.1 mapping.getHandler(exchange)方法

RoutePredicateHandlerMapping,RequestMappingHandlerMapping,RouterFunctionMapping,SimpleUrlHandlerMapping
这四个类都会进入AbstractHandlerMapping.getHandler(ServerWebExchange exchange)

public Mono getHandler(ServerWebExchange exchange) {
		return getHandlerInternal(exchange).map(handler -> {
			if (logger.isDebugEnabled()) {
				logger.debug(exchange.getLogPrefix() + "Mapped to " + handler);
			}
			ServerHttpRequest request = exchange.getRequest();
			if (hasCorsConfigurationSource(handler) || CorsUtils.isPreFlightRequest(request)) {
				CorsConfiguration config = (this.corsConfigurationSource != null ? this.corsConfigurationSource.getCorsConfiguration(exchange) : null);
				CorsConfiguration handlerConfig = getCorsConfiguration(handler, exchange);
				config = (config != null ? config.combine(handlerConfig) : handlerConfig);
				if (!this.corsProcessor.process(config, exchange) || CorsUtils.isPreFlightRequest(request)) {
					return REQUEST_HANDLED_HANDLER;
				}
			}
			return handler;
		});
	}
 
2.1.1: getHandlerInternal(exchange) 
	这个方法每个子类都有实现,以下分别开始讲。
2.1.1.1: RoutePredicateHandlerMapping.getHandlerInternal
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();
		}
		//这一步 设置属性 org.springframework.cloud.gateway.support.ServerWebExchangeUtils.gatewayHandlerMapper = RoutePredicateHandlerMapping
		exchange.getAttributes().put(GATEWAY_HANDLER_MAPPER_ATTR, getSimpleName());
		//检查路由:
		return lookupRoute(exchange)
				// .log("route-predicate-handler-mapping", Level.FINER) //name this
				.flatMap((Function>) 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) + "]");
					}
				})));
	}

lookupRoute(exchange):检查路由:

protected Mono lookupRoute(ServerWebExchange exchange) {
		// this.routeLocator是CachingRouteLocator,
		// getRoutes()= RouteDefinitionRouteLocator,
		// 这些都是@Bean注入的。
		// this.routeLocator.getRoutes()就会进入到: RouteDefinitionRouteLocator.getRoutes()
		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);
				})
						// instead of immediately stopping main flux due to error, log and
						// swallow it
						.doOnError(e -> logger.error(
								"Error applying predicate for route: " + route.getId(),
								e))
						.onErrorResume(e -> Mono.empty()))
				.next()
				.map(route -> {
					if (logger.isDebugEnabled()) {
						logger.debug("Route matched: " + route.getId());
					}
					validateRoute(route, exchange);
					return route;
				});
	}
2.1.1.2: RequestMappingHandlerMapping. 2.1.1.3: RouterFunctionMapping. 2.1.1.4: SimpleUrlHandlerMapping . 2.2:handler -> invokeHandler(exchange, handler) 2.3:result -> handleResult(exchange, result)
转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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