在上篇文章中我们看到,通过配置如下配置即可对请求进行路由匹配过滤及转发,并且得知SCG内置了多种Filter和Predicate,通过类似- Path=/login
或者- StripPrefix=1
这种就可以匹配到SCG内置的PathRoutePredicateFactory
和StripPrefixGatewayFilterFactory
,那么SCG是怎么对我们的配置进行封装和匹配的呢?
1 | json复制代码spring: |
自动装配
SCG是基于Springboot的,Springboot通过读取spring.factories
文件进行自动装配所需的Bean,spring-cloud-gateway-server
工程中的spring.factories
文件中配置了SCG需要自动装配的类。
1 | json复制代码# Auto Configure |
本文只需要重点关注**GatewayAutoConfiguration
****,SCG的核心配置类。**
从GatewayAutoConfiguration
的注解上可以看到@ConditionalOnProperty``(name = ``"spring.cloud.gateway.enabled"``, ``matchIfMissing = ``true``),通过spring.cloud.gateway.enabled来配置SCG的开启与关闭,并且默认为开启
GatewayAutoConfiguration
中初始化的主要组件
GatewayProperties
:在上篇文章中已经阐明了此类的作用,用来读取封装配置文件中配置的RouteDefinition
、FilterDefinition
、PredicationDefinition
,即路由信息RouteDefinitionLocator
:存储从配置文件中读取的路由信息RouteLocator
:API驱动所需的BeanFilteringWebHandler
:后边的文章会做解析RoutePredicateHandlerMapping
:后边的文章会做解析FilterFactory
:创建org.springframework.cloud.gateway.filter.factory
包下所有的实现了GatewayFilterFactory
的类PredicateFactory
:创建org.springframework.cloud.gateway.handler.predicate
包下所有实现了RoutePredicateFactory
接口的类
GatewayProperties
1 | json复制代码 /** |
1 | json复制代码public class GatewayProperties { |
RouteDefinition路由信息
1 | json复制代码public class RouteDefinition { |
PredicateDefinition断言信息
1 | json复制代码public class PredicateDefinition { |
FilterDefinition过滤器信息
与PredicateDefinition类似。
至此已经将配置中的信息封装到了对应的Definition中了
RouteDefinitionLocator
1 | json复制代码public interface RouteDefinitionLocator { |
主要实现类:PropertiesRouteDefinitionLocator
、CompositeRouteDefinitionLocator
1 | json复制代码/** |
1 | json复制代码/** |
此类会判断路由id是否为空,如果为空则生成一个
1 | json复制代码public class CompositeRouteDefinitionLocator implements RouteDefinitionLocator { |
GatewayFilter Factory beans
**装配org.springframework.cloud.gateway.handler.predicate
包下RoutePredicateFactory
**实现类
1 | json复制代码@Bean |
Predicate Factory beans
装配**org.springframework.cloud.gateway.filter.factory**
包下GatewayFilterFactory
实现类
1 | json复制代码@Bean |
RouteLocator
1 | json复制代码public interface RouteLocator { |
RouteDefinitionRouteLocator
为本节重点,其他两个实现后边会讲解
1 | json复制代码 /** |
RouteDefinitionRouteLocator
此类主要是组装了RouteDefinitionLocator
、RoutePredicateFactory
、GatewayFilterFactory
,从而通过这些信息转换成Route
。
1 | json复制代码public class RouteDefinitionRouteLocator |
getRoutes()
此方法为CachingRouteLocator
调用,返回路由信息。
CachingRouteLocator后边的文章会讲解
1 | json复制代码 @Override |
convertToRoute将RouteDefinition转换为Route
1 | json复制代码/** |
combinePredicates
将PredicateDefinition
合并为一个AsyncPredicate
1 | json复制代码private AsyncPredicate<ServerWebExchange> combinePredicates( |
getFilters
获取所有的过滤器,排序后的
1 | json复制代码private List<GatewayFilter> getFilters(RouteDefinition routeDefinition) { |
总结
至此,主角Route终于现身了。了解清楚了SCG是如何通过配置生成路由及路由的断言和过滤器,接下来分析请求的接入及转发过程。
本文转载自: 掘金