一、介绍
Zuul

Zuul2源码分析

  • 底层是servlet,Zuul处理的是http请求
  • Zuul的抽象写的非常简单易懂,易于扩展,易于debug
  • 提供了两种特殊的抽象类,用户使用起来,比较灵活
  • zuul-core包不依赖Spring,依赖的包很少
  • 没有提供异步支持
  • 流控等均由hystrix支持
GateWay

推荐:详细介绍地址

  • 底层依然是servlet,但使用了webflux,多嵌套了一层框架
  • 理解filter、handler、locator就能灵活使用它,但其大量使用的流式编程容易让人懵逼
  • 提供了非常丰富的filter实现和灵活的RoutePredicateFactory(route匹配规则)
  • 依赖spring-boot-starter-webflux和spring-cloud-starter
  • 提供了异步支持
  • 提供函数式编程api,使用起来方便快捷
  • 提供了抽象流控,并默认实现了RedisRateLimiter
  • 提供了抽象负载均衡
  • 支持HttpClient、WebClient代理请求
  • ps.槽点就是作为Spring家族,注释竟然这么少!
二、相同点
  1. 底层都是servlet
  2. 两者均是web网关,处理的是http请求
三、不同点
  1. 内部实现
  • gateway对比zuul多依赖了spring-webflux,在spring的支持下,功能更强大,内部实现了限流、负载均衡等,扩展性也更强,但同时也限制了仅适合于Spring Cloud套件
  • zuul则可以扩展至其他微服务框架中,其内部没有实现限流、负载均衡等。
  1. 是否支持异步
  • zuul仅支持同步
  • gateway支持异步。理论上gateway则更适合于提高系统吞吐量(但不一定能有更好的性能),最终性能还需要通过严密的压测来决定
  1. 框架设计的角度
  • gateway具有更好的扩展性,并且其已经发布了2.0.0的RELESE版本,稳定性也是非常好的
  1. 编码
  • zuul更加简洁易懂,注释规范清晰,而gateway作为Spring家族的一份子,竟然几乎不注释
  1. 性能
  • WebFlux 模块的名称是 spring-webflux,名称中的 Flux 来源于 Reactor 中的类 Flux。Spring webflux 有一个全新的非堵塞的函数式 Reactive Web 框架,可以用来构建异步的、非堵塞的、事件驱动的服务,在伸缩性方面表现非常好。使用非阻塞API。 Websockets得到支持,并且由于它与Spring紧密集成,所以将会是一个更好的 开发 体验。
  • Zuul 1.x,是一个基于阻塞io的API Gateway。Zuul已经发布了Zuul 2.x,基于Netty,也是非阻塞的,支持长连接,但Spring Cloud暂时还没有整合计划。
四、总结
  1. 总的来说,在微服务架构,如果使用了Spring Cloud生态的基础组件,则Spring Cloud Gateway相比而言更加具备优势,单从流式编程+支持异步上就足以让开发者选择它了。
  2. 对于小型微服务架构或是复杂架构(不仅包括微服务应用还有其他非Spring Cloud服务节点),zuul也是一个不错的选择。