Zuul1和Zuul2该如何选择?

介绍

在今年5月中,Netflix终于开源了它的支持异步调用模式的Zuul网关2.0版本,真可谓千呼万唤始出来。从Netflix的官方博文[附录1]中,我们获得的信息也比较令人振奋:

The Cloud Gateway team at Netflix runs and operates more than 80 clusters of Zuul 2, sending traffic to about 100 (and growing) backend service clusters which amounts to more than 1 million requests per second.
Netflix部署了超过80+的Zuul2云网关集群,流量经过Zuul2集群被路由到后端超过100+的微服务,且每秒钟经过Zuul2集群的请求超过100万。

Zuul2看起来很强大,支持异步高并发(Zuul1仅支持同步)特性看起来很亮眼,那么我们是否就应该抛弃Zuul1,开始拥抱Zuul2呢?作为架构师,我们不能盲目追时髦,技术的选择必须基于实践和理性的分析,基于我之前对Zuul1的一线落地实战经验,也基于我近期对Zuul2的一些调研,我会在本文中对Zuul1和Zuul2做一个比较客观的编程模型和优劣分析,同时给出我的个人建议。

Zuul 1.0编程模型和优劣

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m778Vhdp-1581483945487)(http://jskillcloud.com/img/post/20180716/zuul1_blocking.png)]

Zuul1设计比较简单,代码不多也比较容易读懂,它本质上就是一个同步Servlet,采用多线程阻塞模型,如上图所示[图片来自附录4]。

同步Servlet使用thread per connection方式处理请求。简单讲,每来一个请求,Servlet容器要为该请求分配一个线程专门负责处理这个请求,直到响应返回客户端这个线程才会被释放返回容器线程池。如果后台服务调用比较耗时,那么这个线程就会被阻塞,阻塞期间线程资源被占用,不能干其它事情。我们知道Servlet容器线程池的大小是有限制的,当前端请求量大,而后台慢服务比较多时,很容易耗尽容器线程池内的线程,造成容器无法接受新的请求,Netflix为此还专门研发了Hystrix[附录2]熔断组件来解决慢服务耗尽资源问题。

注意在上图Netflix给出的场景中,它的后台服务调用也是启动另外一个IO线程来处理的,但是本质上还是阻塞模式,后台IO线程在处理的时候,前台容器线程仍然是阻塞的。

同步阻塞模式有利有弊,分析如下图:

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值