1.什麼是zuul
Zuul包含了對請求的路由和過濾兩個最主要的功能:
-
其中路由功能負責將外部請求轉發到具體的微服務實例上,是實現外部訪問統一入口的基礎而過濾器功能則負責對請求的處理過程進行干預,是實現請求校驗、服務聚合等功能的基礎.
-
Zuul和Eureka進行整合,將Zuul自身註冊爲Eureka服務治理下的應用,同時從Eureka中獲得其他微服務的消息,也即以後的訪問微服務都是通過Zuul跳轉後獲得.
2.zuul用來做限流,但是爲什麼要限流?
- 防止不需要頻繁請求服務的請求惡意頻繁請求服務,造成服務器資源浪費。
- 防止不法分子惡意攻擊系統,擊穿系統盜取數據,防止數據安全隱患。
- 防止系統高峯時期,對系統對頻繁訪問,給服務器帶來巨大壓力。
限流策略
3.zuul的工作原理
1、過濾器機制
zuul的核心是一系列的filters, 其作用可以類比Servlet框架的Filter,或者AOP。
zuul把Request route到 用戶處理邏輯 的過程中,這些filter參與一些過濾處理,比如Authentication,Load Shedding等。
Zuul提供了一個框架,可以對過濾器進行動態的加載,編譯,運行。
Zuul的過濾器之間沒有直接的相互通信,他們之間通過一個RequestContext的靜態類來進行數據傳遞的。RequestContext類中有ThreadLocal變量來記錄每個Request所需要傳遞的數據。
Zuul的過濾器是由Groovy寫成,這些過濾器文件被放在Zuul Server上的特定目錄下面,Zuul會定期輪詢這些目錄,修改過的過濾器會動態的加載到Zuul Server中以便過濾請求使用。
下面有幾種標準的過濾器類型:
Zuul大部分功能都是通過過濾器來實現的。Zuul中定義了四種標準過濾器類型,這些過濾器類型對應於請求的典型生命週期。
(1) PRE:這種過濾器在請求被路由之前調用。我們可利用這種過濾器實現身份驗證、在集羣中選擇請求的微服務、記錄調試信息等。
(2) ROUTING:這種過濾器將請求路由到微服務。這種過濾器用於構建發送給微服務的請求,並使用Apache HttpClient或Netfilx Ribbon請求微服務。
(3) POST:這種過濾器在路由到微服務以後執行。這種過濾器可用來爲響應添加標準的HTTP Header、收集統計信息和指標、將響應從微服務發送給客戶端等。
(4) ERROR:在其他階段發生錯誤時執行該過濾器。
內置的特殊過濾器
zuul還提供了一類特殊的過濾器,分別爲:StaticResponseFilter和SurgicalDebugFilter
StaticResponseFilter:StaticResponseFilter允許從Zuul本身生成響應,而不是將請求轉發到源。
SurgicalDebugFilter:SurgicalDebugFilter允許將特定請求路由到分隔的調試集羣或主機。
自定義的過濾器
除了默認的過濾器類型,Zuul還允許我們創建自定義的過濾器類型。
如,我們可以定製一種STATIC類型的過濾器,直接在Zuul中生成響應,而不將請求轉發到後端的微服務。
2、過濾器的生命週期
Zuul請求的生命週期如圖,該圖詳細描述了各種類型的過濾器的執行順序。
try {
preRoute();
} catch (ZuulException e) {
error(e);
postRoute();
return;
}
try {
route();
} catch (ZuulException e) {
error(e);
postRoute();
return;
}
try {
postRoute();
} catch (ZuulException e) {
error(e);
return;
}
4.zuul 的作用
Zuul可以通過加載動態過濾機制,從而實現以下各項功能:
- 驗證與安全保障: 識別面向各類資源的驗證要求並拒絕那些與要求不符的請求。
- 審查與監控: 在邊緣位置追蹤有意義數據及統計結果,從而爲我們帶來準確的生產狀態結論。
- 動態路由: 以動態方式根據需要將請求路由至不同後端集羣處。
- 壓力測試: 逐漸增加指向集羣的負載流量,從而計算性能水平。
- 負載分配: 爲每一種負載類型分配對應容量,並棄用超出限定值的請求。
- 靜態響應處理: 在邊緣位置直接建立部分響應,從而避免其流入內部集羣。
- 多區域彈性: 跨越AWS區域進行請求路由,旨在實現ELB使用多樣化並保證邊緣位置與使用者儘可能接近。
5.Zuul和Nginx的區別
相同點:Zuul和Nginx都可以實現負載均衡、反向代理(隱藏真實ip地址),過濾請求,實現網關的效果
不同點:
- Nginx–c語言開發
- Zuul–java語言開發
Zuul負載均衡實現:採用ribbon+eureka實現本地負載均衡
Nginx負載均衡實現:採用服務器實現負載均衡
Nginx相比zuul功能會更加強大,因爲Nginx整合一些腳本語言(Nginx+lua)
Nginx適合於服務器端負載均衡
Zuul適合微服務中實現網關
6.zuul限流
流算法
- 漏桶: leakey bucket,原理:桶的下方的小孔會以一個相對恆定的速率漏水,而不管入桶的水流量,這樣就達到了控制出水口的流量
- 令牌桶: token bucket,原理:以相對恆定的速率向桶中加入令牌,請求來時於桶中取令牌,取到了就放行,沒能取到令牌的請求則丟棄
限流粒度
粗粒度
- 網關限流
- 單個服務
7.細粒度
- user: 認證用戶或者匿名,針對某個用戶粒度進行限流
- origin: 客戶機的IP,針對請求客戶機的IP進行限流
- url: 特定url,針對請求的url粒度進行限流
- serviceId: 特定服務,針對某個服務的id粒度進行限流