Spring Cloud Gateway 特点

  • 限流
  • 路径重写
  • 动态路由
  • 集成 Spring Cloud DiscoveryClient
  • 集成 Hystrix 断路器

Spring Cloud Gateway 和 Zuul 对比

  1. Zuul 是 Netflix 公司的开源产品,而 Spring Cloud Gateway 是 Spring 家族中的产品,可以和 Spring 家族中的其他组件更好的融合。
  2. Zuul1 不支持长连接,而 Spring Cloud Gateway 支持。例如 websocket。(Zuul 通常指的是 Zuul1 版本)
  3. Spring Cloud Gateway 支持限流。而 zuul 中没有自带限流。
  4. Zuul1 是基于 servlet 框架构建的,采用阻塞、多线程的方式,一个线程处理一次连接请求,这种请求方式在内部延迟严重,如果在故障较多的情况下,会引起存活的连接增多和线程增加,处理效率会低一些。
  5. 而 Spring Cloud Gateway 是基于 Netty 来开发,实现异步和非阻塞,占用资源更小,性能方面更加有优势,强于 zuul。

Spring Cloud Gateway 基本用法

编码式

  1. 首先创建一个 spring boot 项目,添加 spring cloud gateway 模块。
  2. 项目创建成功后,直接在启动类中配置一个 RouteLocator 这样一个 Bean,就可以实现请求转发。
  3. 测试接口:httpbin.org/get
  4. 配置完成后,访问 http://localhost:8090/get 会自动转发到 http://httpbin.org

yml 配置式

1
2
3
4
5
6
7
8
spring:
cloud:
gateway:
routes:
- id: sihai_route
uri: http://httpbin.org
predicates:
- Path=/get

Spring Cloud Gateway 服务化,整合微服务

  1. 首先给 Gateway 添加依赖,将其注册到 Eureka 上。
  2. 配置 yml,将请求转发注释掉。
  3. 配置路由转发。
  4. 接下来就可以通过 gateway 访问到其他注册在 Eureka 上的服务了,访问方式和 zuul 一样,可以代理访问任何注册到 Eureka 上的服务。
  5. http://localhost:8090/PROVIDER/hello 注意 provider 需要大写,与注册到 Eureka 上的服务名一致。

Spring Cloud Gateway 中的 Predicate

参考文章:https://blog.csdn.net/qq_45627009/article/details/122135727

通过时间配置:

  • After:在某个时间点 (ZonedDateTime) 之后的请求会命中该 Route
  • Before:在某个时间点 (ZonedDateTime) 之前的请求会命中该 Route
  • Between:在某时间之间的请求会命中该 Route

其他类型配置:
  • Method:匹配请求的类型
  • Path:匹配请求的 Path(Uri)
  • Query:匹配 GET 请求的参数
  • Weight :分组匹配权重
  • RemoteAddr:匹配 IP 地址
  • Header:匹配请求的 Header 参数
  • Cookie:匹配请求中 Cookie 内容

Spring Cloud Gateway 中的 Filter

Spring Cloud Gateway 中的过滤器分为两大类:

  • GatewayFilter 局部
  • GlobalFilter 全局

AddRequestParameter 过滤器使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
spring:
application:
name: gateway
cloud:
gateway:
routes:
- id: sihai_route
uri: lb://provider
## 过滤器配置
filters:
## 添加请求参数
- AddRequestParameter=name,sihai
predicates:
- Method=Get
## 对client端请求起到路由功能,是否开启通过注册中心进行路由转发的功能
discovery:
locator:
## 开启自动代理
enabled: true