转载

Spring Cloud (9) —— Gateway

关于

术语

  • Route(路由) :这是网关的基本构建块。它由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。
  • Predicate(断言) :这是一个 Java 8 的 Predicate。输入类型是一个 ServerWebExchange。我们可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。
  • Filter(过滤器) :这是org.springframework.cloud.gateway.filter.GatewayFilter的实例,我们可以使用它修改请求和响应。

搭建 Gateway 项目、配置文件风格实现

先实现一个简单功能,把某个固定的请求,转发到指定的 url 上。

  1. 新建 spring-cloud.s08.gateway
  2. pom 中添加依赖

    <dependencies>
        <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
      </dependencies>
  3. 创建配置文件 application.yml

    server:
      port: 32001
    spring:
      application:
        name: gateway
      cloud:
        gateway:
          routes:
            - id: gateway-service # 这个路由的id
              uri: https://spring.io # 跳转到哪里去
              predicates:
                - Path=/projects/spring-cloud # 谓词断言,当访问路径是 /projects/spring-cloud 时,把这个路径接到 uri 指定的地址去
  4. 新建启动类 ..Gateway

    @SpringBootApplication
    public class Gateway {
      public static void main(String[] args) {
        SpringApplication.run(Gateway.class, args);
      }
    }
  5. 启动项目,访问 http://localhost:32001/projects/spring-cloud
    Spring Cloud (9) —— Gateway

编码风格实现

服务化

  1. 先准备好 Eureka Server 和 Album Provider 环境。
  2. pom 中增加 eureka client

    <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
  3. 修改 application.yml 增加 eureka 和 转发请求到服务的配置

    server:
         port: 32001
       eureka:
         instance:
           ip-address: ${spring.cloud.client.ip-address}:${server.port}
           prefer-ip-address: true
       client:
         service-url:
           defaultZone: http://user:123123@eureka-server-1:34001/eureka/,http://user:123123@eureka-server-2:34002/eureka/,http://user:123123@eureka-server-3:34003/eureka/
       spring:
         application:
           name: gateway
         cloud:
           gateway:
             routes:
               - id: gateway-service # 这个路由的id
                 uri: https://spring.io # 跳转到哪里去
                 predicates:
                   - Path=/projects/spring-cloud # 谓词断言,当访问路径是 /projects/spring-cloud 时,把这个路径接到 uri 指定的地址去
               - id: to_album # 路由的id
                 uri: lb://album-provider # lb 表示负载均衡 album-provider 是注册中心中的一个服务
                 predicates:
                   - Path=/album/** # ** 表示任意匹配。该条目表示只要从前部 /album/ 即可
  4. 重启 gateway 项目

    访问 http://localhost:32001/album/albums

    Spring Cloud (9) —— Gateway

    uri: lb://album-provider 带负载均衡

Predicate

Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。可以用于接口请求参数校验、判断新老数据是否有变化需要进行更新操作。

Spring Cloud (9) —— Gateway

datetime

  1. 在时间点之前

    predicates:
      - Before=2019-01-01T00:00:00+08:00/[Asia/Shanghai/]
  2. 在时间点之后

    predicates:
      - After=2019-01-01T00:00:00+08:00/[Asia/Shanghai/]
  3. 在时间点之间

    predicates:
      - Between=2019-01-01T00:00:00+08:00/[Asia/Shanghai/],  2019/-07/-01T00:00:00+08:00/[Asia/Shanghai/]

cookie

cookie名字和正则表达式的value作为两个输入参数,请求的cookie需要匹配cookie名和符合其中value的正则。

- Cookie=cookiename, cookievalue

header

两个入参,一个header的name,一个是正则匹配的value。

- Header=X-Request-Id, /d+

host

host的列表作为参数

- Host=**.somehost.org,**.anotherhost.org

method

通过HTTP的method来匹配路由。

- Method=GET

path

path列表作为参数,使用Spring的 PathMatcher 匹配path,可以设置可选变量。

- Path=/foo/{segment},/bar/{segment},/p/**

其中的segment变量可以通过下面方式获取:

PathMatchInfo variables = exchange.getAttribute(URI_TEMPLATE_VARIABLES_ATTRIBUTE);
Map<String, String> uriVariables = variables.getUriVariables();
String segment = uriVariables.get("segment");

queryparam

通过一个或两个参数来匹配路由,一个是查询的name,一个是查询的正则value。

- Query=baz

路由会匹配所有包含 baz 查询参数的请求。

- Query=foo, ba.

路由会匹配所有包含 baz ,并且 baz 的内容为诸如: barbaz 等符合 ba. 正则规则的请求。

remoteAddr

通过无类别域间路由(IPv4 or IPv6)列表匹配路由。

- RemoteAddr=192.168.1.1/24

路由就会匹配RemoteAddr诸如 192.168.1.10 等请求。

组合使用

server:
  port: 8080
spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
        - id: gateway-service
          uri: https://www.baidu.com
          order: 0
          predicates:
            - Host=**.foo.org
            - Path=/headers
            - Method=GET
            - Header=X-Request-Id, /d+
            - Query=foo, ba.
            - Query=baz
            - Cookie=chocolate, ch.p
            - After=2018-01-20T06:06:06+08:00[Asia/Shanghai]

Gateway Filter

AddRequestHeader

- AddRequestHeader=X-Request-Foo, Bar

对匹配的请求,会额外添加 X-Request-Foo:Bar 的header。

AddRequestParameter

- AddRequestParameter=foo, bar

对匹配的请求,会额外添加 foo=bar 的请求参数。

AddResponseHeader

- AddResponseHeader=X-Response-Foo, Bar

对匹配的请求,响应返回时会额外添加 X-Response-Foo:Bar 的header返回。

FallbackHeaders

Hystrix

Modify Request Body

Modify Response Body

PrefixPath

PreserveHostHeader

RequestRateLimiter

RedirectTo

RemoveNonProxyHeaders

RemoveRequestHeader

RemoveResponseHeader

RewritePath

RewriteResponseHeader

Retry

RequestSize

SaveSession

SecureHeaders

SetPath

SetResponseHeader

SetStatus

StripPrefix

Global Filter

原文  https://segmentfault.com/a/1190000022420594
正文到此结束
Loading...