上一篇介紹了服務的調用,這篇接着之前的話題,來說說SpringCloud中zuul的使用及搭建網關的那點事。

首先,我們要知道什么是網關?
網關,是一個系統中前置的統一入口,介於客戶端和服務器端之間的中間層,主要用來處理非業務功能,提供路由請求、鑒權、監控、緩存、限流等功能。客戶端發起的請求首先通過網關,進行非業務功能處理,在根據路徑的路由,定位到具體的服務節點上。

同時系統使用服務路由的功能,可以在對外提供服務時,只暴露網關中配置的調用地址,而調用方就不需要了解后端具體的微服務主機。可以有效的保護真實的服務地址信息。Zuul是一個微服務網關,首先是一個微服務。也是會在Eureka注冊中心中進行服務的注冊和發現。也是一個網關,請求應該通過Zuul來進行路由。Zuul網關不是必要的。是推薦使用的。SpringCloud zuul的相關介紹
1,為什么要使用微服務網關?
不同的微服務一般會有不同的網絡地址,而客戶端可能需要調用多個服務接口才能完成一個業務需求,若讓客戶端直接與各個微服務通信,會有以下問題:
1)客戶端會多次請求不同微服務,增加了客戶端復雜性;
2)存在跨域請求,處理相對復雜;
3)認證復雜,每個服務都需要獨立認證;
4)難以重構,多個服務可能將會合並成一個或拆分成多個;
2,使用網關的優缺點?
優點:
-
所有的外部請求先經過微服務網關進行交互,無需調用特定微服務接口,簡化了開發;
-
服務網關=路由轉發+過濾器
-
路由轉發:接收請求,轉發到后端的微服務上;
-
過濾器:可在服務網關中可以完成一系列的橫切功能(權限校驗)
缺點:增加了網關,多了一層轉發,服務性能會下降;
3,使用zuul 的作用?Zuul可以通過加載動態過濾機制,從而實現以下各項功能:
- 驗證與安全保障: 識別面向各類資源的驗證要求並拒絕那些與要求不符的請求。
- 審查與監控: 在邊緣位置追蹤有意義數據及統計結果,從而為我們帶來准確的生產狀態結論。
- 動態路由: 以動態方式根據需要將請求路由至不同后端集群處。
- 壓力測試: 逐漸增加指向集群的負載流量,從而計算性能水平。
- 負載分配: 為每一種負載類型分配對應容量,並棄用超出限定值的請求。
- 靜態響應處理: 在邊緣位置直接建立部分響應,從而避免其流入內部集群。
- 多區域彈性: 跨越AWS區域進行請求路由,旨在實現ELB使用多樣化並保證邊緣位置與使用者盡可能接近。
4,zuul的工作原理?
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還允許我們創建自定義的過濾器類型。
5,Zuul和Nginx的區別相同點:Zuul和Nginx都可以實現負載均衡、反向代理(隱藏真實ip地址),過濾請求,實現網關的效果不同點:
-
Nginx–c語言開發
-
Zuul–java語言開發
-
Zuul負載均衡實現:采用ribbon+eureka實現本地負載均衡
-
Nginx負載均衡實現:采用服務器實現負載均衡
-
Nginx相比zuul功能會更加強大,因為Nginx整合一些腳本語言(Nginx+lua)
-
Nginx適合於服務器端負載均衡
-
Zuul適合微服務中實現網關
Zuul服務搭建
我們先在父級項目里引入zuul的依賴服務

再創建Zuul微服務模塊,並添加pom依賴如下:

添加yml配置:

然后添加啟動類:

啟動所有服務:

測試:

推薦閱讀:SpringCloud微服務項目實戰 - 微服務調用詳解(附面試題)
SpringCloud微服務項目實戰,服務注冊與發現(附面試題)
Spring Cloud微服務項目實戰--Eureka服務搭建
掃碼關注公眾號,發送關鍵詞獲取相關資料:
-
發“Springboot”領取電商項目實戰源碼;
-
發“SpringCloud”領取學習實戰資料;
- 發“SpringCloud實戰”領取SpringCloud實戰源碼;

