Zuul 1 Core

20th August 2020 at 2:19pm

Zuul 是 Netflix 的服务网关。

核心模型

Zuul 本质上是一个可编程路由服务,并提供了在路由前后执行代码的能力。Zuul 提供了 filter 机制来实现。filter 有几个属性:

  • 类型:filter 应该在什么时候被执行,有 PRE, ROUTING, POST, ERROR,具体代表的含义在下面讲
  • 执行顺序:同样类型的 filter,应该有怎样的先后顺序来执行
  • 条件:满足了这个条件,filter 才被执行
  • 动作:实际执行的动作

看看代码就明白:

class DeviceDelayFilter extends ZuulFilter {
    def static Random rand = new Random()
    
    @Override
    String filterType() {
       return 'pre'
    }

    @Override
    int filterOrder() {
       return 5
    }

    @Override
    boolean shouldFilter() {
       return RequestContext.getRequest().getParameter("deviceType") ? equals("BrokenDevice") : false
    }

    @Override
    Object run() {
       sleep(rand.nextInt(20000)) // Sleep for a random time
    }
}

不同的 filter 通过 RequestContext 共享数据。Zuul 制订了一套 filter 发布的过程,供 Zuul Server 动态地去加载新的 filter。

生命周期

不同类型的 filter,它的生命周期不一样:

  • PRE filter 在请求被路由到源站(origin,意指后端服务 / CDN)前执行。常用来做请求鉴权、选择源站机器(例子)、纪录调试信息等
  • ROUTING filter 实际将请求转发到源站机器,到源站的 HTTP 请求会在这里被构建,同时用 Apache HttpClient 或者 Netflix Ribbon 发送出去。这个 例子 展示了这一过程,并且维护了一个连接池,实现了转发特定请求到调试服务上的能力(配合 PRE filter)
  • POST filter 是在转发过程完成后被执行,一般用来收集统计信息
  • ERROR filter 在上述几个阶段出错时被执行

Zuul 也允许你创建自定义的 filter 类型并显式运行它们。Zuul 有一个 STATIC 类型,用来直接返回给前端数据,而不是转发到源站。

Zuul 也和 Netflix OSS 中的其他组件紧密联系。

参考