目录
一、简介
二、Predicate断言详解
三、总结
前面一篇文章,我们介绍有关Gateway新一代网关的概念以及与旧网关Zuul的对比,并通过一些简单的示例说明了gateway中路由如何配置、实现动态路由等,本篇文章我们主要介绍Gateway中强大的Predicate断言并结合示例详细说明其用法。
Spring Cloud官网提供了11中断言的使用方法,如下图所示:
通过Gatewayt9527的启动日志,我们也可以看到:
2020-08-19 16:12:54.275 INFO 16404 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [After]
2020-08-19 16:12:54.275 INFO 16404 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Before]
2020-08-19 16:12:54.275 INFO 16404 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Between]
2020-08-19 16:12:54.275 INFO 16404 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Cookie]
2020-08-19 16:12:54.275 INFO 16404 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Header]
2020-08-19 16:12:54.275 INFO 16404 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Host]
2020-08-19 16:12:54.275 INFO 16404 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Method]
2020-08-19 16:12:54.275 INFO 16404 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Path]
2020-08-19 16:12:54.275 INFO 16404 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Query]
2020-08-19 16:12:54.275 INFO 16404 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [ReadBodyPredicateFactory]
2020-08-19 16:12:54.275 INFO 16404 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [RemoteAddr]
2020-08-19 16:12:54.275 INFO 16404 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Weight]
2020-08-19 16:12:54.275 INFO 16404 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [CloudFoundryRouteService]
前面一篇文章我们只使用到了 The Path Route Predicate Factory 路径路由断言方式,接下来依次对其他几种断言结合示例介绍其用法。
After 路由断言工厂接受一个参数datetime(Java里面的ZonedDateTime类格式的时间)。此断言匹配发生在指定日期时间之后的请求。下面的示例配置了一个after断言:
【a】服务提供者添加如下测试方法:
/**
* 测试gateway网关After断言
*/
@GetMapping("/gatewayAfterRoutePredicate/{name}")
public String gatewayAfterRoutePredicate(@PathVariable("name") String name) {
return "hello, [gatewayAfterRoutePredicate] the name is :" + name;
}
【b】application.yml中加入如下配置:
server:
port: 9527
spring:
application:
name: springcloud-gateway
cloud:
gateway:
routes:
#如下配置表示,当浏览器URL访问localhost:9527/gatewaySimple/**的时候,gateway网关会帮忙转发到http://localhost:8001/gatewaySimple/**去.
- id: payment8001_gatewaySimple #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewaySimple/** # 断言,路径相匹配的进行路由
#如下配置表示,当浏览器URL访问localhost:9527/gatewayLoadBalance/**的时候,gateway网关负载均衡地将请求分发到springcloud-payment-service服务中去.
- id: payment_service_loadbalance #路由ID
uri: lb://springcloud-payment-service #springcloud-payment-service为服务提供者注册到Eureka的应用名称(application name)
predicates:
- Path=/gatewayLoadBalance/** # 断言,路径相匹配的进行路由
########################################【After Route Predicate】######################################################
#如下配置表示,在配置的时间之后访问localhost:9527/gatewayAfterRoutePredicate/**的时候,,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayAfterRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayAfterRoutePredicate/**
# - After=2020-08-19T20:41:32.999+08:00[Asia/Shanghai]
- After=2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
eureka:
instance:
hostname: springcloud-gateway-service
client:
service-url:
register-with-eureka: true
fetch-registry: true
defaultZone: http://springcloud-eureka7001.com:7001/eureka/,http://springcloud-eureka7002.com:7002/eureka/ #集群版Eureka注册中心
注意:ZonedDateTime格式的时间可以通过下面的方法生成:
public class Test {
public static void main(String[] args) {
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println(zonedDateTime);
}
}
【c】测试
重启网关,浏览器访问:http://localhost:9527/gatewayAfterRoutePredicate/weishihuai
如果当前时间小于配置的时间(将时间配置修改为
- After=2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
),那么访问将会报错:
总之,只有在指定的时间之后发出的请求gateway才会帮忙路由。
Before路由断言工厂接受一个参数datetime(Java里面的ZonedDateTime类格式的时间)。此断言匹配发生在指定日期时间之前的请求。下面的示例配置了一个Before断言:
【a】服务提供者添加如下测试方法:
/**
* 测试gateway网关Before断言
*/
@GetMapping("/gatewayBeforeRoutePredicate/{name}")
public String gatewayBeforeRoutePredicate(@PathVariable("name") String name) {
return "hello, [gatewayBeforeRoutePredicate] the name is :" + name;
}
【b】application.yml中加入如下配置:
server:
port: 9527
spring:
application:
name: springcloud-gateway
cloud:
gateway:
routes:
#如下配置表示,当浏览器URL访问localhost:9527/gatewaySimple/**的时候,gateway网关会帮忙转发到http://localhost:8001/gatewaySimple/**去.
- id: payment8001_gatewaySimple #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewaySimple/** # 断言,路径相匹配的进行路由
#如下配置表示,当浏览器URL访问localhost:9527/gatewayLoadBalance/**的时候,gateway网关负载均衡地将请求分发到springcloud-payment-service服务中去.
- id: payment_service_loadbalance #路由ID
uri: lb://springcloud-payment-service #springcloud-payment-service为服务提供者注册到Eureka的应用名称(application name)
predicates:
- Path=/gatewayLoadBalance/** # 断言,路径相匹配的进行路由
########################################【After Route Predicate】######################################################
#如下配置表示,在配置的时间之后访问localhost:9527/gatewayAfterRoutePredicate/**的时候,,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayAfterRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayAfterRoutePredicate/**
# - After=2020-08-19T20:41:32.999+08:00[Asia/Shanghai]
- After=2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
########################################【Before Route Predicate】######################################################
#如下配置表示,在配置的时间之前访问localhost:9527/gatewayBeforeRoutePredicate/**的时候,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayBeforeRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayBeforeRoutePredicate/**
# - After=2020-08-10T20:41:32.999+08:00[Asia/Shanghai]
- After=2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
eureka:
instance:
hostname: springcloud-gateway-service
client:
service-url:
register-with-eureka: true
fetch-registry: true
defaultZone: http://springcloud-eureka7001.com:7001/eureka/,http://springcloud-eureka7002.com:7002/eureka/ #集群版Eureka注册中心
【c】重启网关,浏览器访问:http://localhost:9527/gatewayBeforeRoutePredicate/weishihuai
同上,只有访问时间在配置的时间之前时,断言才为true,网关才会进行跳转。
Between断言:路由之间的断言工厂接受两个参数,datetime1和datetime2,它们是java ZonedDateTime对象。此断言匹配发生在datetime1之后和datetime2之前的请求。datetime2参数必须位于datetime1之后。下面的示例配置了一个between route断言:
【a】服务提供者添加如下测试方法:
/**
* 测试gateway网关Between断言
*/
@GetMapping("/gatewayBetweenRoutePredicate/{name}")
public String gatewayBetweenRoutePredicate(@PathVariable("name") String name) {
return "hello, [gatewayBetweenRoutePredicate] the name is :" + name;
}
【b】application.yml中加入如下配置:
server:
port: 9527
spring:
application:
name: springcloud-gateway
cloud:
gateway:
routes:
#如下配置表示,当浏览器URL访问localhost:9527/gatewaySimple/**的时候,gateway网关会帮忙转发到http://localhost:8001/gatewaySimple/**去.
- id: payment8001_gatewaySimple #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewaySimple/** # 断言,路径相匹配的进行路由
#如下配置表示,当浏览器URL访问localhost:9527/gatewayLoadBalance/**的时候,gateway网关负载均衡地将请求分发到springcloud-payment-service服务中去.
- id: payment_service_loadbalance #路由ID
uri: lb://springcloud-payment-service #springcloud-payment-service为服务提供者注册到Eureka的应用名称(application name)
predicates:
- Path=/gatewayLoadBalance/** # 断言,路径相匹配的进行路由
########################################【After Route Predicate】######################################################
#如下配置表示,在配置的时间之后访问localhost:9527/gatewayAfterRoutePredicate/**的时候,,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayAfterRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayAfterRoutePredicate/**
# - After=2020-08-19T20:41:32.999+08:00[Asia/Shanghai]
- After=2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
########################################【Before Route Predicate】######################################################
#如下配置表示,在配置的时间之前访问localhost:9527/gatewayBeforeRoutePredicate/**的时候,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayBeforeRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayBeforeRoutePredicate/**
# - Before=2020-08-10T20:41:32.999+08:00[Asia/Shanghai]
- Before=2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
########################################【Between Route Predicate】######################################################
#如下配置表示,在配置的时间之间访问localhost:9527/gatewayBetweenRoutePredicate/**的时候,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayBetweenRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayBetweenRoutePredicate/**
- Between=2020-08-10T20:41:32.999+08:00[Asia/Shanghai], 2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
eureka:
instance:
hostname: springcloud-gateway-service
client:
service-url:
register-with-eureka: true
fetch-registry: true
defaultZone: http://springcloud-eureka7001.com:7001/eureka/,http://springcloud-eureka7002.com:7002/eureka/ #集群版Eureka注册中心
【c】重启网关,浏览器访问:http://localhost:9527/gatewayBetweenRoutePredicate/weishihuai
同上,只有访问时间在配置的两个时间之间时,断言才为true,网关才会进行跳转,小伙伴们可以修改一下时间范围,如果请求时间不在那个范围内,gateway不会帮忙路由请求,访问同样会报错。
Cookie断言:Cookie路由断言工厂接受两个参数,Cookie名称和regexp(一个Java正则表达式)。此断言匹配具有给定名称且其值与正则表达式匹配的cookie。下面的示例配置了一个cookie路由断言工厂:
【a】服务提供者添加如下测试方法:
/**
* 测试gateway网关Cookie断言
*/
@GetMapping("/gatewayCookieRoutePredicate/{name}")
public String gatewayCookieRoutePredicate(@PathVariable("name") String name) {
return "hello, [gatewayCookieRoutePredicate] the name is :" + name;
}
【b】application.yml中加入如下配置:
server:
port: 9527
spring:
application:
name: springcloud-gateway
cloud:
gateway:
routes:
#如下配置表示,当浏览器URL访问localhost:9527/gatewaySimple/**的时候,gateway网关会帮忙转发到http://localhost:8001/gatewaySimple/**去.
- id: payment8001_gatewaySimple #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewaySimple/** # 断言,路径相匹配的进行路由
#如下配置表示,当浏览器URL访问localhost:9527/gatewayLoadBalance/**的时候,gateway网关负载均衡地将请求分发到springcloud-payment-service服务中去.
- id: payment_service_loadbalance #路由ID
uri: lb://springcloud-payment-service #springcloud-payment-service为服务提供者注册到Eureka的应用名称(application name)
predicates:
- Path=/gatewayLoadBalance/** # 断言,路径相匹配的进行路由
########################################【After Route Predicate】######################################################
#如下配置表示,在配置的时间之后访问localhost:9527/gatewayAfterRoutePredicate/**的时候,,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayAfterRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayAfterRoutePredicate/**
# - After=2020-08-19T20:41:32.999+08:00[Asia/Shanghai]
- After=2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
########################################【Before Route Predicate】######################################################
#如下配置表示,在配置的时间之前访问localhost:9527/gatewayBeforeRoutePredicate/**的时候,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayBeforeRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayBeforeRoutePredicate/**
# - Before=2020-08-10T20:41:32.999+08:00[Asia/Shanghai]
- Before=2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
########################################【Between Route Predicate】######################################################
#如下配置表示,在配置的时间之间访问localhost:9527/gatewayBetweenRoutePredicate/**的时候,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayBetweenRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayBetweenRoutePredicate/**
- Between=2020-08-10T20:41:32.999+08:00[Asia/Shanghai], 2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
########################################【Cookie Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayCookieRoutePredicate/**的时候需要携带cookie参数,并且值需要与正则表达式匹配,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayCookieRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayCookieRoutePredicate/**
- Cookie=name, weishihuai
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
eureka:
instance:
hostname: springcloud-gateway-service
client:
service-url:
register-with-eureka: true
fetch-registry: true
defaultZone: http://springcloud-eureka7001.com:7001/eureka/,http://springcloud-eureka7002.com:7002/eureka/ #集群版Eureka注册中心
该路由匹配具有一个名为name的cookie的请求,该cookie的值与weishihuai正则表达式匹配。
【c】测试
重启网关,需要需要携带一些cookie参数,这里我们使用curl访问接口进行测试:
只有请求携带cookie,并且cookie的值需要与正则表达式匹配,这样断言才为真,网关才会正常跳转。
Header断言:消息头路由断言工厂接受两个参数,消息头名称和regexp(一个Java正则表达式)。此断言与具有给定名称的头匹配,该头的值与正则表达式匹配。下面的示例配置了一个请求头路由断言:
【a】服务提供者添加如下测试方法:
/**
* 测试gateway网关Header断言
*/
@GetMapping("/gatewayHeaderRoutePredicate/{name}")
public String gatewayHeaderRoutePredicate(@PathVariable("name") String name) {
return "hello, [gatewayHeaderRoutePredicate] the name is :" + name;
}
【b】application.yml中加入如下配置:
server:
port: 9527
spring:
application:
name: springcloud-gateway
cloud:
gateway:
routes:
#如下配置表示,当浏览器URL访问localhost:9527/gatewaySimple/**的时候,gateway网关会帮忙转发到http://localhost:8001/gatewaySimple/**去.
- id: payment8001_gatewaySimple #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewaySimple/** # 断言,路径相匹配的进行路由
#如下配置表示,当浏览器URL访问localhost:9527/gatewayLoadBalance/**的时候,gateway网关负载均衡地将请求分发到springcloud-payment-service服务中去.
- id: payment_service_loadbalance #路由ID
uri: lb://springcloud-payment-service #springcloud-payment-service为服务提供者注册到Eureka的应用名称(application name)
predicates:
- Path=/gatewayLoadBalance/** # 断言,路径相匹配的进行路由
########################################【After Route Predicate】######################################################
#如下配置表示,在配置的时间之后访问localhost:9527/gatewayAfterRoutePredicate/**的时候,,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayAfterRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayAfterRoutePredicate/**
# - After=2020-08-19T20:41:32.999+08:00[Asia/Shanghai]
- After=2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
########################################【Before Route Predicate】######################################################
#如下配置表示,在配置的时间之前访问localhost:9527/gatewayBeforeRoutePredicate/**的时候,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayBeforeRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayBeforeRoutePredicate/**
# - Before=2020-08-10T20:41:32.999+08:00[Asia/Shanghai]
- Before=2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
########################################【Between Route Predicate】######################################################
#如下配置表示,在配置的时间之间访问localhost:9527/gatewayBetweenRoutePredicate/**的时候,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayBetweenRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayBetweenRoutePredicate/**
- Between=2020-08-10T20:41:32.999+08:00[Asia/Shanghai], 2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
########################################【Cookie Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayCookieRoutePredicate/**的时候需要携带cookie参数,并且值需要与正则表达式匹配,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayCookieRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayCookieRoutePredicate/**
- Cookie=name, weishihuai
########################################【Header Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayHeaderRoutePredicate/**的时候请求头需要包含X-Request-Id属性,并且值需要与正则表达式匹配,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayHeaderRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayHeaderRoutePredicate/**
- Header=X-Request-Id, \d+
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
eureka:
instance:
hostname: springcloud-gateway-service
client:
service-url:
register-with-eureka: true
fetch-registry: true
defaultZone: http://springcloud-eureka7001.com:7001/eureka/,http://springcloud-eureka7002.com:7002/eureka/ #集群版Eureka注册中心
【c】测试
只有请求头中携带指定的参数,并且参数的值需要与正则表达式匹配,这样断言才为真,网关才会正常跳转。
Host断言:主机路由断言工厂接受一个参数:主机名模式列表。该模式是一个ant样式的模式。作为分隔符。此断言匹配与模式匹配的主机头。下面的示例配置了一个主机路由断言:
【a】服务提供者添加如下测试方法:
/**
* 测试gateway网关Host断言
*/
@GetMapping("/gatewayHostRoutePredicate/{name}")
public String gatewayHostRoutePredicate(@PathVariable("name") String name) {
return "hello, [gatewayHostRoutePredicate] the name is :" + name;
}
【b】application.yml中加入如下配置:
server:
port: 9527
spring:
application:
name: springcloud-gateway
cloud:
gateway:
routes:
#如下配置表示,当浏览器URL访问localhost:9527/gatewaySimple/**的时候,gateway网关会帮忙转发到http://localhost:8001/gatewaySimple/**去.
- id: payment8001_gatewaySimple #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewaySimple/** # 断言,路径相匹配的进行路由
#如下配置表示,当浏览器URL访问localhost:9527/gatewayLoadBalance/**的时候,gateway网关负载均衡地将请求分发到springcloud-payment-service服务中去.
- id: payment_service_loadbalance #路由ID
uri: lb://springcloud-payment-service #springcloud-payment-service为服务提供者注册到Eureka的应用名称(application name)
predicates:
- Path=/gatewayLoadBalance/** # 断言,路径相匹配的进行路由
########################################【After Route Predicate】######################################################
#如下配置表示,在配置的时间之后访问localhost:9527/gatewayAfterRoutePredicate/**的时候,,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayAfterRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayAfterRoutePredicate/**
# - After=2020-08-19T20:41:32.999+08:00[Asia/Shanghai]
- After=2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
########################################【Before Route Predicate】######################################################
#如下配置表示,在配置的时间之前访问localhost:9527/gatewayBeforeRoutePredicate/**的时候,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayBeforeRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayBeforeRoutePredicate/**
# - Before=2020-08-10T20:41:32.999+08:00[Asia/Shanghai]
- Before=2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
########################################【Between Route Predicate】######################################################
#如下配置表示,在配置的时间之间访问localhost:9527/gatewayBetweenRoutePredicate/**的时候,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayBetweenRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayBetweenRoutePredicate/**
- Between=2020-08-10T20:41:32.999+08:00[Asia/Shanghai], 2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
########################################【Cookie Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayCookieRoutePredicate/**的时候需要携带cookie参数,并且值需要与正则表达式匹配,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayCookieRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayCookieRoutePredicate/**
- Cookie=name, weishihuai
########################################【Header Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayHeaderRoutePredicate/**的时候请求头需要包含X-Request-Id属性,并且值需要与正则表达式匹配,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayHeaderRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayHeaderRoutePredicate/**
- Header=X-Request-Id, \d+
########################################【Host Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayHostRoutePredicate/**的时候请求头需要包含X-Request-Id属性,并且值需要与正则表达式匹配,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayHostRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayHostRoutePredicate/**
- Host=**.somehost.org,**.anotherhost.org
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
eureka:
instance:
hostname: springcloud-gateway-service
client:
service-url:
register-with-eureka: true
fetch-registry: true
defaultZone: http://springcloud-eureka7001.com:7001/eureka/,http://springcloud-eureka7002.com:7002/eureka/ #集群版Eureka注册中心
如果请求的主机头值为www.somehost.org或beta.somehost.org或www.anotherhost.org,则此路由匹配。
【c】测试
只有携带Host参数并且参数值满足配置的正则表达式,gateway才会正确路由,否则报404。
Method断言:方法路由断言工厂接受一个方法参数,该参数是一个或多个参数:要匹配的HTTP方法。下面的示例配置了一个方法路由断言:
【a】服务提供者添加如下测试方法:
/**
* 测试gateway网关Method断言
*/
@GetMapping("/gatewayMethodRoutePredicate/{name}")
public String gatewayMethodRoutePredicate(@PathVariable("name") String name) {
return "hello, [gatewayMethodRoutePredicate] the name is :" + name;
}
【b】application.yml中加入如下配置:
server:
port: 9527
spring:
application:
name: springcloud-gateway
cloud:
gateway:
routes:
#如下配置表示,当浏览器URL访问localhost:9527/gatewaySimple/**的时候,gateway网关会帮忙转发到http://localhost:8001/gatewaySimple/**去.
- id: payment8001_gatewaySimple #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewaySimple/** # 断言,路径相匹配的进行路由
#如下配置表示,当浏览器URL访问localhost:9527/gatewayLoadBalance/**的时候,gateway网关负载均衡地将请求分发到springcloud-payment-service服务中去.
- id: payment_service_loadbalance #路由ID
uri: lb://springcloud-payment-service #springcloud-payment-service为服务提供者注册到Eureka的应用名称(application name)
predicates:
- Path=/gatewayLoadBalance/** # 断言,路径相匹配的进行路由
########################################【After Route Predicate】######################################################
#如下配置表示,在配置的时间之后访问localhost:9527/gatewayAfterRoutePredicate/**的时候,,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayAfterRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayAfterRoutePredicate/**
# - After=2020-08-19T20:41:32.999+08:00[Asia/Shanghai]
- After=2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
########################################【Before Route Predicate】######################################################
#如下配置表示,在配置的时间之前访问localhost:9527/gatewayBeforeRoutePredicate/**的时候,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayBeforeRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayBeforeRoutePredicate/**
# - Before=2020-08-10T20:41:32.999+08:00[Asia/Shanghai]
- Before=2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
########################################【Between Route Predicate】######################################################
#如下配置表示,在配置的时间之间访问localhost:9527/gatewayBetweenRoutePredicate/**的时候,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayBetweenRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayBetweenRoutePredicate/**
- Between=2020-08-10T20:41:32.999+08:00[Asia/Shanghai], 2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
########################################【Cookie Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayCookieRoutePredicate/**的时候需要携带cookie参数,并且值需要与正则表达式匹配,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayCookieRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayCookieRoutePredicate/**
- Cookie=name, weishihuai
########################################【Header Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayHeaderRoutePredicate/**的时候请求头需要包含X-Request-Id属性,并且值需要与正则表达式匹配,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayHeaderRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayHeaderRoutePredicate/**
- Header=X-Request-Id, \d+
########################################【Host Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayHostRoutePredicate/**的时候请求头需要包含X-Request-Id属性,并且值需要与正则表达式匹配,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayHostRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayHostRoutePredicate/**
- Host=**.somehost.org,**.anotherhost.org
########################################【Method Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayMethodRoutePredicate/**只有是get请求,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayMethodRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayMethodRoutePredicate/**
- Method=GET
# - Method=GET,POST
# - Method=POST
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
eureka:
instance:
hostname: springcloud-gateway-service
client:
service-url:
register-with-eureka: true
fetch-registry: true
defaultZone: http://springcloud-eureka7001.com:7001/eureka/,http://springcloud-eureka7002.com:7002/eureka/ #集群版Eureka注册中心
【c】测试:
修改配置文件:- Method=POST,重启网关,再次测试,发现报错,如下图:
只有请求的方法类型与配置的请求类型相符合时,网关才能正确路由。
Path断言:路径路由断言工厂接受两个参数:Spring PathMatcher模式列表和一个称为matchOptionalTrailingSeparator的可选标志。以上所有示例都使用了Path断言,这里就不过多阐述。
Query断言:查询路由断言工厂接受两个参数:一个必需的param和一个可选的regexp(一个Java正则表达式)。下面的示例配置了一个查询路由断言:
【a】服务提供者添加如下测试方法:
/**
* 测试gateway网关Query断言
*/
@GetMapping("/gatewayQueryRoutePredicate/{name}")
public String gatewayQueryRoutePredicate(@PathVariable("name") String name) {
return "hello, [gatewayQueryRoutePredicate] the name is :" + name;
}
【b】application.yml中加入如下配置:
server:
port: 9527
spring:
application:
name: springcloud-gateway
cloud:
gateway:
routes:
#如下配置表示,当浏览器URL访问localhost:9527/gatewaySimple/**的时候,gateway网关会帮忙转发到http://localhost:8001/gatewaySimple/**去.
- id: payment8001_gatewaySimple #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewaySimple/** # 断言,路径相匹配的进行路由
#如下配置表示,当浏览器URL访问localhost:9527/gatewayLoadBalance/**的时候,gateway网关负载均衡地将请求分发到springcloud-payment-service服务中去.
- id: payment_service_loadbalance #路由ID
uri: lb://springcloud-payment-service #springcloud-payment-service为服务提供者注册到Eureka的应用名称(application name)
predicates:
- Path=/gatewayLoadBalance/** # 断言,路径相匹配的进行路由
########################################【After Route Predicate】######################################################
#如下配置表示,在配置的时间之后访问localhost:9527/gatewayAfterRoutePredicate/**的时候,,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayAfterRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayAfterRoutePredicate/**
# - After=2020-08-19T20:41:32.999+08:00[Asia/Shanghai]
- After=2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
########################################【Before Route Predicate】######################################################
#如下配置表示,在配置的时间之前访问localhost:9527/gatewayBeforeRoutePredicate/**的时候,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayBeforeRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayBeforeRoutePredicate/**
# - Before=2020-08-10T20:41:32.999+08:00[Asia/Shanghai]
- Before=2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
########################################【Between Route Predicate】######################################################
#如下配置表示,在配置的时间之间访问localhost:9527/gatewayBetweenRoutePredicate/**的时候,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayBetweenRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayBetweenRoutePredicate/**
- Between=2020-08-10T20:41:32.999+08:00[Asia/Shanghai], 2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
########################################【Cookie Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayCookieRoutePredicate/**的时候需要携带cookie参数,并且值需要与正则表达式匹配,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayCookieRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayCookieRoutePredicate/**
- Cookie=name, weishihuai
########################################【Header Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayHeaderRoutePredicate/**的时候请求头需要包含X-Request-Id属性,并且值需要与正则表达式匹配,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayHeaderRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayHeaderRoutePredicate/**
- Header=X-Request-Id, \d+
########################################【Host Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayHostRoutePredicate/**的时候请求头需要包含X-Request-Id属性,并且值需要与正则表达式匹配,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayHostRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayHostRoutePredicate/**
- Host=**.somehost.org,**.anotherhost.org
########################################【Method Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayMethodRoutePredicate/**只有是get请求,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayMethodRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayMethodRoutePredicate/**
- Method=GET
# - Method=GET,POST
# - Method=POST
########################################【Query Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayQueryRoutePredicate/**请求中需要携带id参数,并且值要是整形类型,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayQueryRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayQueryRoutePredicate/**
# - Query=green
- Query=id, \d+
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
eureka:
instance:
hostname: springcloud-gateway-service
client:
service-url:
register-with-eureka: true
fetch-registry: true
defaultZone: http://springcloud-eureka7001.com:7001/eureka/,http://springcloud-eureka7002.com:7002/eureka/ #集群版Eureka注册中心
【c】测试
只有正确携带配置的参数,并且参数对应的值需要满足正则表达式的要求,gateway网关才会正确路由。
RemoteAddr断言:RemoteAddr路由断言工厂接受一个源列表(最小为1),这些源是cidr符号(IPv4或IPv6)字符串,比如192.168.0.1/16(其中192.168.0.1是一个IP地址,16是一个子网掩码)。下面的示例配置了一个RemoteAddr路由断言:
【a】服务提供者添加如下测试方法:
/**
* 测试gateway网关RemoteAddr断言
*/
@GetMapping("/gatewayRemoteAddrRoutePredicate/{name}")
public String gatewayRemoteAddrRoutePredicate(@PathVariable("name") String name) {
return "hello, [gatewayRemoteAddrRoutePredicate] the name is :" + name;
}
【b】application.yml中加入如下配置:
server:
port: 9527
spring:
application:
name: springcloud-gateway
cloud:
gateway:
routes:
#如下配置表示,当浏览器URL访问localhost:9527/gatewaySimple/**的时候,gateway网关会帮忙转发到http://localhost:8001/gatewaySimple/**去.
- id: payment8001_gatewaySimple #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewaySimple/** # 断言,路径相匹配的进行路由
#如下配置表示,当浏览器URL访问localhost:9527/gatewayLoadBalance/**的时候,gateway网关负载均衡地将请求分发到springcloud-payment-service服务中去.
- id: payment_service_loadbalance #路由ID
uri: lb://springcloud-payment-service #springcloud-payment-service为服务提供者注册到Eureka的应用名称(application name)
predicates:
- Path=/gatewayLoadBalance/** # 断言,路径相匹配的进行路由
########################################【After Route Predicate】######################################################
#如下配置表示,在配置的时间之后访问localhost:9527/gatewayAfterRoutePredicate/**的时候,,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayAfterRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayAfterRoutePredicate/**
# - After=2020-08-19T20:41:32.999+08:00[Asia/Shanghai]
- After=2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
########################################【Before Route Predicate】######################################################
#如下配置表示,在配置的时间之前访问localhost:9527/gatewayBeforeRoutePredicate/**的时候,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayBeforeRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayBeforeRoutePredicate/**
# - Before=2020-08-10T20:41:32.999+08:00[Asia/Shanghai]
- Before=2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
########################################【Between Route Predicate】######################################################
#如下配置表示,在配置的时间之间访问localhost:9527/gatewayBetweenRoutePredicate/**的时候,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayBetweenRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayBetweenRoutePredicate/**
- Between=2020-08-10T20:41:32.999+08:00[Asia/Shanghai], 2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
########################################【Cookie Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayCookieRoutePredicate/**的时候需要携带cookie参数,并且值需要与正则表达式匹配,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayCookieRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayCookieRoutePredicate/**
- Cookie=name, weishihuai
########################################【Header Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayHeaderRoutePredicate/**的时候请求头需要包含X-Request-Id属性,并且值需要与正则表达式匹配,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayHeaderRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayHeaderRoutePredicate/**
- Header=X-Request-Id, \d+
########################################【Host Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayHostRoutePredicate/**的时候请求头需要包含X-Request-Id属性,并且值需要与正则表达式匹配,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayHostRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayHostRoutePredicate/**
- Host=**.somehost.org,**.anotherhost.org
########################################【Method Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayMethodRoutePredicate/**只有是get请求,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayMethodRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayMethodRoutePredicate/**
- Method=GET
# - Method=GET,POST
# - Method=POST
########################################【Query Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayQueryRoutePredicate/**请求中需要携带id参数,并且值要是整形类型,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayQueryRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayQueryRoutePredicate/**
# - Query=green
- Query=id, \d+
########################################【RemoteAddr Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayRemoteAddrRoutePredicate/**请求的远程地址为127.0.0.1,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayRemoteAddrRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayRemoteAddrRoutePredicate/**
# - RemoteAddr=127.0.0.1
- RemoteAddr=192.168.35.105
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
eureka:
instance:
hostname: springcloud-gateway-service
client:
service-url:
register-with-eureka: true
fetch-registry: true
defaultZone: http://springcloud-eureka7001.com:7001/eureka/,http://springcloud-eureka7002.com:7002/eureka/ #集群版Eureka注册中心
【c】测试
浏览器访问:http://127.0.0.1:9527/gatewayRemoteAddrRoutePredicate/weishihuai
可见,当请求从本机127.0.0.0发出时,
路由可以正确路由,下面我们修改配置文件中的远程地址为【- RemoteAddr=192.168.35.105】,重新访问,发现报错,如下图:
Weight断言:权重路由断言工厂有两个参数:组和权重(int)。权重按组计算。下面的示例配置了一个权重路由断言:
【a】服务提供者添加如下测试方法:
/**
* 测试gateway网关Weight断言
*/
@GetMapping("/gatewayWeightRoutePredicate/{name}")
public String gatewayWeightRoutePredicate(@PathVariable("name") String name) {
return "hello, [gatewayWeightRoutePredicate] the name is :" + name + ", the server port is " + serverPort;
}
由于需要使用到权重,所有两个服务提供方payment8001和8002都加上上述方法。
【b】application.yml中加入如下配置:
server:
port: 9527
spring:
application:
name: springcloud-gateway
cloud:
gateway:
routes:
#如下配置表示,当浏览器URL访问localhost:9527/gatewaySimple/**的时候,gateway网关会帮忙转发到http://localhost:8001/gatewaySimple/**去.
- id: payment8001_gatewaySimple #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewaySimple/** # 断言,路径相匹配的进行路由
#如下配置表示,当浏览器URL访问localhost:9527/gatewayLoadBalance/**的时候,gateway网关负载均衡地将请求分发到springcloud-payment-service服务中去.
- id: payment_service_loadbalance #路由ID
uri: lb://springcloud-payment-service #springcloud-payment-service为服务提供者注册到Eureka的应用名称(application name)
predicates:
- Path=/gatewayLoadBalance/** # 断言,路径相匹配的进行路由
########################################【After Route Predicate】######################################################
#如下配置表示,在配置的时间之后访问localhost:9527/gatewayAfterRoutePredicate/**的时候,,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayAfterRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayAfterRoutePredicate/**
# - After=2020-08-19T20:41:32.999+08:00[Asia/Shanghai]
- After=2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
########################################【Before Route Predicate】######################################################
#如下配置表示,在配置的时间之前访问localhost:9527/gatewayBeforeRoutePredicate/**的时候,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayBeforeRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayBeforeRoutePredicate/**
# - Before=2020-08-10T20:41:32.999+08:00[Asia/Shanghai]
- Before=2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
########################################【Between Route Predicate】######################################################
#如下配置表示,在配置的时间之间访问localhost:9527/gatewayBetweenRoutePredicate/**的时候,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayBetweenRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayBetweenRoutePredicate/**
- Between=2020-08-10T20:41:32.999+08:00[Asia/Shanghai], 2020-08-29T20:41:32.999+08:00[Asia/Shanghai]
########################################【Cookie Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayCookieRoutePredicate/**的时候需要携带cookie参数,并且值需要与正则表达式匹配,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayCookieRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayCookieRoutePredicate/**
- Cookie=name, weishihuai
########################################【Header Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayHeaderRoutePredicate/**的时候请求头需要包含X-Request-Id属性,并且值需要与正则表达式匹配,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayHeaderRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayHeaderRoutePredicate/**
- Header=X-Request-Id, \d+
########################################【Host Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayHostRoutePredicate/**的时候请求头需要包含X-Request-Id属性,并且值需要与正则表达式匹配,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayHostRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayHostRoutePredicate/**
- Host=**.somehost.org,**.anotherhost.org
########################################【Method Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayMethodRoutePredicate/**只有是get请求,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayMethodRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayMethodRoutePredicate/**
- Method=GET
# - Method=GET,POST
# - Method=POST
########################################【Query Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayQueryRoutePredicate/**请求中需要携带id参数,并且值要是整形类型,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayQueryRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayQueryRoutePredicate/**
# - Query=green
- Query=id, \d+
########################################【RemoteAddr Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayRemoteAddrRoutePredicate/**请求的远程地址为127.0.0.1,gateway网关将请求分发到http://localhost:8001中去.
- id: payment_service_gatewayRemoteAddrRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayRemoteAddrRoutePredicate/**
# - RemoteAddr=127.0.0.1
- RemoteAddr=192.168.35.105
########################################【Weight Route Predicate】######################################################
#如下配置表示,在访问localhost:9527/gatewayWeightRoutePredicate/**请求的远程地址为127.0.0.1,gateway网关将请求分发到http://localhost:8001中去.
#路径将把80%的流量转发到http://localhost:8001,并将20%的流量转发到http://localhost:8002
- id: payment_service8001_gatewayWeightRoutePredicate #路由ID
uri: http://localhost:8001 #指定payment8001的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayWeightRoutePredicate/**
- Weight=group1, 8
- id: payment_service8002_gatewayWeightRoutePredicate #路由ID
uri: http://localhost:8002 #指定payment8002的访问地址,即匹配后提供服务的路由地址
predicates:
- Path=/gatewayWeightRoutePredicate/**
- Weight=group1, 2
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
eureka:
instance:
hostname: springcloud-gateway-service
client:
service-url:
register-with-eureka: true
fetch-registry: true
defaultZone: http://springcloud-eureka7001.com:7001/eureka/,http://springcloud-eureka7002.com:7002/eureka/ #集群版Eureka注册中心
【c】测试
浏览器访问几次:http://localhost:9527/gatewayWeightRoutePredicate/weishihuai
发现访问到payment8001端口的几率比8002端口的大。
本文详细介绍了Spring Cloud Gateway官网提到的11中Predicate断言,并且每种类型都有一个简单的示例说明,以上相关项目的代码我已经放在Gitee上,有需要的小伙伴可以去拉取进行学习:https://gitee.com/weixiaohuai/springcloud_Hoxton,由于笔者水平有限,如有不对之处,还请小伙伴们指正,相互学习,一起进步。