zuul1简介
zuul1是netflix在2013年开源的网关组件,大规模的应用在netflix的生产环境中,经受了实践考验。它可以与eureka、ribbon、hystrix等组件配合使用,实现路由转发、负载均衡、熔断等功能。zuul1的核心是一系列过滤器,过滤器简单易于扩展,已经有一些三方库如spring-cloud-zuul-ratelimit等提供了过滤器支持。
zuul1基于servlet构建,使用的是阻塞的io,引入了线程池来处理请求。每个请求都需要独立的线程来处理,从线程池中取出一个工作线程执行,下游微服务返回响应之前这个工作线程一直是阻塞的。
spring cloud gateway简介
spring cloud gateway 是spring cloud的一个全新的api网关项目,目的是为了替换掉zuul1。gateway可以与spring cloud discovery client(如eureka)、ribbon、hystrix等组件配合使用,实现路由转发、负载均衡、熔断等功能,并且gateway还内置了限流过滤器,实现了限流的功能。
gateway基于spring 5、spring boot 2和reactor构建,使用netty作为运行时环境,比较完美的支持异步非阻塞编程。netty使用非阻塞的io,线程处理模型建立在主从reactors多线程模型上。其中boss group轮询到新连接后与client建立连接,生成niosocketchannel,将channel绑定到worker;worker group轮询并处理read、write事件。
产品对比
下边以表格形式对zuul1和gateway作简单对比:
对比项 | zuul1.x | gateway |
---|---|---|
实现 | 基于servlet2.x构建,使用阻塞的api | 基于spring 5、project reactor、spring boot 2,使用非阻塞式的api |
长连接 | 不支持 | 支持 |
不适用场景 | 后端服务响应慢或者高并发场景下,因为线程数量是固定(有限)的,线程容易被耗尽,导致新请求被拒绝。 | 中小流量的项目,使用zuul1.x更合适。 |
限流 | 无 | 内置限流过滤器 |
上手难度 | 同步编程,上手简单 | 门槛较高,上手难度中等 |
spring cloud集成 | 是 | 是 |
sentinel集成 | 是 | 是 |
技术栈沉淀 | zuul1开源近七年,经受考验,稳定成熟。 | 未见实际落地案例 |
github used by | 1007 repositories | 102 repositories |
github issues | 88 open / 2736 closed | 135 open / 850 closed |
注:github used by和github issues统计时间截止2019/8/26。
性能对比
低并发场景
不同的tps,同样的请求时间(50s),对两种网关产品进行压力测试,结果如下:
tps | 测试样本zuul1/gateway,单位个 | 平均响应时间zuul1/gateway, 单位毫秒 | 99%响应时间小于zuul1/gateway,单位毫秒 | 错误比例zuul1/gateway |
---|---|---|---|---|
20tps | 20977 / 20580 | 11 / 14 | 16 / 40 | 0% / 0% |
50tps | 42685 / 50586 | 18 / 12 | 66 / 22 | 0% / 0% |
并发较低的场景下,两种网关的表现差不多
高并发场景
配置同样的线程数(2000),同样的请求时间(5分钟),后端服务在不同的响应时间(休眠时间),对两种网关产品进行压力测试,结果如下:
休眠时间 | 测试样本zuul1/gateway,单位个 | 平均响应时间zuul1/gateway, 单位毫秒 | 99%响应时间小于zuul1/gateway,单位毫秒 | 错误次数zuul1/gateway,单位个 | 错误比例zuul1/gateway |
---|---|---|---|---|---|
休眠100ms | 294134 / 1059321 | 2026 / 546 | 6136 / 1774 | 104 / 0 | 0.04% / 0% |
休眠300ms | 101194 / 399909 | 5595 / 1489 | 15056 / 1690 | 1114 / 0 | 1.10% / 0% |
休眠600ms | 51732 / 201262 | 11768 / 2975 | 27217 / 3203 | 2476 / 0 | 4.79% / 0% |
休眠1000ms | 31896 / 120956 | 19359 / 4914 | 46259 / 5115 | 3598 / 0 | 11.28% / 0% |
zuul网关的tomcat最大线程数为400,hystrix超时时间为100000。
gateway在高并发和后端服务响应慢的场景下比zuul1的表现要好。
官方性能对比
spring cloud gateway的开发者提供了benchmark项目用来对比gateway和zuul1的性能,官方提供的性能对比结果如下:
网关 | avg req/sec/thread | avg latency |
---|---|---|
spring cloud gateway | 3.24k | 6.61ms |
zuul1 | 2.09k | 12.56ms |
none | 11.77k | 2.09ms |
测试工具为wrk,测试时间30秒,线程数为10,连接数为200。
从官方的对比结果来看,gateway的rps是zuul1的1.55倍,平均延迟是zuul1的一半。
总结
zuul1的开源时间很早,netflix、riot、携程、拍拍贷等公司都已经在生产环境中使用,自身经受了实践考验,是生产级的api网关产品。
gateway在2019年离开spring cloud孵化器,应用于生产的案例少,稳定性有待考证。
从性能方面比较,两种产品在流量小的场景下性能表现差不多;并发高的场景下gateway性能要好很多。从开发方面比较,zuul1编程模型简单,易于扩展;gateway编程模型稍难,代码阅读难度要比zuul高不少,扩展也稍复杂一些。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。