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 routes = new ArrayList<>();

// 作用于所有的路由过滤器,相当于全局过滤器

private List 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 predicates = new ArrayList<>();

@Valid // 配置的过滤器信息

private List filters = new ArrayList<>();

@NotNull // 要转发的目的URI

private URI uri;

}

2、这时我们已经将路由信息封装到 RouteDefinition 中了,那我们是如何获取 RouteDefinition信息的呢?Spring Cloud GateWay 提供了如下接口 RouteDefinitionLocator(RouteDefinition信息定位器) 来获取RouteDefinition信息。

public interface RouteDefinitionLocator {

// 获取 RouteDefinition

Flux 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 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 getRoutes();

}

文章来源

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: