概述简介
Gateway是在Spring生态系统上构建的API网关服务,基于Spring5,Spring Boot2和Project Reactor等技术开发的网关
Gateway指在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能,例如:熔断、限流、重试等
SpringCloud Gateway作为Spring Cloud生态系统中的网关,目标是替代Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zuul 2.0以上最新高性能版本进行集成,仍然还是使用Zuul 1.x非Reactor模式的老版本。而为了提升网关的性能,Spring Cloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通过框架Netty
Spring Cloud Gateway的目标提供统一的路由方式且基于Filter链的方式提供了网关基本的功能:安全,监控/指标,和限流
Spring Cloud Gateway使用的Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架
我们为什么选择Gateway
1、neflix不太靠谱,zuul2.0一直跳票,迟迟不发布,Gateway是基于异步非阻塞模型上进行开发的,性能方面不需要担心。Netflix相关组件都宣布进入维护期
2、SpringCloud Gateway具有如下特性
基于SpringFramework 5,Project Reactor和Spring Boot 2.0进行构建 ;
动态路由:能够匹配任何请求属性;
可以对路由指定Predicate(断言)和Filter(过滤器)
集成Hystrix的断路器功能;
集成Spring Cloud服务发现功能;
易于编写的Predicate(断言)和Filter(过滤器)
请求限流功能
支持路径重写
3、Spring Cloud 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)Zull的设计模式和Nginx较像,每次I/O操作都是从工作线程中选择一个执行,请求线程被阻塞到工作线程完成,但是差别Nginx用C++实现,Zuul用Java实现,而JVM本身会有第一次加载较慢的情况,使得Zuul性能相对较差
3)Zuul 2.x理念更先进,想基于Netty非阻塞和支持长连接,但SpringCloud目前还没有整合。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之上,使用非阻塞API
5)Spring Cloud Gateway还支持WebSocket,并且与Spring紧密集成拥有更好的开发体验
Zuul1.x模型
Springcloud中集成的Zuul版本,采用的是Tomcat容器,使用的是传统的Servlet IO处理模型。
Servelt的生命周期
servlet container进行生命周期管理。
container启动时构造servlet对象并调用servlet init()进行初始化;
container运行时接受请求,并为每个请求分配一个线程(一般从线程池中获取空闲线程)然后调用service()
container关闭时会调用servelt destory()销毁servlet;
上述模式的缺点:
servelt是一个简单的网络io模型,当请求进入servelt container时,servlet container就会为其绑定一个线程,在并发不高的场景下这种模型是适用的。但是一旦高并发(比如抽风用jemeter压),线程数量就会上涨 ,崦线程资源代价是昂贵的(上下文切换,内存消耗大)严重影响请求的处理时间。在一些简单业务场景下,不希望为每个request分配一个线程,只需要1个或几个线程就能应对极大并发的请求,这种业务场景下servelt模型没有优势
所以Zuul 1.x是基于servelt之上的一个阻塞式处理模型,即spring实现了处理所有的request请求的一个servelt(DispatcherServelt)并由该servelt阻塞式处理。所以Sprinng cloud Zull无法摆脱servlet模型的弊端
Gateway模型
WebFlux是什么
传统的Web框架,比如说:struts2,springmvc等都是基于Servlet API 与Servlet 容器基础之上运行的。
但是Servlet3.1之后有了异步非阻塞的支持。而WebFlux是一个典型非阻塞异步的框架,它的核心是基于Reacor的相关API实现的。相对于传统的web框架来说,它可以运行在诸如Netty,Undertow及支持Servlet 3.1的容器上。非阻塞式+函数式编程(Spring5必须让你使用Java8)
Spring WebFlux是Spring 5.0引入的新的响应式框架,区别于Spring MVC,它不需要依赖Servlet API,它是完全异步非阻塞的,并且基于Reactor来实现响应式流规范
三大核心概念
Gateway工作流程
入门配置
通过微服务名实现动态路由
Predicate的使用
Filter的使用