SpringCloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。
SpringCloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zuul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 2.0之前的非Reactor模式的老版本。而为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty,所以底层使用了高性能的通信框架Netty。。
Spring Cloud Gateway 的目标,不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。
Gateway三大组件分别是路由(Route),断言(Predicates),过滤器(Filter)。
spring:
cloud:
gateway:
routes: #1路由
- id: producer-one
uri: lb://producter-one
predicates: #2通过path断言
- Path=/*/producterone/**
filters: #3过滤器,过滤器可以不用配置
- StripPrefix=1
- id: producer-two
uri: http://localhost:8080
predicates:
- Path=/*/productertwo/
@Configuration
public class GatewayRouteConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder){
return builder.routes()
.route("account-web", r -> r.path("/account/**")
.uri("lb://account-web")
.filters(new MyTestFilter())
)
.route("order-web", r -> r.path("/order/**")
.uri("lb://order-web")
.filters(new MyTestFilter())
)
.build();
}
}
这两种方式配置文件方式更灵活,所以推荐使用配置文件方式。
Path Route Predicate 接收一个匹配路径的参数来判断是否走路由。
spring:
cloud:
gateway:
routes: #1路由
- id: producer-one
uri: lb://producter-one
predicates: #2通过path断言
- Path=/*/producterone/**
filters: #3过滤器,过滤器可以不用配置
- StripPrefix=1
# ? 单个字符 # * 任意多个字符,不包含多级路径 # ** 任意多个字符,包含多级路径
Host Route Predicate 接收一组参数,一组匹配的域名列表,这个模板是一个 ant 分隔的模板,用.
号作为分隔符。它通过参数中的主机地址作为匹配规则。
spring:
cloud:
gateway:
routes:
- id: host_route
uri: http://ityouknow.com
predicates:
- Host=**.ityouknow.com
可以通过是 POST、GET、PUT、DELETE 等不同的请求方式来进行路由。
spring:
cloud:
gateway:
routes:
- id: method_route
uri: http://ityouknow.com
predicates:
- Method=GET
Query Route Predicate 支持传入两个参数,一个是属性名一个为属性值,属性值可以是正则表达式。
spring:
cloud:
gateway:
routes:
- id: query_route
uri: http://ityouknow.com
predicates:
- Query=smile
Predicate 也支持通过设置某个 ip 区间号段的请求才会路由,RemoteAddr Route Predicate 接受 cidr 符号 (IPv4 或 IPv6) 字符串的列表(最小大小为 1),例如 192.168.0.1/16 (其中 192.168.0.1 是 IP 地址,16 是子网掩码)。
spring:
cloud:
gateway:
routes:
- id: remoteaddr_route
uri: http://ityouknow.com
predicates:
- RemoteAddr=192.168.1.1/24
Predicate 支持设置一个时间,在请求进行转发的时候,可以通过判断在这个时间之前或者之后进行转发。比如我们现在设置只有在 2019 年 1 月 1 日才会转发到我的网站,在这之前不进行转发,我就可以这样配置:
spring:
cloud:
gateway:
routes:
- id: time_route
uri: http://ityouknow.com
predicates:
- After=2018-01-20T06:06:06+08:00[Asia/Shanghai]
Cookie Route Predicate 可以接收两个参数,一个是 Cookie name , 一个是正则表达式,路由规则会通过获取对应的 Cookie name 值和正则表达式去匹配,如果匹配上就会执行路由,如果没有匹配上则不执行。
spring:
cloud:
gateway:
routes:
- id: cookie_route
uri: http://ityouknow.com
predicates:
- Cookie=ityouknow, kee.e
# 匹配在什么时间之后的
- After=2017-01-20T17:42:47.789-07:00[America/Denver]
# 匹配在什么时间之前的
- Before=2017-01-20T17:42:47.789-07:00[America/Denver]
# 匹配在某段时间的
- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]
# 匹配cookie名称为`chocolate`的值要符合`ch.p`正则.
- Cookie=chocolate, ch.p
# 匹配header为`X-Request-Id`的值要符合`\d+`正则.
- Header=X-Request-Id, \d+
# 匹配任意符合`**.somehost.org`与`**.anotherhost.org`正则的网址
- Host=**.somehost.org,**.anotherhost.org
# Host还支持模版变量,会保存在`ServerWebExchange.getAttributes()`的 ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE中,以Map形式存储
- Host={sub}.myhost.org
# 匹配GET方法
- Method=GET
# 路径匹配,与Host一样支持模版变量,存在URI_TEMPLATE_VARIABLES_ATTRIBUTE中。
- Path=/foo/{segment},/bar/{segment}
# 匹配存在baz查询参数
- Query=baz
# 匹配存在foo且符合`ba.`正则
- Query=foo, ba.
# 匹配远程地址
- RemoteAddr=192.168.1.1/24
spring:
cloud:
gateway:
routes:
- id: host_foo_path_headers_to_httpbin
uri: http://ityouknow.com
predicates:
- Host=**.foo.org
- Path=/headers
- Method=GET
- Header=X-Request-Id, \d+
- Query=foo, ba.
- Query=baz
- Cookie=chocolate, ch.p
- After=2018-01-20T06:06:06+08:00[Asia/Shanghai]
各种 Predicates 同时存在于同一个路由时,请求必须同时满足所有的条件才被这个路由匹配。
一个请求满足多个路由的谓词条件时,请求只会被首个成功匹配的路由转发.
参考:
Gateway网关简介及使用_AlgoRain的博客-CSDN博客_gatway
SpringCloud Gateway用法详解_无敌小田田的博客-CSDN博客_spring cloud gateway