前面我们简单的介绍了Spring Cloud Gateway的使用和原理,以及SpringCloud Gateway的三大组件:路由、断言和过滤器。而路由则是由一个ID、一个目的URL、一组断言工厂和一组Filter过滤器组成。本篇博客主要介绍路由的配置,ID表示一个路由的唯一标识,URL为要转发的地址,这两个比较简单。复杂的就是断言和过滤器的配置。
首先我们介绍断言的配置,Spring Cloud Gateway将路由作为Spring WebFlux HandlerMapping基础设施的一部分进行匹配。Spring Cloud Gateway包括许多内置的路由断言工厂。所有这些断言都匹配HTTP请求的不同属性。可以组合多个路由断言工厂,并通过逻辑and进行组合。Spring Cloud Gateway 提供的断言工厂有时间断言工厂、Cookie断言工厂
Spring Cloud 提供了三种时间断言工厂,After、Before、和Between。分别表示在某个时间点之后、在某个时间点之前、在某段之间之间路由才生效。时间的格式为Java的ZonedDataTime。如下我们在不同的时间点转发到不同的地址。After断言工厂需要一个带ZonedDateTime的时间参数,断言将匹配发生在这个时间之后的时间;Before断言工厂需要一个带ZonedDateTime的时间参数,断言将匹配发生在这个时间之前的时间;Between断言工厂需要两个带ZonedDateTime的时间参数,断言将匹配发生在这两个时间之间的时间。
spring:
cloud:
gateway:
routes: #路由前缀
- id: after_route
uri: https://example1.org
predicates:
- After=2017-01-20T18:00:00.000+08:00[Asia/Shanghai]
- id: before_route
uri: https://exampl2.org
predicates:
- Before=2017-01-20T17:42:47.789+08:00[Asia/Shanghai]
- id: between_route
uri: https://exampl3.org
predicates:
- Between=2017-01-20T17:42:47.789+08:00[Asia/Shanghai], 2017-01-21T17:42:47.789-07:00[Asia/Shanghai]
Cookie断言工厂和Header断言工厂携带两个参数、cookie name或者header name和一个Java正则表达式,即cookie或者header的值,断言将会匹配Cookie或者Header给出的name和value值。如下为这两个断言工厂的用法。
spring:
cloud:
gateway:
routes: #路由前缀
- id: cookie_route
uri: https://cookie.example.org
predicates:
- Cookie=chocolate, ch.p
- id: header_route
uri: https://header.example.org
predicates:
- Header=X-Request-Id, \d+
Method断言工厂需要携带一个http请求的methods参数,断言将会匹配请求的方法类型。Host断言工厂会携带一个主机的匹配模式,模式使用.分隔。如下为这两种断言的示例:
spring:
cloud:
gateway:
routes: #路由前缀
- id: host_route
uri: https://host.example.org
predicates: #匹配主机
- Host=**.somehost.org,**.anotherhost.org
- id: method_route
uri: https://method.example.org
predicates: #匹配GET
- Method=GET,POST
Query路由断言工厂会从请求中获取两个参数,将请求中参数和Query断言中的配置进行匹配,如果请求中包含参数foo=bar,使用下面的示例中的路由才能转发。也可以只限制参数不限制参数值,配置为Query=foo
spring:
cloud:
gateway:
routes:
- id: query_route
uri: https://example.org
predicates:
- Query=foo, ba.
RemoteAddr断言配置一个IPv4或者IPv6网段的字符串或者IP。当请求IP地址在网断之内和配置的IP相同,表示匹配成功,转发请求,否则不能转发。
spring:
cloud:
gateway:
routes:
- id: remoteaddr_route
uri: https://example.org
predicates:
- RemoteAddr=192.168.1.1/24
Path断言需要两个参数: 一个Spring PathMatcher模式的列表 and 可选的标识参数matchOptionalTrailingSeparator.。如下路由将会匹配/foo/1 或者/foo/bar 或者/bar/baz:
spring:
cloud:
gateway:
routes:
- id: host_route
uri: https://example.org
predicates:
- Path=/foo/{segment},/bar/{segment}
路由过滤器可以以某种方式去修改请求的内容或者要响应的内容,在Spring Cloud中有两种过滤器一种称为GatewayFilter、另一种为GlobalFilter,Spring Cloud Gateway 提供了二三十个过滤器,这里不再一一列出,详细的过滤器可以参考官方文档Spring Cloud Gateway 文档。这里简单的介绍几种过滤器的使用,首先我们介绍作为websocket使用的过滤器。
websocket路由过滤器是一个GlobalFilter,如果配置的路由的uri的值为ws或者wss模式,该过滤器会生效,如下为websocket路由示例:
spring:
cloud:
gateway:
routes:
# SockJS route
- id: websocket_sockjs_route
uri: http://localhost:3001
predicates:
- Path=/websocket/info/**
# Normal Websocket route
- id: websocket_route
uri: ws://localhost:3001
predicates:
- Path=/websocket/**
关于过滤器,我们需要了解过滤器主要用来做什么就可以了,并不需要记住Spring Cloud Gateway提供的所有过滤器,因为我们也可以自定义过滤器,实现我们想要的功能,下面的配置为几个过滤器的配置。比如添加Header,添加参数等,
spring:
cloud:
gateway:
routes:
- id: add_response_header_route
uri: https://example.org
filters:
- AddResponseHeader=X-Response-Foo, Bar #添加响应头
- AddRequestHeader=X-Request-Foo, Bar #添加请求参数
- AddRequestParameter=foo, bar #添加请求参数
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin #去掉响应头
因为过滤器太多的原因,这里不再一一列举,后面我们会讲述如何自定义一个GatewayFilter和GlobalFilter,并且将Spring Cloud Gateway与注册中心、熔断与限流结合在一起的使用