Spring Cloud 网关路由—Spring Cloud Gateway 配置详解

陶裕
2023-12-01

前面我们简单的介绍了Spring Cloud Gateway的使用和原理,以及SpringCloud Gateway的三大组件:路由、断言和过滤器。而路由则是由一个ID、一个目的URL、一组断言工厂和一组Filter过滤器组成。本篇博客主要介绍路由的配置,ID表示一个路由的唯一标识,URL为要转发的地址,这两个比较简单。复杂的就是断言和过滤器的配置。

首先我们介绍断言的配置,Spring Cloud Gateway将路由作为Spring WebFlux HandlerMapping基础设施的一部分进行匹配。Spring Cloud Gateway包括许多内置的路由断言工厂。所有这些断言都匹配HTTP请求的不同属性。可以组合多个路由断言工厂,并通过逻辑and进行组合。Spring Cloud Gateway 提供的断言工厂有时间断言工厂、Cookie断言工厂

Spring Cloud 提供了三种时间断言工厂,After、Before、和Between。分别表示在某个时间点之后、在某个时间点之前、在某段之间之间路由才生效。时间的格式为Java的ZonedDataTime。如下我们在不同的时间点转发到不同的地址。After断言工厂需要一个带ZonedDateTime的时间参数,断言将匹配发生在这个时间之后的时间;Before断言工厂需要一个带ZonedDateTime的时间参数,断言将匹配发生在这个时间之前的时间;Between断言工厂需要两个带ZonedDateTime的时间参数,断言将匹配发生在这两个时间之间的时间。

spring:
  cloud:
    gateway:
      routes: #路由前缀
        - id: after_route
          uri: https://example1.org
          predicates:
            - After=2017-01-20T18:00:00.000+08:00[Asia/Shanghai]
        - id: before_route
          uri: https://exampl2.org
          predicates:
            - Before=2017-01-20T17:42:47.789+08:00[Asia/Shanghai]
        - id: between_route
          uri: https://exampl3.org
          predicates:
            - Between=2017-01-20T17:42:47.789+08:00[Asia/Shanghai], 2017-01-21T17:42:47.789-07:00[Asia/Shanghai]

Cookie断言工厂和Header断言工厂携带两个参数、cookie name或者header name和一个Java正则表达式,即cookie或者header的值,断言将会匹配Cookie或者Header给出的name和value值。如下为这两个断言工厂的用法。

spring:
  cloud:
    gateway:
      routes: #路由前缀
        - id: cookie_route
          uri: https://cookie.example.org
          predicates:
            - Cookie=chocolate, ch.p
        - id: header_route
          uri: https://header.example.org
          predicates:
            - Header=X-Request-Id, \d+

Method断言工厂需要携带一个http请求的methods参数,断言将会匹配请求的方法类型。Host断言工厂会携带一个主机的匹配模式,模式使用.分隔。如下为这两种断言的示例:

spring:
  cloud:
    gateway:
      routes: #路由前缀
        - id: host_route
          uri: https://host.example.org
          predicates: #匹配主机
            - Host=**.somehost.org,**.anotherhost.org
        - id: method_route
          uri: https://method.example.org
          predicates: #匹配GET
            - Method=GET,POST

Query路由断言工厂会从请求中获取两个参数,将请求中参数和Query断言中的配置进行匹配,如果请求中包含参数foo=bar,使用下面的示例中的路由才能转发。也可以只限制参数不限制参数值,配置为Query=foo

spring:
  cloud:
    gateway:
      routes:
        - id: query_route
          uri: https://example.org
          predicates:
            - Query=foo, ba.

RemoteAddr断言配置一个IPv4或者IPv6网段的字符串或者IP。当请求IP地址在网断之内和配置的IP相同,表示匹配成功,转发请求,否则不能转发。

spring:
  cloud:
    gateway:
      routes:
      - id: remoteaddr_route
        uri: https://example.org
        predicates:
          - RemoteAddr=192.168.1.1/24

Path断言需要两个参数: 一个Spring PathMatcher模式的列表 and 可选的标识参数matchOptionalTrailingSeparator.。如下路由将会匹配/foo/1 或者/foo/bar 或者/bar/baz:

spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: https://example.org
        predicates:
        - Path=/foo/{segment},/bar/{segment}

路由过滤器可以以某种方式去修改请求的内容或者要响应的内容,在Spring Cloud中有两种过滤器一种称为GatewayFilter、另一种为GlobalFilter,Spring Cloud Gateway 提供了二三十个过滤器,这里不再一一列出,详细的过滤器可以参考官方文档Spring Cloud Gateway 文档。这里简单的介绍几种过滤器的使用,首先我们介绍作为websocket使用的过滤器。

websocket路由过滤器是一个GlobalFilter,如果配置的路由的uri的值为ws或者wss模式,该过滤器会生效,如下为websocket路由示例:

spring:
  cloud:
    gateway:
      routes:
      # SockJS route
      - id: websocket_sockjs_route
        uri: http://localhost:3001
        predicates:
        - Path=/websocket/info/**
      # Normal Websocket route
      - id: websocket_route
        uri: ws://localhost:3001
        predicates:
        - Path=/websocket/**

关于过滤器,我们需要了解过滤器主要用来做什么就可以了,并不需要记住Spring Cloud Gateway提供的所有过滤器,因为我们也可以自定义过滤器,实现我们想要的功能,下面的配置为几个过滤器的配置。比如添加Header,添加参数等,

spring:
  cloud:
    gateway:
      routes:
      - id: add_response_header_route
        uri: https://example.org
        filters:
        - AddResponseHeader=X-Response-Foo, Bar #添加响应头
        - AddRequestHeader=X-Request-Foo, Bar   #添加请求参数
        - AddRequestParameter=foo, bar          #添加请求参数
        - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin #去掉响应头

因为过滤器太多的原因,这里不再一一列举,后面我们会讲述如何自定义一个GatewayFilter和GlobalFilter,并且将Spring Cloud Gateway与注册中心、熔断与限流结合在一起的使用

 类似资料: