Spring Cloud GateWay路由信息的获取

  • Post author:
  • Post category:其他




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 版权协议,转载请附上原文出处链接和本声明。