本文基於spring cloud edgware.sr6,zuul版本1.3.1,解析zuul的請求攔截機制,讓大家對zuul的原理有個大概的認識和了解。如有不對的地方,歡迎指正。
spring boot啟動完成後,通過瀏覽器發起閘道器請求,請求會到達dispatcherservlet.dodispatch(),此方法會查詢符合的handler和handleradapter來處理請求。我們來看下它是如何找到zuul的handler。
lookuphandler()方法返回。
我們看下registerhandlers()做了什麼。this.routelocator.getroutes()就是獲取註冊在eureka的服務列表,然後遍歷,
再來看下super.lookuphandler(urlpath, request)。
} // 如果獲取不到,則進行正則匹配,如果還匹配不到的話,則返回null
listmatchingpatterns = new arraylist();
for (string registeredpattern : this.handlermap.keyset())
else
if (usetrailingslashmatch())
} }string bestmatch = null;
// 匹配到之後,用請求urlpath對應的patterncomparator,對所有匹配的url進行排序,之後獲取第乙個匹配的urlcomparatorpatterncomparator = getpathmatcher().getpatterncomparator(urlpath);
if (!matchingpatterns.isempty())
bestmatch = matchingpatterns.get(0);
} if (bestmatch != null)
if (handler == null)
} // 如果handler是string,則從應用上下文中獲取對應的bean
if (handler instanceof string)
validatehandler(handler, request);
// 解析對映url的後半段請求uri// 最後再確認一次bestmatch是否是最匹配請求的路由
mapuritemplatevariables = new linkedhashmap();
for (string matchingpattern : matchingpatterns)
} if (logger.isdebugenabled())
// 構建handlerexecutionchain並返回}
// no handler found...
return
null;
}至此,終於找到了zuul的handler,其中有些細節沒有提或是略過,有興趣的朋友可以自行下去翻閱。
總結一下:
總結之SpringCloud之路由閘道器 Zuul
所有從裝置或 來的請求都會經過zuul到達後端的netflix應用程式。作為乙個邊界性質的應用程式,zuul提供了動態路由 監控 彈性負載和安全功能。zuul底層利用各種filter實現如下功能 認證和安全 識別每個需要認證的資源,拒絕不符合要求的請求。效能監測 在服務邊界追蹤並統計資料,提供精確的...
SpringCloud之Dashboard 流監控
新建springcloud consumer hystrix dashboard模組 新增依賴 org.springframework.cloudgroupid spring cloud starter hystrixartifactid 1.4.6.releaseversion dependenc...
SpringCloud之Hystrix應用實踐
使用springcloud的hystrix功能,有幾種方式 1 單應用監聽,也可以用於測試 引用包 org.springframework.boot spring boot starter actuator org.springframework.cloud spring cloud starter...