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 方志朋的博客