spring-cloud-gateway关于Route的定义是gateway工作的导向,首先从定义入手。
Route
5个属性字段,形参构造器是私有的,需要通过Builder模式构造。
三个嵌套类AbstractBuilder、AsyncBuilder、Builder,其中后两个均继承AbstractBuilder抽象嵌套类。
从Route配置模板格式上看到,正是按照Route类字段定义的,FilterDifinition和PredicateDifinition分别用于解析filters和predicates。
RouteDefinition
Route定义类,主要用于解析配置文件中routes字段的初始化,默认情况下gateway采用无参构造函数构造RouteDefinition,然后按行解析属性通过set方法设置属性字段;注意作者提供了一个有参构造器,可以通过格式化字符串初始化。
RouteRefreshListenner
Route刷新监听器,从其定义看其发布\订阅ApplicationEvent事件类型;从引入看依赖于cloud的discovery规范;功能订阅ApplicationEvent类型事件,根据不同区别来刷新routes,通过发布一个RefreshRoutesEvent的事件来实现异步通知。
RouteLocator | RouteDefinitionLocator
Locator(定位器)接口,分别作用于Route和RouteDefinition;Route是RouteDefinition的定义结果,正常情况下Route是会经常变动的(这也是为什么通过Event驱动其刷新机制),RouteDefinition主要用于匹配读取初始化Route的,一次性概念,往往仅在程序启动做初始化加载时候使用(位于GatewayProperties类中)。
CachingRouteDefinitionLocator
CachingRouteDefinitionLocator类并没有被作者启用,从其命名和属性定义上其为RouteDefinition的缓存。
CompositeRouteDefinitionLocator
gateway默认使用的实现类,在GatewayAutoConfiguration中初始化。
InMemoryRouteDefinitionRepository
RouteDefinition内存仓库,与CompositeRouteDefinitionLocator组合作用可以替代CachingRouteDefinitionLocator。
RouteDefinitionRouteLocator
Route核心类,负责从DefinitionRouteLocator加载Routes。在GatewayAutoConfiguration中初始化。
默认从CompositeRouteDefinitionLocator中加载routes。
predicates属性包含所有依赖注入的predicate;
gatewayFilters属性包含所有依赖注入的gatewayFilter(不含GlobalFilter)。
RouteDefinitionRouteLocator#getRoutes()
handler处理请求时通过此方法即时从DefinitionRouteLocator中加载routes,加载流程如下:
1、循环DefinitionRouteLocator中的DefinitionRoute,进入convertToRoute函数;
2、combinePredicates函数处理DefinitionRoute,组合当前Route的所有配置断言;函数结果类型AsyncPredicate<ServerWebExchange>合理利用了Java8中的函数接口,将predicate用函数接口异步组合。
3、getFilters函数处理DefinitionRoute,加载当前Route的所有filter;首先加载gatewayFilterFactories配置的defaultFiters(作用于任何一个Route的gatewayFilter可以在此属性中配置,配置文件会更加清晰简洁,比如熔断、重试filter的配置);其次加载当前DefinitionRoute配置中定义的GatewayFilter(如RewritePath等);最后对filters排序,如果未定义顺序则按照配置文件中的先后循序加载。
4、loadGatewayFilters函数根据路由id来加载filters;首先在map函数中从FilterDefinition装配至GatewayFilter,然后为每个GatewayFilter处理Ordered属性之后返回一个OrderedGatewayFilter集合。
5、async(routeDefinition):使用当前RouteDefinition构建Route#AsyncBuilder对象。
6、asyncPredicate(predicate):设置predicates。
7、replaceFilters(gatewayFilters):设置OrderedGatewayFilters。