Spring Cloud GateWay 基本术语
-
Route(路由):
网关的基本构建,它由ID、目标URI、断言收集器集合、过滤器集合组成。 -
Predicate(断言):
路由的匹配条件,只有同时满足所有条件时才能通过匹配 -
Filter(过滤器):
对请求进行拦截,通过他你可以在发送下游请求之前或之后修改请求和响应。
特性:
1、支持动态路由
2、持内置到Spring Handler映射中的路由匹配
3、支持HTTP路由匹配
4、过滤器链作用于路由匹配
5、过滤器可以修改HTTP请求头和响应数据
6、支持 Spring Cloud DiscoveryClient 路由配置
7、支持API或者配置驱动
整体架构
1、当客户端发送一个请求的时候,首先它通过请求的路由匹配(
断言
)找到对应的Route 。
2、然后通过一系列的
过滤器链
进行处理,最终到达 Proxied Service 。
3、响应同样的经过一系列的Filter链过滤,最后响应给客户端。
Spring Cloud GateWay 路由 Route 信息加载
Spring Cloud GateWay 是基于SpringBoot的自动装配来完成加载所需要的Bean信息的。 先我们只关注
GatewayAutoConfiguration
这个类。由于我们今天只关注路由信息的加载,所以我们只需关注如下几个方法。
- 1、读取配置路由信息,从这我们可以看到 Spring Cloud GateWay 在启动时就加载了配置文件种的路由信息以及全局过滤器信息
// 从配置文件读取Route信息
@Bean
public GatewayProperties gatewayProperties() {
return new GatewayProperties();
}
@ConfigurationProperties("spring.cloud.gateway") // 从配置文件读取路由信息
@Validated
public class GatewayProperties {
// 路由列表
@NotNull
@Valid
private List<RouteDefinition> routes = new ArrayList<>();
// 作用于所有的路由过滤器,相当于全局过滤器
private List<FilterDefinition> defaultFilters = new ArrayList<>();
// ... 省略部分代码
}
RouteDefinition 路由信息。它里面定义了一个全局路由Id、断言列表、过滤器链和要转发的目的URI。这与我们一开始说的Route概率差不多。对于PredicateDefinition、FilterDefinition 这儿就不做介绍了。
@Validated
public class RouteDefinition {
@NotEmpty // 路由Id
private String id = UUID.randomUUID().toString();
@NotEmpty
@Valid // 配置的断言信息
private List<PredicateDefinition> predicates = new ArrayList<>();
@Valid // 配置的过滤器信息
private List<FilterDefinition> filters = new ArrayList<>();
@NotNull // 要转发的目的URI
private URI uri;
}
-
2、这时我们已经将路由信息封装到
RouteDefinition
中了,那我们是如何获取
RouteDefinition
信息的呢?Spring Cloud GateWay 提供了如下接口
RouteDefinitionLocator(RouteDefinition信息定位器)
来获取
RouteDefinition
信息。
public interface RouteDefinitionLocator {
// 获取 RouteDefinition
Flux<RouteDefinition> getRouteDefinitions();
}
其实现类有如下几种
- CachingRouteDefinitionLocator:缓存方式
- CompositeRouteDefinitionLocator:组合方式
- PropertiesRouteDefinitionLocator:基于属性配置
- DiscoveryClientRouteDefinitionLocator:基于服务发现
-
RouteDefinitionRepository 继承自RouteDefinitionLocator,用于对路由定义的操作(保存、删除路由定义)
在 GatewayAutoConfiguration中我们可以看到如下几个方法,以及加载Spring Cloud GateWay 默认提供的断言和过滤器
// PropertiesRouteDefinitionLocator ,加载了GatewayProperties。从而获取对应的RouteDefinition
@Bean
@ConditionalOnMissingBean
public PropertiesRouteDefinitionLocator propertiesRouteDefinitionLocator(
GatewayProperties properties) {
return new PropertiesRouteDefinitionLocator(properties);
}
// 获取到所有的 RouteDefinition信息定位器 ,然后组合成 CompositeRouteDefinitionLocator
@Bean
@Primary
public RouteDefinitionLocator routeDefinitionLocator(
List<RouteDefinitionLocator> routeDefinitionLocators) {
return new CompositeRouteDefinitionLocator(
Flux.fromIterable(routeDefinitionLocators));
}
// 加载Spring Cloud GateWay 提供过滤器
@Bean
public AddResponseHeaderGatewayFilterFactory addResponseHeaderGatewayFilterFactory() {
return new AddResponseHeaderGatewayFilterFactory();
} // ...
// 加载Spring Cloud GateWay 提供的断言
@Bean
public BeforeRoutePredicateFactory beforeRoutePredicateFactory() {
return new BeforeRoutePredicateFactory();
}
-
3、现在我们已经知道RouteDefinition加载的方式以及如何获取。那在请求的时候我们如何获取Route呢?这时Spring Cloud Gateway 有提供了如下接口
RouteLocator
来获取路由。
public interface RouteLocator {
// 获取路由
Flux<Route> getRoutes();
}
版权声明:本文为qq_44851477原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。