Spring Cloud GateWay路由信息的获取

本文介绍SpringCloud GateWay的路由机制,包括基本术语、特性及整体架构,并详细解析路由信息加载过程。
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();
}

在这里插入图片描述

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值