Spring.Cloud Gateway——架构分析

Posted 不去天涯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring.Cloud Gateway——架构分析相关的知识,希望对你有一定的参考价值。

Spring WebFlux架构

Spring Cloud Gateway是在Spring WebFlux基础上构造的新一代网关系统。Spring WebFlux和Spring MVC架构和API上几乎完全一致,只不过Spring WebFlux底层使用的是响应式接口,Spring MVC是构建在Servlet之上的阻塞式编程架构。这里的阻塞式和非阻塞式不仅是我们常说的Web服务器I/O,Spring WebFlux构建在Reactor模型之上,Reactor是一种全域的响应式编程模型。


以上是Spring WebFlux和Spring MVC架构的官方对比图,两者都采用前端调度器模式(Dispatcher)实现,其他像关键部件也十分相似。关于两者的选型官方也给出了权威的说明:Web on Reactive Stack

Spring Cloud Gateway架构

Spring Cloud Gateway是构建在Spring WebFlux之上,Spring WebFlux已经提供了网络服务能力,而且提供了很好的封装。所以Spring Cloud Gateway只需要实现Spring WebFlux扩展所需的组件,并且封装自身所需的功能就可以了。Spring Cloud Gateway的整体架构如下所示:

借助Spring WebFlux的网络服务能力,Spring Cloud Gateway仅需实现自定义的HandlerMapping、WebHandler两个关键组件即可完成Spring WebFlux的扩展。除此之外,Spring Cloud Gateway只需要关注自身需要的路由功能,以及其他API网关通用能力。

RouteLocator负责路由的初始化和路由的选择,HandlerMapping在处理请求时调用RouteLocator获取处理此次请求的Route,处理过程是逐个调用所有Route的Predicates判断本次请求是否由自己处理。

WebHandler取出HandlerMapping阶段匹配的Route所有的Filters,拼装上全局Filters,构建过滤器链。滤器链中的过滤器完成请求处理、解析、重写、负载均衡等操作,最后执行过滤器ProxyFilter完成请求的转发。

HandlerMapping分析

HandlerMapping的实现类是RoutePredicateHandlerMapping,其中关键方式是protected Mono<?> getHandlerInternal(ServerWebExchange exchange),其主要功能是lookupRoute

	protected Mono<Route> lookupRoute(ServerWebExchange exchange) 
			   //获取所有路由
		return this.routeLocator.getRoutes()
			   //过滤可用路由
				.concatMap(route -> Mono.just(route).filterWhen(r -> 
exchange.getAttributes().put(GATEWAY_PREDICATE_ROUTE_ATTR, r.getId());
					return r.getPredicate().apply(exchange);
				)

						.doOnError(e -> logger.error(
								"Error applying predicate for route: " + route.getId(),
								e))
						.onErrorResume(e -> Mono.empty()))
				//只取出命中的所有Route中的第一个
				.next()
				//验证路由可用,validateRoute是一个空方法,默认是不做处理
				.map(route -> 
					if (logger.isDebugEnabled()) 
						logger.debug("Route matched: " + route.getId());
					
					validateRoute(route, exchange);
					return route;
				);
	

WebHandler分析

Spring Cloud Gateway的WebHandler实现是FilteringWebHandler,其中关键方式是handle

	public Mono<Void> handle(ServerWebExchange exchange) 
		//取出RoutePredicateHandlerMapping命中的Route
		Route route = exchange.getRequiredAttribute(GATEWAY_ROUTE_ATTR);
		List<GatewayFilter> gatewayFilters = route.getFilters();

		//拼接全局Filters和Route自己的Filters,并且按照Ordered值排序
		List<GatewayFilter> combined = new ArrayList<>(this.globalFilters);
		combined.addAll(gatewayFilters);
		AnnotationAwareOrderComparator.sort(combined);

		if (logger.isDebugEnabled()) 
			logger.debug("Sorted gatewayFilterFactories: " + combined);
		
		
		//组装过滤器链,并且触发链式过滤
		return new DefaultGatewayFilterChain(combined).filter(exchange);
	

以上是关于Spring.Cloud Gateway——架构分析的主要内容,如果未能解决你的问题,请参考以下文章

Spring.Cloud Gateway——架构分析

微服务架构之spring cloud gateway

Spring Cloud Gateway - 代理/转发 URL 的整个子部分

Spring Cloud Gateway初体验

Spring Cloud Gateway的10个经典问题

Spring Cloud Gateway 网关尝鲜