1、ContextLifecycleFilter
2、ZuulServlet 接收请求
ZuulServlet
类似SpringMvc的DispatcherServlet
,所有的Request都要经过ZuulServlet
的处理,因此ZuulServlet
是zuul框架源码分析的入口点。
zuul逻辑的入口是ZuulServlet.service(ServletRequest servletRequest, ServletResponse servletResponse)
。
RequestContext
提供了执行filter Pipeline所需要的Context,因为Servlet是单例多线程,这就要求RequestContext即要线程安全又要Request安全。
context使用ThreadLocal
保存,这样每个worker线程都有一个与其绑定的RequestContext
,因为worker仅能同时处理一个Request,这就保证了Request Context 即是线程安全的由是Request安全的。
三个核心的方法preRoute()
,route()
, postRoute()
,zuul对request处理逻辑都在这三个方法里,ZuulServlet
交给ZuulRunner
去执行。
由于ZuulServlet
是单例,因此ZuulRunner
也仅有一个实例。
3、ZuulServlet 处理请求:ZuulRunner - 》FilterProcessor
ZuulRunner
直接将执行逻辑交由FilterProcessor
处理,FilterProcessor
也是单例,其功能就是依据filterType执行filter的处理逻辑:
FilterProcessor
对filter的处理逻辑。
- 首先根据Type获取所有输入该Type的filter,
List<ZuulFilter> list
。 - 遍历该list,执行每个filter的处理逻辑,
processZuulFilter(ZuulFilter filter)
RequestContext
对每个filter的执行状况进行记录,应该留意,此处的执行状态主要包括其执行时间、以及执行成功或者失败,如果执行失败则对异常封装后抛出。
到目前为止,zuul框架对每个filter的执行结果都没有太多的处理,它没有把上一filter的执行结果交由下一个将要执行的filter,仅仅是记录执行状态,如果执行失败抛出异常并终止执行。
4、重中之重:ZuulFilter
- Type:定义filter的类别,用字符串表示,有四种标准类别,代表了Request的生命周期。
filterType()
返回值代表该filter的Type。- PRE: 该类型的filters在Request routing到源web-service之前执行。用来实现Authentication、选择源服务地址等
- ROUTING:该类型的filters用于把Request routing到源web-service,源web-service是实现业务逻辑的服务。这里使用HttpClient请求web-service。
- POST:该类型的filters在ROUTING返回Response后执行。用来实现对Response结果进行修改,收集统计数据以及把Response传输会客户端。
- ERROR:上面三个过程中任何一个出现错误都交由ERROR类型的filters进行处理。
- Execution Order: 同一个Type的filters组成Pipeline,Execution Order决定他们执行的顺序。
filterOrder()
返回值是该filter的Execution Order。 - Criteria:定义了filter执行需要满足的条件。对应的方法是
shouldFilter()
- Action: 定了filter处理逻辑。对应的方法是
run()
。
5、总结一下
zuul框架主要的功能就是动态的读取\编译\运行这些filter。filter之间之间通过RequestContext
共享状态信息,
既然filter都是对特定Request的处理,那么RequestContext
就是Request的Context,RequestContext
用来管理 Request的Context,不受其它Request的影响。
Filter源码文件放在zuul 服务特定的目录, zuul server会定期扫描目录下的文件的变化。
如果有Filter文件更新,源文件会被动态的读取,编译加载进入服务,接下来的Request处理就由这些新加入的filter处理。