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 中的其他组件紧密联系。