1Zuul 介绍 · SpringCloud微服务实战 · 看云

导航

什么是Zuul?

Zuul 也是Netflix公司做出的系统,主要是Netflix API流量的数量和多样性有时会导致生产问题迅速出现而没有警告。因此Netflix团队做了这么一个统一的入口——网关,可以将所有的API组织起来。
Zuul是所有从设备和web站点到Netflix流媒体应用程序后端请求的前门。作为一个边缘服务应用程序,Zuul被构建来支持动态路由、监视、弹性和安全性。它还可以根据需要将请求路由到多个Amazon自动伸缩组。

Zuul 是一个基于JVM路由和服务端的负载均衡器,Spring Cloud 对Zuul 进行了一系列的封装和时间,并且可以和Eureka、Ribbon、Hystrix、Feign等组件配合使用,对于Spring Cloud 微服务来说不必暴露过多的接口,提升了整个分布式集群的安全性。

为什么构建Zuul?

Zuul使用了一系列不同类型的过滤器,使我们能够快速灵活地将功能应用到服务中。这些过滤器帮助我们执行以下功能:

  • 身份验证和安全性: 识别每个资源的身份验证需求,并拒绝不满足它们的请求
  • 监控: 在边缘跟踪有意义的数据和统计数据,以便给我们一个准确的生产视图
  • 动态路由: 动态路由请求到不同的后端集群
  • 压力测试: 逐渐增加集群的流量,以评估性能
  • 限流: 为每种请求类型分配容量,并丢弃超过限制的请求
  • 静态响应处理: 直接在边缘构建一些响应,而不是将它们转发到内部集群

Zuul 2.0架构

https://github.com/Netflix/zuul/wiki/How-It-Works-2.0
从较高的角度来看,Zuul 2.0是一台Netty服务器,它运行前置过滤器(入站过滤器),然后使用Netty客户端代理请求,然后在运行后置过滤器(出站过滤器)后返回响应。
963aeffcfe8c1460a168c311ae6127b5_MD5.webp

过滤器是Zuul业务逻辑的核心所在。它们具有执行大量动作的能力,并且可以在请求-响应生命周期的不同部分运行,如上图所示。

  • 入站筛选器在路由到源之前执行,并且可以用于身份验证,路由和修饰请求。
  • 端点过滤器可用于返回静态响应,否则内置ProxyEndpoint过滤器会将请求路由到源。
  • 出站筛选器在从源获取响应后执行,可用于度量标准,修饰用户的响应或添加自定义标头。

过滤器也有两种类型:同步和异步。由于我们在事件循环上运行,因此永远不要阻塞过滤器至关重要。如果要阻塞,请在单独的线程池上的异步过滤器中进行阻塞,否则可以使用同步过滤器。

和Zuul 1.*对比

  1. 前端用Netty Server代替Servlet,目的是支持前端异步。后端用Netty Client代替Http Client,目的是支持后端异步。
  2. 过滤器换了一下名字,用Inbound Filters代替Pre-routing Filters,用Endpoint Filter代替Routing Filter,用Outbound Filters代替Post-routing Filters。
  3. 性能提升约20%

本书讲解的Spring Cloud Hoxton.RELEASE支持的Zuul 版本仍然是1.* 系列,用的1.3.1,因为对于Zuul 的使用和介绍仍然以1.3.1 版本为主。

<dependency>
  <groupId>com.netflix.zuul</groupId>
  <artifactId>zuul-core</artifactId>
  <version>1.3.1</version>
  <scope>compile</scope>
  <exclusions>
    <exclusion>
      <artifactId>groovy-all</artifactId>
      <groupId>org.codehaus.groovy</groupId>
    </exclusion>
    <exclusion>
      <artifactId>mockito-all</artifactId>
      <groupId>org.mockito</groupId>
    </exclusion>
  </exclusions>
</dependency>