首页 > 代码库 > zuul入门(2)zuul 的关键组件和用途

zuul入门(2)zuul 的关键组件和用途

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。

    1. PRE: 该类型的filters在Request routing到源web-service之前执行。用来实现Authentication、选择源服务地址等
    2. ROUTING:该类型的filters用于把Request routing到源web-service,源web-service是实现业务逻辑的服务。这里使用HttpClient请求web-service。
    3. POST:该类型的filters在ROUTING返回Response后执行。用来实现对Response结果进行修改,收集统计数据以及把Response传输会客户端。
    4. 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处理。

zuul入门(2)zuul 的关键组件和用途