SpringCloudGateWay实战(一)- Zuul及其实现原理
1 微服务架构的两种方式
- 点对点
API-网关,应用最广泛的方式
2 Zuul 的生命周期
在SoringQloud Finchley正式版之前,Spring Cloud推荐的网关是Netfix提供的Zuul:
Zuul 1.x, 是一个基于阻塞IO的API Gateway,基于Servlet 2. 5使用阻塞架构,它不支持任何长连接(如WebSocket)
Zuul的设计模式和Nginx较像,每次I/ 0操作都是从工作线程中选择一 个执行,请求线程被阻塞到工作线程完成,但是差别是Nginx用C++实现,Zuul用Java实现,而JVM本身会有第一次加载较慢的情况,使得Zuul的性能相对较差。
2.x理念更先进,想基于Netty非阻塞和支持长连接,但SpringCloud目前还没有整合。Zuul 2.x的性能较Zuul 1.x有较大提升, 在性能方面,根据官方提供的基准测试, Spring Cloud Gateway的RPS (每秒请求数)是Zuul的1. 6倍。
Spring Cloud Gateway建立在 Spring Framework 5、 Project Reactor和Spring Boot2之上, 使用非阻塞API。Spring Cloud Gateway还支持WebSocket, 并且与Spring紧密集成拥有更好的开发体验
3 上述的缺点
servlet是一个简单的网络I0模型,当请求进入servlet container时, servlet container就会为其绑定一个线程,在并发不高的场景下这种模型是适用的。一旦高并发(此如抽风用jemeter压测),线程数量就会上涨,而线程资源代价是昂贵的(上线文切换,内存消耗大)严重影响请求的处理时间。
在一些简单业务场景下, 不希望为每个request分配个线程, 只需要1个或几个线程就能应对极大并发的请求,这种业务场景下servlet模型没有优势。
所以Zuul 1.X是基于servlet之上的一个阻塞式处理模型,即spring实现了处理所有request请求的个servlet (DispatcherServlet) 并由该servlet阻
Cloud全家桶中有个很重要的组件就是网关,在1.x版本中都是采用的Zuul网关;但在2.x版本中,zuul的升级一直跳票, SpringCloud最后自己研发了一个网关替代Zuul,那就是SpringCloud Gateway : gateway是原zuul1.x版的替代
SpringCloud Gateway是Spring Cloud的一个全新项目,基于Spring 5.0+Spring Boot 2.0和Project Reactor等技术开发的网关,它旨在为
微服务架构提供-种简单有效的统一的API路由管理方式。
SpringCloud Gateway作为Spring Cloud生态系统中的网关,目标是替代Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zuul 2.0上
最新高性能版本进行集成,仍然还是使用的Zuul 1.x非Reactor模式的老版本。而为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty.
Spring Cloud Gateway的目标提供统-的路由方式且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。
因为Zuul1.0已经进入了维护阶段,而且Gateway是SpringCloud团队研发的, 是亲儿子产品,值得信赖。而且很多功能Zuul都没有用起来也非常的简单便捷。
Gateway是基于异步非阻塞模型上进行开发的,性能方面不需要担心。虽然Netflix早就发布了最新的Zuul 2.x,但Spring| Cloud貌似没有整合计划。而且Netflix相关组件都宣布进入维护期;前景无望。
多方面综合考虑Gateway是很理想的网关选择。
4 网关的架构位置
- 注意负载均衡依旧是 Nginx
特性
- 从0开始构建你的api网关--Spring Cloud Gateway网关实战及原理解析
- spring cloud gateway 限流的实现与原理
- spring cloud gateway 限流的实现与原理
- 最全面的改造Zuul网关为Spring Cloud Gateway(包含Zuul核心实现和Spring Cloud Gateway核心实现)
- zookeeper服务发现实战及原理--spring-cloud-zookeeper源码分析
- springcloud微服务实战:Eureka+Zuul+Feign/Ribbon+Hystrix Turbine+SpringConfig+sleuth+zipkin
- Spring Cloud 学习笔记(六)--Gateway 关于IE跨域的坑及实现
- Springboot整合redis实现缓存及其缓存运行原理浅析
- 利用Spring Cloud Zuul实现动态路由示例代码
- Spring Cloud实战小贴士:Zuul统一异常处理(一)
- spring事务-说说Propagation及其实现原理
- spring cloud gateway 实现熔断降级攻略(原来gateway还集成Netty)
- Spring Cloud 学习笔记(五)--Gateway 实现多服务实例的 Swagger聚合
- 基于Spring Cloud Gateway + STOMP 实现WebSocket负载均衡
- SpringCloud zuul简单路由实现
- 【MS】springcloud-gateway 中实现服务之间鉴权,只能从网关访问,禁止直接访问服务
- Spring Cloud实战小贴士:Zuul的饥饿加载(eager-load)使用
- Spring Cloud Gateway重试机制的实现
- Spring Cloud实战(七)-Spring Cloud Netflix Zuul
- Spring Cloud实战小贴士:Zuul统一异常处理(二)