赞
踩
特性:
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 是基于SpringBoot的自动装配来完成加载所需要的Bean信息的。 先我们只关注 GatewayAutoConfiguration 这个类。由于我们今天只关注路由信息的加载,所以我们只需关注如下几个方法。
// 从配置文件读取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; }
public interface RouteDefinitionLocator {
// 获取 RouteDefinition
Flux<RouteDefinition> getRouteDefinitions();
}
其实现类有如下几种
// 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(); }
public interface RouteLocator {
// 获取路由
Flux<Route> getRoutes();
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。