流程

咱们用官网的图片来阐明gateway的流程。当客户端拜访gateway的时候,首先会通过DispatcherHandler#handle调用RoutePredicateHandlerMapping,也就是图中的Gateway Handler Mapping,而后再调用FilteringWebHandler,也就是图中的Gateway Web Handler。
咱们从java8系列晓得,java8的Predicate函数,用来示意一个波及类型T的布尔表达式,RoutePredicateHandlerMapping也是相似的,当返回false的时候,阐明不符合要求,所以他次要是用来判断路由是否匹配,不匹配就返回false。
FilteringWebHandler从名字上看就晓得是用来解决过滤器的,从图上能够看出,他会有一个filter链,用来解决申请前和申请后的操作,相似zuul的pre和post。

Route

下面咱们曾经晓得了gateway的流程,这个时候假如咱们有多个URL,比方example.com/testA和example.com/testB过去,咱们怎么晓得哪些申请能够哪些申请不能够呢?咱们能够用一个大的map来存储这些URL,然而咱们如何针对某个URL进行特定的过滤申请呢,所以这样粗粒度管制是不行的。所以gateway是这样设计的:他为每个URL都配置了相应的规定和路由。如下图所示,每个路由Route都有本人的id,url,predicate以及gatewayFilters。

咱们看到gatewayFilters是s结尾的,就猜到了他是汇合,那predicate没有s,阐明他只能带一个Predicate吗,其实不是的,java8的Predicate有or、and、negate的办法,他也是有的,所以他是这样设计的,当咱们只有一个Predicate的时候:

当调用and办法,这样就有了两个Predicate,他的构造如下,他会把已有的Predicate放入left,再把新增的Predicate放入right。

当再调用and办法的时候,这个时候就有了3个Predicate,他的构造如下:

当然调用or也是相似的,他通过这样的构造,就能够实现和java8的Predicate一样的办法了。

RouteDefinition

下面曾经晓得了Route的构造,然而咱们却不能间接在application.yml文件里配置,起因就是Predicate的简单的构造,所以咱们通过RouteDefinition来简化配置,RouteDefinition的构造如下:

能够看到,和Route的差异就是predicates和predicate的区别。每个汇合的对象,都有一个name和map,map用来寄存各种键值对用于判断是否合乎以及过滤条件。比方咱们的配置文件能够这样写:

spring:  application:    name: gateway  cloud:    gateway:      routes:        - id: route1          uri: https://www.examplea.com          predicates:            - After=2017-01-20T17:42:47.789-07:00[America/Denver]            - Cookie=chocolate, ch.p          filters:            - AddRequestHeader=X-Request-red, blue            - AddRequestParameter=red, blue        - id: route2          uri: https://www.exampleb.com          predicates:            - Path=/red/{segment},/blue/{segment}            - Query=green          filters:            - AddResponseHeader=X-Response-Red, Blue            - RewritePath=/consumingserviceendpoint, /backingserviceendpoint

RoutePredicateFactory

咱们曾经通过RouteDefinition去对应配置文件的配置信息,这些RouteDefinition最终还是要变成Route吧,配置的predicates、filters等最终也要变成Route的属性吧。在gateway中,用RoutePredicateFactory这个工厂类,通过配置信息,生成一个个Predicate。
零碎中曾经定义了十几个RoutePredicateFactory,而后放入map缓存中,他的key就是把类名中的RoutePredicateFactory去掉,比方咱们下面配置的Path,能够晓得他的工厂类就是PathRoutePredicateFactory。
所以咱们在下面配置了多少个predicate,就有对应的工厂类给咱们创立predicate,最初再组装成Route的Predicate构造,Predicate构造下面曾经有图示了。

GatewayFilterFactory

既然Predicate有他的工厂类,依据配置信息生成不同的Predicate,Filter其实也是一样的。
零碎也定义了很多个GatewayFilterFactory,放入map缓存中,他的key就是把类名中的GatewayFilterFactory去掉。比方咱们下面配置的AddResponseHeader,能够晓得他的工厂类就是AddResponseHeaderGatewayFilterFactory。这个设计形式和RoutePredicateFactory是一样的。

Locator

Locator是定位的意思,这里次要有两个Locator,一个是RouteLocator,一个是RouteDefinitionLocator,别离对应着下面的Route和RouteDefinition,也就是说他们是用来定位具体的Route和RouteDefinition的。