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——架构分析的主要内容,如果未能解决你的问题,请参考以下文章