断言工厂
Spring Cloud Gateway包含许多内置的Route Predicate工厂。所有这些断言都匹配HTTP请求的不同属性。多路由断言工厂通过and
组合。
官方提供的路由工厂:
这些断言工厂的配置方式,参照官方文档:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.1.0.RELEASE/single/spring-cloud-gateway.html
这里重点掌握请求路径路由断言的配置方式:
spring:
cloud:
gateway:
routes:
- id: host_route
uri: http://example.org
predicates:
- Path=/foo/{segment},/bar/{segment}
这个路由匹配以/foo或者/bar开头的路径,转发到http:example.org。例如 /foo/1
or /foo/bar
or /bar/baz
.
滤器工厂
路由过滤器允许以某种方式修改传入的HTTP请求或传出的HTTP响应。路径过滤器的范围限定为特定路由。Spring Cloud Gateway包含许多内置的GatewayFilter工厂。
这些过滤器工厂的配置方式,同样参照官方文档:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.1.0.RELEASE/single/spring-cloud-gateway.html
过滤器 有 20 多个 实现类,根据过滤器工厂的用途来划分,可以分为以下几种:Header、Parameter、Path、Body、Status、Session、Redirect、Retry、RateLimiter和Hystrix
这里重点掌握PrefixPath GatewayFilter Factory
上面的配置中,所有的/foo/**
开始的路径都会命中配置的router,并执行过滤器的逻辑,在本案例中配置了RewritePath过滤器工厂,此工厂将/foo/(?.*)重写为{segment},然后转发到http://example.org。比如在网页上请求localhost:8090/foo/forezp,此时会将请求转发到http://example.org/forezp的页面
在开发中由于所有微服务的访问都要经过网关,为了区分不同的微服务,通常会在路径前加上一个标识,例如:访问服务提供方:http://localhost:8090/provider/hello
;访问服务消费方:http://localhost:8090/consumer/hi
如果不重写地址,直接转发的话,转发后的路径为:http://localhost:8070/provider/hello
和http://localhost:8080/consumer/hi
明显多了一个provider或者consumer,导致转发失败。
这时,我们就用上了路径重写,配置如下:
server:
port: 8090
spring:
cloud:
gateway:
routes:
- id: nacos-consumer
uri: http://127.0.0.1:8080
predicates:
- Path=/consumer/**
filters:
- RewritePath=/consumer/(?<segment>.*),/$\{segment}
- id: nacos-provider
uri: http://127.0.0.1:8070
predicates:
- Path=/provider/**
filters:
- RewritePath=/provider/(?<segment>.*),/$\{segment}
注意:Path=/consumer/**
及Path=/provider/**
的变化
测试: