Zuul架构图:
图一
zuulServlet中的service方法

1 public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { 2 try { 3 this.init((HttpServletRequest)servletRequest, (HttpServletResponse)servletResponse); 4 RequestContext context = RequestContext.getCurrentContext(); 5 context.setZuulEngineRan(); 6 7 try { 8 this.preRoute(); 9 } catch (ZuulException var12) { 10 this.error(var12); 11 this.postRoute(); 12 return; 13 } 14 15 try { 16 this.route(); 17 } catch (ZuulException var13) { 18 this.error(var13); 19 this.postRoute(); 20 return; 21 } 22 23 try { 24 this.postRoute(); 25 } catch (ZuulException var11) { 26 this.error(var11); 27 } 28 } catch (Throwable var14) { 29 this.error(new ZuulException(var14, 500, "UNHANDLED_EXCEPTION_" + var14.getClass().getName())); 30 } finally { 31 RequestContext.getCurrentContext().unset(); 32 } 33 }
从上图可以看出,一个完整的请求流程过程时这样的:
1.请求——>zuulServlet处理;zuulServlet里面定义了整个请求的执行顺序;preRoute()——>route()——>postRoute();
2.zuulservlet中有一个zuulRunner对象,该对象中初始化了RequestContext,RequestContext继承了ConcurrentHashMap,并且它是一个单例的;所以它被用来存储整个请求中的与请求相关的数据,被所有的zuulFilter共享。
3.zuulRunner中含有FilterProcessor,FilterProcessor中定义了zuulfilter过滤器的执行规则(filterType,filterOrder,run)。
4.FilterProcessor从filterloader中获取zuulfilter;
5. zuulfilter是被filterFileManager所加载,并支持groovy热加载,采用了轮询的方式热加载。
6.加载的过滤器都存放在filterRegistry中。
7.得到这些过滤器后,就开始按preRoute()——>route()——>postRoute()的顺序开始执行这些过滤器。
8.执行这些过滤器有错误的时候会执行error过滤器。
9.执行完这些过滤器后,将请求结果返回给客户端。
路由转发时在route阶段执行的。
说明:
图一引用自https://blog.csdn.net/forezp/article/details/76211680 方志朋的博客