Zuul简介

Zuul在微服务架构中,可以作为提供动态路由,监控,弹性,安全等边缘服务的框架。在Netflix,被用作所有请求到达streaming application的前门。Zuul使用一系列不同的Filter可以提供各种功能:

  • 安全与认证
  • 监控
  • 动态路由
  • 压测
  • 限流
  • 静态响应
  • 多区域弹性负载均衡

可参考:How We Use Zuul At Netflix

Zuul执行流程

先从github把代码clone下来:git clone https://github.com/Netflix/zuul.git,切换至1.x分支,核心代码为zuul-core模块,几个重要的类清单如下:

类名 描述
RequestContext 继承至ConcurrentHashMap;被保存在ThreadLocal中;单例
ZuulServlet 继承至HttpServlet;核心方法为service()
ZuulFilter 抽象类,实现了Comparable接口,自定义Filter需从它继承
ZuulRunner ZuulServlet中用于代为执行route方法;核心方法为init(),初始化RequestContext中的request, response
FilterProcessor Filter执行器,Filter的runFilter方法再该类的processZuulFilter被调用;单例
FilterRegistry Filter注册器;一个(K, V)的ZuulFilter容器。单例
FilterLoader Filter管理器;主要提供了getFiltersByType(),putFilter()方法和初始化FilterFileManager;单例
FilterFileManager 声明了poller用于监听groovy文件夹的变化并通过FilterLoader.putFilter加入filter到FilterFileManager中。单例

具体执行流程如图所示:

ZuulFilter

ZuulFilter本身是个抽象类,通过继承ZuulFilter并实现以下三个方法,就可以定义各种Filter了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
* 定义了同类型下filter的执行顺序:值越小优先被执行
*/
@Override
public int filterOrder() {
return 50000;
}

/**
* 共四种类型:pre, route, post, error
*/
@Override
public String filterType() {
return "pre";
}

/**
* 该filter是否能够被执行:抽象类ZuulFilter的runFilter有体现
*/
@Override
public boolean shouldFilter() {
return true;
}

/**
/* filter的具体运行逻辑
*/
@Override
public Object run() {
return null;
}

Filter的生命周期

  • PRE:在路由至origin server之前被执行,可用于请求认证、选择origin server、日志记录。
  • ROUTING:在路由至origin server的过程中被执行。此时,原始的HTTP请求被构建,并且被Apache HttpClient或者Netflix Ribbon转发。
  • POST:当请求被路由至origin server后被执行,可用于添加标准的HTTP头至响应中、或者收集统计信息的纬度、以及流转该响应至客户端。
  • ERROR:当错误在任何其他阶段发生时被执行。

最后,来自Zuul的凝视😏

参考:官方wiki

EOF