以下提到的网关均为 Spring Cloud Gateway

太长了,持续更新中,原文链接:

Spring Cloud Gateway
以下提到的网关均为 Spring Cloud Gateway 太长了,持续更新中,原文链接: 需要注意的是: Spring Cloud Gateway 是建立在 Spring Boot 2.x, Spring WebFlux, 和 Project Reactor(基于异步处理),未经慎重考虑请不要在网格项目中使用类似 Spring Data, Spring security 等同步处理的库。 网关大致处理逻辑 术语 * Route: 网关的基本模块,一个 route 包括 route 的唯一 ID,目标 URI,一系列的 predicate(路由断言) 和过滤器,只有当所有断…

需要注意的是:

Spring Cloud Gateway 是建立在 Spring Boot 2.x, Spring WebFlux, 和 Project Reactor(基于异步处理),未经慎重考虑请不要在网格项目中使用类似 Spring Data, Spring security 等同步处理的库。

网关大致处理逻辑

术语

  • Route: 网关的基本模块,一个 route 包括 route 的唯一 ID,目标 URI,一系列的 predicate(路由断言) 和过滤器,只有当所有断言均为真时,使用当前路由。
  • Predicate: Java 8 中的 Predicate 接口,入参是一个 ServerWebExchange 类。比如以下的 lambda 函数可以作为一个 Predicate (预先判断至少存在一个 cookie):
serverWebExchange -> {
        return !serverWebExchange.getRequest().getCookies().isEmpty();
}

 Predicate 的作用是在 route 依据 uri 的路径匹配之后对一些细节进行判断是否向下游发送,是在决定请求是否发送之前进行。

  • Filter: GateWayFilter 类型的过滤器,通过一个特殊的工厂类构造,可以修改经过网关的请求和响应。
    当使用 Filter 处理请求时,已经决定了这个请求一定会发送给下游。

配置 Route 断言和过滤器工厂

配置文件

下面是两个配置文件的例子,二者是等价的

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - Cookie=mycookie,mycookievalue
spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - name: Cookie
          args:
            name: mycookie
            regexp: mycookievalue

路由(Route)断言工厂

Sping Cloud Gateway 内置了许多 Predicate 的工厂,可以通过配置文件使用这些工厂生成 Predicate 实例,例如:

  • After 工厂:断言一个请求在某个时间之后发出(类似的还有 Before 工厂,Between 工厂)
  • Cookie 工厂:使用正则表达式匹配一个 cookie
  • Header 工厂:使用正则表达式匹配一个 Http 头
  • Host 工厂
  • Method 工厂:匹配 Http 方法
  • Path, Query, RemoteAddr,XForwarded RemoteAdder等
  • Weight 工厂:通过设定目标的权重实现静态的负载均衡

路由过滤器工厂

同路由断言工厂,路由过滤工厂也可以通过配置文件快捷的使用内置的路由过滤工厂生成过滤器(GatewayFilter)实例。

  • AddRequestHeader, AddRequestParameter, AddResponseHeader, DedupeResponseHeader
  • DedupeResponseHeader:去除重复的响应头字段
  • CircuitBreaker:指定一个断路器 bean 的名称

由于实在太过(spring 一贯的风格,使尽可能多的功能以配置的方式完成),请自行参考:Spring Cloud Gateway

全局过滤器

全局过滤器对所有 route 生效,但这不是他们与路由器工厂分开写的原因,最主要的原因是可以使用他们实现更广泛的功能,比如对不同协议的转换(全局过滤器的使用不需要确定路由),通过定义一个实现 GlobalFilter 和 Order 的 bean 来定义,比如:

@Bean
public GlobalFilter customFilter() {
    return new CustomGlobalFilter();
}

public class CustomGlobalFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("custom global filter");
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return -1;
    }
}

内置的全局过滤器

  • ForwardRoutingFilter
  • ReactiveLoadBalancerClientFilter
  • The Netty Routing Filter
  • NettyWriteResponseFilter
  • RouteToRequestUrlFilter
  • Websocket Routing Filter

Http 请求头过滤器

在将 http 请求转发给下游的服务时,处理 Http 的头字段,比如 NettyRoutingFilter。

TLS/SSL

对于 TSL/SSL (HTTPS) 也可以在网关处处理,不用再为每个服务都单独的配置证书。再网关上配置 HTTPS,之后内部的服务都直接使用 HTTP 进行通信,以简化网关和内部服务之间的调用。

但是总归是存在安全问题的,网关也可以配置信任的证书(类似于 操作系统内置的 TLS 权威机构的证书)。

一个简易的 demo:

server:
  ssl:
    enabled: true
    key-alias: scg
    key-store-password: scg1234
    key-store: classpath:scg-keystore.p12
    key-store-type: PKCS12
spring:
  cloud:
    gateway:
      httpclient:
        ssl:
          trustedX509Certificates:
          - cert1.pem
          - cert2.pem

同时可以配置建立 TLS 的设置,用来控制 TLS 握手的性能等的问题。一个配置 demo 如下:

spring:
  cloud:
    gateway:
      httpclient:
        ssl:
          handshake-timeout-millis: 10000
          close-notify-flush-timeout-millis: 3000
          close-notify-read-timeout-millis: 0

Spring Cloud Gateway 配置

spring cloud gateway 的配置是通过一系列的 RouteDefinitionLocator 实例进行的。

RouteDefinitionLocator 的接口定义如下:

public interface RouteDefinitionLocator {
    Flux<RouteDefinition> getRouteDefinitions();
}

默认使用 PropertiesRouteDefinitionLocator 利用 @ConfigurationProperties 使用默认的 spring 配置(application.yaml 或者 application.properties)。

使用情况统计

spring-cloud-gateway 可以非常方便的进行接口情况的统计。需要向项目中加入依赖 spring-boot-starter-actuator 以及配置 spring.cloud.gateway.metrics.enabled = true,之后接口的使用情况可以通过 spring-actuator 查看。

HTTP 请求过期(timeout)

访问日志

跨域配置

和监控器(spring-actuator)集成