标签:tin 结果 错误 一个 修改 execution 字符 proc contex
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
也仅有一个实例。
ZuulRunner
直接将执行逻辑交由FilterProcessor
处理,FilterProcessor
也是单例,其功能就是依据filterType执行filter的处理逻辑:
FilterProcessor
对filter的处理逻辑。
List<ZuulFilter> list
。processZuulFilter(ZuulFilter filter)
RequestContext
对每个filter的执行状况进行记录,应该留意,此处的执行状态主要包括其执行时间、以及执行成功或者失败,如果执行失败则对异常封装后抛出。
Type:定义filter的类别,用字符串表示,有四种标准类别,代表了Request的生命周期。filterType()
返回值代表该filter的Type。
Execution Order: 同一个Type的filters组成Pipeline,Execution Order决定他们执行的顺序。filterOrder()
返回值是该filter的Execution Order。
shouldFilter()
run()
。zuul框架主要的功能就是动态的读取\编译\运行这些filter。filter之间之间通过RequestContext
共享状态信息,
既然filter都是对特定Request的处理,那么RequestContext
就是Request的Context,RequestContext
用来管理 Request的Context,不受其它Request的影响。
Filter源码文件放在zuul 服务特定的目录, zuul server会定期扫描目录下的文件的变化。
如果有Filter文件更新,源文件会被动态的读取,编译加载进入服务,接下来的Request处理就由这些新加入的filter处理。
标签:tin 结果 错误 一个 修改 execution 字符 proc contex
原文地址:http://www.cnblogs.com/lexiaofei/p/7097928.html