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

  1. 使用的是阻塞式的 API,不支持长连接,比如 websockets。
  2. 底层是servlet,Zuul处理的是http请求
  3. 没有提供异步支持,流控等均由hystrix支持。

gateway

  1. 提供了异步支持,提供了抽象负载均衡,提供了抽象流控
  2. gateway对比zuul多依赖了spring-webflux,在spring的支持下,功能更强大,内部实现了限流、负载均衡等,扩展性也更强,但同时也限制了仅适合于Spring Cloud套件,zuul则可以扩展至其他微服务框架中,其内部没有实现限流、负载均衡等。
  3. SpringCloud Gateway 使用的Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架

gateway 学习

依赖

gateway 项目无需有spring-boot-starter-web 依赖

spring gateway和nginx性能对比 spring gateway与zuul_正则表达式

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 规则

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}