摘要: 接着上一篇《Spring Cloud Zuul遗失的世界(一)》,ZuulController继承了ServletWrappingController,将当前应用中的ZuulServlet直接包装为一个Controller,暴露为入口访问,在本篇文章中介绍etflix-zuul-core的代码Zuul的执行的生命周期等。
一.Netflix zuul core源码分析
com.netflix.zuul.http.ZuulServlet是ZuulFilter链执行的入口,通过service方法,提取请求到RequestContext,然后通过调用ZuulRunner,依次按顺序执行每种类型的Filter,完成整个Filter的生命周期,架构图如下所示。
1.1 ZuulServlet代码分析
在ZuulConfiguration中点击com.netflix.zuul.http.ZuulServlet打开代码如下所示:
|
|
如上所示,ZuulServlet其实就是一个Servlet,service方法包含了Zuul的整个生命周期。
1.1.1 ZuulServlet init代码拆解分析
|
|
1.1.2 ZuulServlet service代码分析
|
|
正常情况下,请求只经过pre -> route -> post。
两层try…catch,内层只捕获ZuulException,而其他异常由外层捕获。
内层3个try…catch语句,只有pre,route抛出ZuulException时,才会执行errror,再执行post。而当post(88行)抛出ZuulException后,只会执行error。
外层捕获其他异常(内层try语句块中抛出的非ZuulException异常以及内层catch语句中抛出的所有异常)后,将HTTP状态码设置为500,同时交给error处理。
整个流程的终点有两个:post及error;而非只有post一个。
1.2 Zuul的请求上下文 RequestContext
com.netflix.zuul.context.RequestContext继承了ConcurrentHashMap
|
|
1.3 ContextLifecycleFilter
com.netflix.zuul.context.ContextLifecycleFilter是调用链外围finally中remove上文中threadlocal.
|
|
1.4 Zuul的运行执行器-ZuulRunner
com.netflix.zuul.ZuulRunner,
|
|
com.netflix.zuul.filters.ZuulServletFilter跟跟ZuulServlet是同一份代码.
com.netflix.zuul.monitoring,预留了CounterFactory与TracerFactory的接口,用来扩展实现counter与timer.