Zuul简介
Zuul在微服务架构中,可以作为提供动态路由,监控,弹性,安全等边缘服务的框架。在Netflix,被用作所有请求到达streaming application
的前门。Zuul使用一系列不同的Filter
可以提供各种功能:
- 安全与认证
- 监控
- 动态路由
- 压测
- 限流
- 静态响应
- 多区域弹性负载均衡
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了:
/** * 定义了同类型下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
:当错误在任何其他阶段发生时被执行。
参考:官方wiki
EOF