1 Gateway核心架构
1.1 基本概念
路由(Route) 是 gateway 中最基本的组件之一,表示一个具体的路由信息载体。主要定义了下面的几个信息:
- id,路由标识符,区别于其他 Route。
- uri,路由指向的目的地 uri,即客户端请求最终被转发到的微服务。
- order,用于多个 Route 之间的排序,数值越小排序越靠前,匹配优先级越高。
- predicate,断言的作用是进行条件判断,只有断言都返回真,才会真正的执行路由。
- filter,过滤器用于修改请求和响应信息。
1.2 执行流程

执行流程大体如下:
 (1) Gateway Client向Gateway Server发送请求
 (2) 请求首先会被HttpWebHandlerAdapter进行提取组装成网关上下文
 (3)然后网关的上下文会传递到DispatcherHandler,它负责将请求分发RoutePredicateHandlerMapping
 (4) RoutePredicateHandlerMapping负责路由查找,并根据路由断言判断路由是否可用
 (5)如果过断言成功,由FilteringWebHandler创建过滤器链并调用
(6)请求会一次经过PreFilter--微服务--PostFilter的方法,最终返回响应
2 断言
Predicate(断言, 谓词) 用于进行条件判断,只有断言都返回真,才会真正的执行路由。
 断言就是说: 在 什么条件下 才能进行路由转发
2.1 内置路由断言工厂
SpringCloud Gateway包括许多内置的断言工厂,所有这些断言都与HTTP请求的不同属性匹配。具体如下:
- 基于Datetime类型的断言工厂
        此类型的断言根据时间做判断,主要有三个:
         AfterRoutePredicateFactory: 接收一个日期参数,判断请求日期是否晚于指定日期
         BeforeRoutePredicateFactory: 接收一个日期参数,判断请求日期是否早于指定日期
         BetweenRoutePredicateFactory: 接收两个日期参数,判断请求日期是否在指定时间段内
- 基于远程地址的断言工厂 RemoteAddrRoutePredicateFactory:接收一个IP地址段,判断请求主机地址是否在地址段中
- 基于Cookie的断言工厂
 CookieRoutePredicateFactory:接收两个参数,cookie 名字和一个正则表达式。 判断请求
 cookie是否具有给定名称且值与正则表达式匹配。
- 基于Header的断言工厂
 HeaderRoutePredicateFactory:接收两个参数,标题名称和正则表达式。 判断请求Header是否具有给定名称且值与正则表达式匹配。
-Header=X-Request-Id, \d+- 基于Host的断言工厂
 HostRoutePredicateFactory:接收一个参数,主机名模式。判断请求的Host是否满足匹配规则。
-Host=**.testhost.org- 基于Method请求方法的断言工厂
 MethodRoutePredicateFactory:接收一个参数,判断请求类型是否跟指定的类型匹配。
-Method=GET- 基于Path请求路径的断言工厂
-Path=/foo/{segment}
 PathRoutePredicateFactory:接收一个参数,判断请求的URI部分是否满足路径规则。
- 基于Query请求参数的断言工厂
 QueryRoutePredicateFactory :接收两个参数,请求param和正则表达式, 判断请求参数是否具有给定名称且值与正则表达式匹配。
-Query=baz, ba.- 基于路由权重的断言工厂
 WeightRoutePredicateFactory:接收一个[组名,权重], 然后对于同一个组内的路由按照权重转发
routes:
-id: weight_route1 uri: host1 predicates:
-Path=/product/**
-Weight=group3, 1
-id: weight_route2 uri: host2 predicates:
-Path=/product/**
-Weight= group3, 9内置路由断言工厂的使用
 接下来我们验证几个内置断言的使用:
server:
port: 7000
spring:
application:
 name: api-gateway
cloud:
 nacos:
  discovery:
   server-addr: 127.0.0.1:8848
 gateway:
  discovery:
   locator:
    enabled: true
  routes:
   - id: product_route
    uri: lb://service-product
    predicates:
     - Path=/product-serv/**
     - Before=2019-11-28T00:00:00.000+08:00 #限制请求时间在2019-11-28之前
     - Method=POST #限制请求方式为POST
    filters:
     - StripPrefix=1









