十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
本文基于Spring Cloud Greenwich SR2
创新互联长期为超过千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为临沧企业提供专业的成都网站设计、成都网站制作,临沧网站改版等技术服务。拥有十载丰富建站经验和众多成功案例,为您定制开发。
[TOC]
Spring Cloud Gateway内置了一系列的路由谓词工厂,以便我们可以在开发中灵活的使用Gateway进行请求转发。我这里将Gateway内置的所有路由谓词工厂整理成了表格,如下:
路由谓词工厂 | 作用 | 参数 |
---|---|---|
After | 当且仅当请求时的时间After配置的时间时,才转发该请求 | 一个带有时区的具体时间 |
Before | 当且仅当请求时的时间Before配置的时间时,才转发该请求 | 一个带有时区的具体时间 |
Between | 当且仅当请求时的时间Between配置的时间段时,才转发该请求 | 一个带有时区的具体时间段 |
Cookie | 当且仅当请求时携带的Cookie名称及值与配置的名称及值相符时,才转发该请求 | Cookie的名称及值,支持使用正则表达式来匹配值 |
Header | 当且仅当请求时携带的Header名称及值与配置的名称及值相符时,才转发该请求 | Header的名称及值,支持使用正则表达式来匹配值 |
Host | 当且仅当请求时名为Host的Header的值与配置的值相符时,才转发该请求 | Host的值,支持配置多个且支持使用通配符 |
Method | 当且仅当请求时所使用的HTTP方法与配置的请求方法相符时,才转发该请求 | HTTP请求方法,例如GET、POST等 |
Path | 当且仅当请求时所访问的路径与配置的路径相匹配时,才转发该请求 | 通配符、占位符或具体的接口路径,可以配置多个 |
Query | 当且仅当请求时所带有的参数名称与配置的参数名称相符时,才转发该请求 | 参数名称和参数值(非必须),支持使用正则表达式对参数值进行匹配 |
RemoteAddr | 当且仅当请求时的IP地址与配置的IP地址相符时,才转发该请求 | IP地址或IP段 |
相关源码也整理成了思维导图:
配置示例:
spring:
cloud:
gateway:
routes:
- id: after_route
uri: lb://example-service
predicates:
# 当且仅当请求时的时间After配置的时间时,才转发该请求
# 若请求时的时间不是After配置的时间时,则会返回404 not found
- After=2018-08-16T11:34:42.917822900+08:00[Asia/Shanghai]
注意:当predicates
配置项只配置了一个Predicate
且没有配置Path
时,Path
的默认值为/**
。所以该段配置会使访问 GATEWAY_URL/**
时转发到 user-center
微服务的/**
Tips:使用以下代码可以打印带有时区的当前时间,然后再自行修改成特定时间即可:
System.out.println(ZonedDateTime.now());
配置示例:
spring:
cloud:
gateway:
routes:
- id: before_route
uri: lb://example-service
predicates:
# 当且仅当请求时的时间Before配置的时间时,才转发该请求
- Before=2018-08-16T11:34:42.917822900+08:00[Asia/Shanghai]
配置示例:
spring:
cloud:
gateway:
routes:
- id: between_route
uri: lb://example-service
predicates:
# 当且仅当请求时的时间Between配置的时间段时,才转发该请求
- Between=2018-08-16T11:34:42.917822900+08:00[Asia/Shanghai], 2028-08-16T11:34:42.917822900+08:00[Asia/Shanghai]
配置示例:
spring:
cloud:
gateway:
routes:
- id: cookie_route
uri: lb://example-service
predicates:
# 当且仅当请求带有名为chocolate,并且值符合正则表达式 ch.p 的Cookie时,才转发该请求
- Cookie=chocolate, ch.p
配置示例:
spring:
cloud:
gateway:
routes:
- id: header_route
uri: lb://example-service
predicates:
# 当且仅当请求带有名为X-Request-Id,并且值符合正则表达式 \d+ 的Header时,才转发该请求
- Header=X-Request-Id, \d+
配置示例:
spring:
cloud:
gateway:
routes:
- id: host_route
uri: lb://example-service
predicates:
# 当且仅当名为Host的Header符合**.somehost.org或**.anotherhost.org时,才转发该请求
# 例如:www.somehost.org、beta.somehost.org、www.anotherhost.org等Host就满足该匹配
- Host=**.somehost.org,**.anotherhost.org
配置示例:
spring:
cloud:
gateway:
routes:
- id: method_route
uri: lb://example-service
predicates:
# 当且仅当HTTP请求方法为GET时,才转发该请求
- Method=GET
配置示例:
spring:
cloud:
gateway:
routes:
- id: path_route
uri: lb://example-service
predicates:
# 当且仅当访问路径是/foo/*、/some-example/list及/bar/**时,才转发该请求
# segment是一个特殊的占位符,表示单层路径匹配,而/**则是多层路径的匹配
- Path=/foo/{segment},/example/list,/bar/**
在Path
中配置的url占位符可以在过滤器工厂通过相关API进行获取,关于这个编程技巧可以参考官方文档的描述:
配置示例1:
spring:
cloud:
gateway:
routes:
- id: query_route
uri: lb://example-service
predicates:
# 当且仅当请求带有名为baz的参数,才转发该请求
- Query=baz
配置示例2:
spring:
cloud:
gateway:
routes:
- id: query_route
uri: lb://example-service
predicates:
# 当且仅当请求带有名为foo的参数,且参数值与正则表达式 ba. 相匹配,才转发该请求
- Query=foo, ba.
配置示例:
spring:
cloud:
gateway:
routes:
- id: remoteaddr_route
uri: lb://example-service
predicates:
# 当且仅当请求IP是192.168.1.1/24网段,例如192.168.1.10,才转发该请求
- RemoteAddr=192.168.1.1/24
官方文档:
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。