
如果Gateway Handler Mapping发现请求匹配到了Route,会将请求发送到Gateway Web Handler。它会将请求发送到指定的过滤器链。所有的pre过滤器逻辑先执行,然后会生成代理请求,之后post过滤器逻辑执行
路由:基本的网关构造模块。由ID、目的URI、predicate集合或过滤器集合组成。当predicate为true时,匹配到相应的路由
断言(Predicate):类型为ServerWebExchange。可以匹配任何HTTP请求,例如请求头或者参数
过滤器(Filter):类型为GatewayFilter,由特定的工厂类构造。在这里,请求和响应都可以在请求向下发送前或发送后进行修改
配置断言和过滤器有两种方式,shortcut和fully expanded argument
过滤器名称+等号(=)+以逗号分隔的参数
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://example.org
predicates:
- Cookie=mycookie,mycookievalue
包含name键和args键,arg键是用来配置predicate或过滤器的键值对
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://example.org
predicates:
- name: Cookie
args:
name: mycookie
regexp: mycookievalue
Spring Cloud Gateway包含多个内建的路由断言工厂。多个路由断言工厂可以通过and联合在一起
| Route Predicate Factory | 参数个数 | 参数含义 | 作用 | 示例 |
|---|---|---|---|---|
After |
1 | datetime(javaZonedDateTime类型) |
匹配在指定时间后发生的请求 | After=2017-01-20T17:42:47.789-07:00[America/Denver] |
Before |
1 | datetime(javaZonedDateTime类型) |
匹配在指定时间前发生的请求 | Before=2017-01-20T17:42:47.789-07:00[America/Denver] |
Between |
2 | datetime1 和datetime2 |
匹配在两个时间段内发生的请求 | Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver] |
Cookie |
2 | name和regexp(java正则表达式) |
匹配cookies中包含给定的名称,且值需要与正则表达式匹配 | Cookie=chocolate, ch.p(匹配请求包含名为chocolate的cookie,且值与ch.p表达式匹配) |
Header |
2 | name和regexp(java正则表达式) |
匹配header中包含给定的名称,且值需要与正则表达式匹配 | Header=X-Request-Id, \d+(匹配请求头包含名称X-Request-Id,且值匹配\d+正则表达式) |
Host |
1 | 一组host名称的模式。模式为Ant类型模式,以.分隔 |
匹配HostHeader的值是否与给定的正则表达式匹配 |
Host=.somehost.org,.anotherhost.org(匹配包含Host请求头值为正则表达式的请求) |
Method |
1 | 以,分隔的HTTP方法名 |
匹配指定的请求方法 | Method=GET,POST(匹配请求方法为GET或POST) |
Path |
2 | SpringPathMatcher列表,以及一个可选的matchOptionalTrailingSeparator标志 |
匹配请求路径 | Path=/foo/{segment},/bar/{segment}(如果请求路径为/foo/1、/foo/bar或/bar/baz则匹配) |
Query |
2 | 必须的param参数以及可选的regexp(java正则表达式) |
匹配请求参数 | Query=foo, ba.(匹配请求参数包含foo,且值匹配ba.正则表达式) |
RemoteAddr |
1 | sources列表,值为IPv4或IPv6字符串,如192.168.0.1/16 |
匹配请求的远程地址 | RemoteAddr=192.168.1.1/24 |
Weight |
2 | group和weight(整数) |
每个分组会计算权重 | Weight=group1, 8(80%的请求会转发到指定的uri) |
过滤器可以修改收到的HTTP请求和发出的HTTP响应
| 网关过滤工厂 | 参数个数 | 参数含义 | 作用 | 示例 |
|---|---|---|---|---|
AddRequestHeader |
2 | name、value |
添加指定name的header到请求中 |
AddRequestHeader=X-Request-Foo, Bar(向请求中添加X-Request-FooHeader,值为Bar) |
AddRequestParameter |
2 | name、value |
添加指定name的参数到请求中 |
AddRequestParameter=foo, bar(向请求参数中添加foo=bar) |
AddResponseHeader |
2 | name、value |
添加指定name的header到响应中 |
AddResponseHeader=X-Response-Foo, Bar(向响应中添加X-Response-FooHeader,值为Bar) |
DedupeResponseHeader |
2 | name(包含header名称的list,空格分隔)、strategy(可选,可选的值为RETAIN_FIRST(默认)、RETAIN_LAST、RETAIN_UNIQUE) |
去掉重复的响应头 | DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin(去掉响应头中Access-Control-Allow-Credentials和Access-Control-Allow-Origin中重复的值,防止响应和网关重复增加) |
Hystrix |
1 | name、fallbackUri(当调用fallback时的操作) |
向网关中增加断路器 | Hystrix=myCommandName(将剩余的过滤器包装在HystrixCommand中,command name为myCommandName) |
PrefixPath |
1 | prefix |
增加指定路径 | PrefixPath=/mypath(如果请求调用/hello,则被发送到/mypath/hello) |
PreserveHostHeader |
0 | 设置请求属性,路由过滤器通过它来判断是否需要发送原始host的header,而不是http客户端确定的host的header | PreserveHostHeader |
|
RequestRateLimiter |
n | 可选的keyResolver(实现了KeyResolver接口的bean)、速率限制器特定的参数 |
||
RedirectTo |
2 | status、url |
转发状态码为status,header中Location值为url |
RedirectTo=302, https://acme.org(发送状态码为302且 header中增加Location:https://acme.org执行重定向) |
RemoveHopByHopHeadersFilter |
0 | 移除转发的请求头 | ||
RemoveRequestHeader |
1 | name |
移除请求中指定的header | RemoveRequestHeader=X-Request-Foo(发送前移除X-Request-Fooheader) |
RemoveResponseHeader |
1 | name |
移除响应中指定的header | RemoveResponseHeader=X-Response-Foo(在返回网关客户端前移除X-Response-Fooheader) |
RewritePath |
2 | regexp、replacement |
使用正则表达式重写请求路径 | RewritePath=/foo/(?<segment>.*), /$\{segment}(对于请求路径/foo/bar,会在下一步请求前将请求路径设置为/bar。需要注意的是:由于在yaml中,$需要使用$\替换) |
RewriteResponseHeader |
3 | name、regexp、replacement |
使用正则表达式重写响应header的值 | RewriteResponseHeader=X-Response-Foo, , password=[^&]+, password=***(在完成请求后,对于header值/42?user=ford&password=omg!what&flag=true,会重写为/42?user=ford&password=***&flag=true) |
SaveSession |
0 | 在转发调用前会强制执行WebSession::save操作 |
SaveSession |
|
SecureHeaders |
0 | 会增加一组header值 | ||
SetPath |
1 | template |
使用模板简单地设置请求路径 | SetPath=/{segment}(对于请求路径/foo/bar,在执行后续请求时设置路径为/bar) |
SetResponseHeader |
2 | name、value |
替换指定的header的值为value |
SetResponseHeader=X-Response-Foo, Bar(如果响应包含headerX-Response-Foo:1234,则会替换为X-Response-Foo:Bar) |
SetStatus |
1 | status(必须是HttpStatus的有效值,可以为404或枚举值NOT_FOUND) |
设置响应状态 | SetStatus=401(对任何情况,http响应状态都设置为401) |
StripPrefix |
1 | parts |
path中指定的部分数会在请求下发前被去除 | StripPrefix=2(如果请求为/name/bar/foo,则请求路径会转换为/foo) |
Retry |
4 | retries(重试次数)、statuses(需要重试的http状态码,参考org.springframework.http.HttpStatus值)、methods(需要重试的http方法,参考org.springframework.http.HttpMethod)、series(需要重试的状态码序列,参考org.springframework.http.HttpStatus.Series) |
对指定的状态码等进行重试,并指定重试次数 |
除了上边这些特定作用的过滤工厂外,也可以增加默认的过滤工厂。可以通过spring.cloud.gateway.default-filters来设置
spring:
cloud:
gateway:
default-filters:
- AddResponseHeader=X-Response-Default-Foo, Default-Bar
- PrefixPath=/httpbin