1)概述
使用说明文档
其他版本api文档请自由查阅:
https://spring.io/projects/spring-cloud-gateway#learn
1.1)是什么
Cloud全家桶中有个很重要的组件就是api网关,在1.x版本中都是采用的Zuul网关,但在2.x版本中,Zuul的升级一直跳票,SpringCLoud最后自己研发了一个网关替代Zuul。(采用了Zuul2的一些升级理念netty+webflux
)
一句话概括:
Spring Cloud Gateway 使用的
Webflux中的reactor-netty响应式编程组件
,底层使用了Netty
通讯框架
1.2)能干吗
- 反向代理
- 鉴权
- 流量控制
- 熔断
- 日志监控
- …
1.3)微服务架构中网关一般用在哪里
1.4)有了Zuul了怎么又出来了gateway
1.4.1 我们为什么选择Gatway
① neflix不太靠谱,zuul2.0一直跳票,迟迟不发布
- Zuul1.0已经进入维护阶段,而且Gateway是SpringCloud团队研发的,值得信赖,而且很多功能Zuul都没有用起来,也非常的简单便捷
- Gateway是基于异步非阻塞模型上进行开发的,性能方面不用担心,虽然Netflix早就发布了最新的Zuul 2.x,但Spring Cloud貌似没有整合计划,而且Netflix相关组件都宣布进入维护期;不知前景如何?
- 多方面综合考虑Gateway是很理想的网关选择
② SpringCloud Gateway具有如下特性:
- 基于Spring Framework 5,Project Reactor 和 Spring Boot 2.0进行构建
- 动态路由:能匹配任何请求属性
- 可以对路由指定 Predicate(断言)和 FIlter(过滤器)
- 集成 Hystrix 的断路器功能
- 集成 Spring Cloud 服务发现功能
- 易于编写的 Predicate(断言)和 FIlter(过滤器)
- 请求限流功能
- 支持路径重写
③ SpringCloud Gateway与Zuul的区别
在Spring Cloud Finchley 正式版之前,Spring Cloud推荐的网关是Netflix提高的Zuul;
- 1、Zuul 1.x,是一个基于阻塞 I/O 的 API Gateway
- 2、Zuul 1.x 基于Servlet 2.5 使用阻塞架构它不支持任何长连接(如 Websocket)Zuul 的设计模式和Nginx较像,每次 I/O 操作都是从工作线程中选择一个执行,请求线程被阻塞直到工作线程完成,但是差别是Nginx用C++实现,Zuul基于Java实现,而JVM本身会有第一次加载较慢的情况,是的Zuul的性能相对较差。
- 3、Zuul 2.x 理念更先进,想基于Netty非阻塞和支持长连接,但Spring Cloud目前还未整合。Zuul 2.x 的性能较 Zuul 1.x 有较大提升。在性能方面,根据官方提供的基准测试,Spring Cloud Gateway 的 RPS(每秒请求数)是 Zuul 的1.6倍。
- 4、Spring Cloud Gateway 建立在 Spring Framework 5,Project Reactor 和 Spring Boot 2.0 之上,使用非阻塞API。
- 5、Spring Cloud Gateway 还支持 Websocket ,并且与Spring 紧密集成,拥有更好的开发体验。
1.4.2)Zuul 1.x 模型
Spring Cloud 中所集成的Zuul版本,采用的是Tomcat容器,使用的是传统的Servlet IO处理模型
Servlet的生命周期:
- servlet由servlet container 进行生命周期管理
- container启动时构造servlet对象并调用servlet init() 进行初始化;
- container运行时接受请求,并为每个请求分配一个线程(一般从线程池中获取空闲线程),然后调用service();
- container关闭时调用 servlet destory() 销毁serlvet;
1.4.3)Gateway模型
WebFlux是什么?
传统的web框架,比如说:struts,Spring mvc等都是基于Servlet API与Servlet容器基础上运行的。
但是
在Servlet 3.1 之后 有了异步非阻塞的支持。而WebFlux是一个典型的异步非阻塞框架,它的核心是基于Reactor 的相关API实现的。相对于传统的web框架来说,它可以运行在诸如Netty,Undertow及支持Servlet 3.1的容器上。非阻塞+函数式编程(Spring 5 必须让你使用Java 8)
Spring WebFlux是Spring 5.0 引入的新的响应式框架,区别于Spring MVC,它不需要依赖Servlet API,它是完全异步非阻塞的,并且基于Reactor来实现响应式流规范。
官网地址:
https://docs.spring.io/spring-framework/docs/5.0.0.RELEASE/spring-framework-reference/web-reactive.html#webflux-introduction
2)三大核心概念
2.1)Route(路由)
路由是构建网关的基本模块,它由 ID,目标 URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由。
2.2 )Predicate(断言)
参考Java8的java.util.function.Predicate开发人员可以匹配Http请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由。
说白了,Predicate就是为了实现一组匹配规则,让请求过来找到对应的Route进行处理
2.3)Filter(过滤器)
指的是Spring 框架中 GatewayFilter的实例,使用过滤器,可以在请求被路由或者之后对请求进行修改。
3)Gateway工作流程( 路由转发+执行过滤器链)
参考文档:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/
客户端向 SPringCloud Gateway 发出请求,然后在Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到Gateway Web Handler。
Handler 再通过指定的过滤器链将请求发送到我们实际的服务执行业务逻辑,然后返回。
Filter 在 “pre” 类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等;
在 “post” 类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。