当前位置:   article > 正文

Spring Cloud GateWay路由信息的获取_gateway查看路由信息

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();
	}
  • 1
  • 2
  • 3
  • 4
  • 5
@ConfigurationProperties("spring.cloud.gateway") // 从配置文件读取路由信息
@Validated
public class GatewayProperties {
	// 路由列表
	@NotNull
	@Valid
	private List<RouteDefinition> routes = new ArrayList<>();
	
	// 作用于所有的路由过滤器,相当于全局过滤器
	private List<FilterDefinition> defaultFilters = new ArrayList<>();
	
	// ... 省略部分代码
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 2、这时我们已经将路由信息封装到 RouteDefinition 中了,那我们是如何获取 RouteDefinition信息的呢?Spring Cloud GateWay 提供了如下接口 RouteDefinitionLocator(RouteDefinition信息定位器) 来获取RouteDefinition信息。
public interface RouteDefinitionLocator {
	// 获取 RouteDefinition
	Flux<RouteDefinition> getRouteDefinitions();
}
  • 1
  • 2
  • 3
  • 4

其实现类有如下几种

  • 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();
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 3、现在我们已经知道RouteDefinition加载的方式以及如何获取。那在请求的时候我们如何获取Route呢?这时Spring Cloud Gateway 有提供了如下接口 RouteLocator 来获取路由。
public interface RouteLocator {
	// 获取路由
	Flux<Route> getRoutes();
}
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号