spring cloud gateway 学习
- gateway 与zuul
- zuul
- gateway
- gateway 学习
- 依赖
- 配置介绍
- routes 路由
- 代码路由配置
- 配置案例
- Gateway predicates匹配规则
- Gateway filters 规则
gateway 与zuul
spring-cloud-Gateway是spring-cloud的一个子项目。而zuul则是netflix公司的项目,只是spring将zuul集成在spring-cloud中使用而已。
因为zuul2.0连续跳票和zuul1的性能表现不是很理想,所以催生了spring团队开发了Gateway项目。
zuul
- 使用的是阻塞式的 API,不支持长连接,比如 websockets。
- 底层是servlet,Zuul处理的是http请求
- 没有提供异步支持,流控等均由hystrix支持。
gateway
- 提供了异步支持,提供了抽象负载均衡,提供了抽象流控
- gateway对比zuul多依赖了spring-webflux,在spring的支持下,功能更强大,内部实现了限流、负载均衡等,扩展性也更强,但同时也限制了仅适合于Spring Cloud套件,zuul则可以扩展至其他微服务框架中,其内部没有实现限流、负载均衡等。
- SpringCloud Gateway 使用的Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架
gateway 学习
依赖
gateway 项目无需有spring-boot-starter-web 依赖
dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
配置介绍
spring:
cloud:
gateway:
routes:
- id: baidu
uri: http://www.baidu.com
predicates:
- Path=/aa
filters:
- StripPrefix=1
routes 路由
个Route模块由一个 ID,一个目标 URI,一组断言(predicates)和一组过滤器(filters)定义。如果断言为真,则路由匹配,目标URI会被访问。
id:自定义的路由 ID,保持唯一
uri:目标服务地址
predicates:由条件,Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)
代码路由配置
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder){
return builder.routes().route("qq",
r->r.path("/ss")
.uri("http://www.qq.com").predicate(p->p.isNotModified()))
.build();
}
配置案例
spring:
cloud:
gateway:
routes:
- id: wfw-frist //id
uri: lb://wfw-first
predicates:
# 匹配/api/first 开头url
- Path=/api/first/**
filters:
# 匹配重写地址 `去掉/api/first去访问主机`
- RewritePath=/api/first(?<segment>/?.*), $\{segment}
- id: wfw-second
uri: lb://wfw-second
predicates:
- Path=/api/second/**
filters:
# 匹配重写地址
- RewritePath=/api/second(?<segment>/?.*), $\{segment}
Gateway predicates匹配规则
Spring Cloud Gateway 是通过 Spring WebFlux 的 HandlerMapping 做为底层支持来匹配到转发路由,Spring Cloud Gateway 内置了很多 Predicates 工厂,这些 Predicates 工厂通过不同的 HTTP 请求参数来匹配,多个 Predicates 工厂可以组合使用。
gateway中文匹配文档
#具有一个名为chocolate的cookie,该cookie的值与ch.p正则表达式匹配。
- Cookie=chocolate, ch.p
- #如果请求具有名为X-Request-Id的标头,且其值与\d+正则表达式匹配(具有一个或多个数字的值)
- Header=X-Request-Id, \d+
#- 如果请求的Host标头的值为www.somehost.org或beta.somehost.org或www.anotherhost.org,则此路由将匹配。
- Host=**.somehost.org,**.anotherhost.org
- #如果请求方法是GET或POST,则此路由将匹配。
- Method=GET,POST
-#如果请求路径为例如/foo/1或/foo/bar或/bar/baz,则此路由将匹配。
- Path=/foo/{segment},/bar/{segment}
如果请求包含baz查询参数,则此路由将匹配。
- Query=baz
#如果请求包含一个foo查询参数,其值与ba.正则表达式匹配,则此路由将匹配,因此bar和baz将匹配
- Query=foo, ba.
如果请求的远程地址为192.168.1.10,则此路由将匹配。
- RemoteAddr=192.168.1.1/24
-
此路由会将约80%的流量转发到https://weighthigh.org,并将约20%的流量转发到https://weighlow.org
- Weight=group1, 2
- Weight=group1, 8
- id: weight_high
uri: https://weighthigh.org
predicates:
- Weight=group1, 8
- id: weight_low
uri: https://weightlow.org
predicates:
- Weight=group1, 2
Gateway filters 规则
常见:
#这会将X-Request-Foo:Bar标头添加到所有匹配请求的下游请求标头中
- AddRequestHeader=X-Request-Foo, Bar
#AddRequestHeader知道用于匹配路径或主机的URI变量。URI变量可用于该值,并将在运行时扩展。
predicates:
- Path=/foo/{segment}
filters:
- AddRequestHeader=X-Request-Foo, Bar-{segment}
#这会将foo=bar添加到所有匹配请求的下游请求的查询字符串中。
- AddRequestParameter=foo, bar
#这会将X-Response-Foo:Bar标头添加到所有匹配请求的下游响应的标头中
- AddResponseHeader=X-Response-Foo, Bar
#这会将/mypath作为所有匹配请求的路径的前缀。因此,对/hello的请求将被发送到/mypath/hello。
- PrefixPath=/mypath
#这将删除X-Request-Foo标头,然后将其发送到下游。
- RemoveRequestHeader=X-Request-Foo
#对于/foo/bar的请求路径,这将在发出下游请求之前将路径设置为/bar。请注意,由于YAML规范,$\被$所取代。
predicates:
- Path=/foo/**
filters:
- RewritePath=/foo(?<segment>/?.*), $\{segment}