Zuul 1.x的工作原理
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了:
1 | /** |
Filter的生命周期
PRE
:在路由至origin server
之前被执行,可用于请求认证、选择origin server
、日志记录。ROUTING
:在路由至origin server
的过程中被执行。此时,原始的HTTP请求被构建,并且被Apache HttpClient或者Netflix Ribbon转发。POST
:当请求被路由至origin server
后被执行,可用于添加标准的HTTP头至响应中、或者收集统计信息的纬度、以及流转该响应至客户端。ERROR
:当错误在任何其他阶段发生时被执行。
最后,来自Zuul的凝视😏
参考:官方wiki
EOF