路由(Route) 是 gateway 中最基本的组件之一,表示一个具体的路由信息载体。主要定义了下面的几个信息:
执行流程大体如下:
(1) Gateway Client向Gateway Server发送请求
(2) 请求首先会被HttpWebHandlerAdapter进行提取组装成网关上下文
(3)然后网关的上下文会传递到DispatcherHandler,它负责将请求分发RoutePredicateHandlerMapping
(4) RoutePredicateHandlerMapping负责路由查找,并根据路由断言判断路由是否可用
(5)如果过断言成功,由FilteringWebHandler创建过滤器链并调用
(6)请求会一次经过PreFilter--微服务--PostFilter的方法,最终返回响应
Predicate(断言, 谓词) 用于进行条件判断,只有断言都返回真,才会真正的执行路由。
断言就是说: 在 什么条件下 才能进行路由转发
SpringCloud Gateway包括许多内置的断言工厂,所有这些断言都与HTTP请求的不同属性匹配。具体如下:
此类型的断言根据时间做判断,主要有三个:
AfterRoutePredicateFactory: 接收一个日期参数,判断请求日期是否晚于指定日期
BeforeRoutePredicateFactory: 接收一个日期参数,判断请求日期是否早于指定日期
BetweenRoutePredicateFactory: 接收两个日期参数,判断请求日期是否在指定时间段内
-After=2019-12-31T23:59:59.789+08:00[Asia/Shanghai]
-RemoteAddr=192.168.1.1/24
-Cookie=chocolate, ch.
-Header=X-Request-Id, \d+
-Host=**.testhost.org
-Method=GET
-Path=/foo/{segment}
PathRoutePredicateFactory:接收一个参数,判断请求的URI部分是否满足路径规则。
-Query=baz, ba.
- 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