一、官方

gateway 官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/

二、是什么

SpringCloud GateWay的目标提供同意的路由方式且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/指标 和限流

三、能干什么

  • 反向代理
  • 鉴权
  • 流量控制
  • 熔断
  • 日志监控
  • image.png

image.png

四、为什么要有GateWay新技术

1、为什么选择GateWay

一方面因为Zuul1.0已经进入了维护的阶段,而且GateWay是SpringCloud团队研发的,是亲儿子产品,值得信赖。

而且很多功能Zuul都没有用起来也非常的简单便捷。

GateWay是基于异步非阻塞模型上进行开发的,性能方面不需要担心,虽然Netflix早就发布了最新的Zuul2.X,
但Spring Cloud貌似没有整合计划。

多方面综合考虑GateWay是很理想的网关选择。

2、SpringCloud GateWay具有的特征

  • 基于Spring Frameword5 ,Project Reactor 和 SpringBoot 2.0进行构建;
  • 动态路由:能够匹配任何请求属性
  • 可以对路由指定Predicate(断言)和Filter(过滤器)
  • 集成Hystrix的断路器功能;
  • 集成Spring Cloud的服务发现功能
  • 易于编写的Predicate(断言)和Filter(过滤器)
  • 请求限流功能;
  • 支持路径重写

3、SpringCloud Gateway与zuul的区别

在SpringCloud Finchley 正式版之前(现在H版),SpringCloud推荐的网关是Netflix提供的zuul。

  1. Zuul1.x 是一个基于阻塞 I/O的API网关
  2. Zuul1.x 基于Servlet2.5使用阻塞架构它不支持任何长连接 (如WebSocket)Zuul的设计模式和Nginx较像,每次I/O操作都是从工作线程中选择一个执行,请求线程被阻塞到工作线程完成,但是差别是Nginx用C++实现,Zuul用java实现,而JVM本身会有第一次加载较慢的情况,使得Zuul的性能相对较差。

  3. Zuul 2.x理念更加先进,像基于Netty非阻塞和支持长连接,但SpringCloud目前还没有整合。Zuul2.x的性能较Zuul 1.x有较大的提升。在性能方面,根据官方提供的基准测试,Spring Cloud Gateway的RPS(每秒请求次数)是Zuul的1.6倍。

  4. Spring Cloud Gateway建立在Spring Framework 5、project Reactor和Spring Boot2 之上,使用非阻塞API
  5. Spring Cloud Gateway 还支持WebSocket,并且与Spring紧密集成拥有更好的开发体验。

4、GateWay非阻塞异步模型

SpringCloud中集成的Zuul版本,采用的是Tomcat容器,使用的是传统的Servlet IO处理模型。

Servlet的生命周期?

Servlet由servlet container进行生命周期管理。container启动时构造servlet对象并调用servlet int()进行初始化;
container运行时接受请求,并为每个请求分配一个线程(一般从线程池中获取空闲线程)然后调用service()。
container关闭时调用servlet destory()销毁servlet

image.png
上述模型的缺点:

servlet是一个简单的网络IO模型,当请求进入servlet container时,servlet container就会为其绑定一个线程,在并发并不高的场景下这种模型是适用的,但是一旦高并发(比如抽风用jemter压),线程数量就会上涨,而线程资源代码是昂贵的(上下文切换,内存消耗大)严重影响请求的处理时间,在一些简单业务场景下,不希望为每个request分配一个线程,只需要1个或几个线程就能应对极大并发的请求,这种场景下servlet模型没有有事

所以zuul 1.x 是基于servlet之上的一个阻塞式处理模型,即spring实现了处理所有request请求的一个servlet(DispatcherServlet)并由该servlet阻塞式处理处理,所以springcloud zuul无法拜托servlet模型的弊端。

image.png

问题:

1、一个Servlet对应几个请求

一个servlet对应多个请求

2、线程和请求的关系,线程和servlet的关系