gateway 源码
gateway 执行流程
- RouteLocator 初始化配置
- DispatcherHandler 请求分发
- RoutePredicateHandlerMapping 路由匹配断言
- FilteringWebHandler 过滤器链支持前置后置
RouteLocator
RouteLocator 与 RouteDefinitionLocator:相当于 Bean 和 BeanDefinition 的关系
RouteDefinitionRouteLocator:依赖 RouteDefinition 通过 convertToRoute 将 definition 转换为 route
GatewayProperties properties
List<GatewayFilterFactory> gatewayFilters 过滤器工厂类
List<RoutePredicateFactory> predicates 谓词/断言工厂类
RouteDefinitionLocator routeDefinitionLocator 路由定义定位器
ConversionService conversionService 转换服务
CachingRouteLocator 装饰 CompositeRouteLocator
CompositeRouteLocator 组合 List<RouteLocator> 即包括 RouteDefinitionRouteLocator
- RouteDefinitionLocator的职责是将各种配置源的配置数据转化成RouteDefinition,而RouteLocator的职责是把RouteDefinition转化成Route
RouteDefinitionRouteLocator 类
// RouteDefinition转化成Route
@Override
public Flux<Route> getRoutes() {
//获取到所有的RouteDefinition
return this.routeDefinitionLocator.getRouteDefinitions()
//遍历转换成对应的Route信息
.map(this::convertToRoute)
//TODO: error handling 异常处理
.map(route -> {
if (logger.isDebugEnabled()) {
logger.debug("RouteDefinition matched: " + route.getId());
}
return route;
});
}
convertToRoute功能,谓词组装和过滤器组装
//获取routeDefinition中的Predicate
//(通过combinePredicates方法)
// 不同的谓词器 and 短路操作 predicate = predicate.and(found);
// lookup 方法将 PredicateDefinition 转换为 Predicate 即通过 RoutePredicateFactory
//获取routeDefinition中的GatewayFilter
//(通过gatewayFilters方法向下 loadGatewayFilters 方法通过 GatewayFilterFactory)
//build 路由信息
private Route convertToRoute(RouteDefinition routeDefinition) {
//获取routeDefinition中的Predicate信息
AsyncPredicate<ServerWebExchange> predicate = co