1. Zuul是什麼
微服務場景下,每個微服務對外暴露了一組細粒度的服務。客戶端的請求可能會涉及到一串的服務調用,若是將這些微服務都暴露給客戶端,那麼會增長客戶端代碼的複雜度。願意瞭解源碼的朋友直接求求交流分享技術:二一四七七七五六三三spring
參考GOF設計模式中的Facade模式,將細粒度的服務組合起來提供一個粗粒度的服務,全部請求都導入一個統一的入口,那麼整個服務只須要暴露一個api,對外屏蔽了服務端的實現細節,也減小了客戶端與服務器的網絡調用次數。這就是api gateway。後端
有了api gateway以後,一些與業務關係並不大的通用處理邏輯能夠從api gateway中剝離出來,api gateway僅僅負責服務的編排與結果的組裝。設計模式
Spring Cloud Netflix的Zuul組件能夠作反向代理的功能,經過路由尋址將請求轉發到後端的粗粒度服務上,並作一些通用的邏輯處理。api
2.Zuul 能作什麼
Zuul能夠經過加載動態過濾機制,從而實現如下各項功能:安全
驗證與安全保障: 識別面向各種資源的驗證要求並拒絕那些與要求不符的請求。
審查與監控: 在邊緣位置追蹤有意義數據及統計結果,從而爲咱們帶來準確的生產狀態結論。
動態路由: 以動態方式根據須要將請求路由至不一樣後端集羣處。
壓力測試: 逐漸增長指向集羣的負載流量,從而計算性能水平。
負載分配: 爲每一種負載類型分配對應容量,並棄用超出限定值的請求。
靜態響應處理: 在邊緣位置直接創建部分響應,從而避免其流入內部集羣。
多區域彈性: 跨越AWS區域進行請求路由,旨在實現ELB使用多樣化並保證邊緣位置與使用者儘量接近。
3.Zuul的核心
Filter是Zuul的核心,用來實現對外服務的控制。Filter的生命週期有4個,分別是「PRE」、「ROUTING」、「POST」、「ERROR」,整個生命週期能夠用下圖來表示。服務器
Zuul大部分功能都是經過過濾器來實現的,這些過濾器類型對應於請求的典型生命週期。網絡
PRE: 這種過濾器在請求被路由以前調用。咱們可利用這種過濾器實現身份驗證、在集羣中選擇請求的微服務、記錄調試信息等。
ROUTING:這種過濾器將請求路由到微服務。這種過濾器用於構建發送給微服務的請求,並使用Apache HttpClient或Netfilx Ribbon請求微服務。
POST:這種過濾器在路由到微服務之後執行。這種過濾器可用來爲響應添加標準的HTTP Header、收集統計信息和指標、將響應從微服務發送給客戶端等。
ERROR:在其餘階段發生錯誤時執行該過濾器。 除了默認的過濾器類型,Zuul還容許咱們建立自定義的過濾器類型。例如,咱們能夠定製一種STATIC類型的過濾器,直接在Zuul中生成響應,而不將請求轉發到後端的微服務。
Zuul中默認實現的Filter架構
4.怎麼使用Zuul
Spring Cloud Zuul路由是微服務架構的不可或缺的一部分,提供動態路由,監控,彈性,安全等的邊緣服務。Zuul是Netflix出品的一個基於JVM路由和服務端的負載均衡器。app
下面咱們經過代碼來了解Zuul是如何工做的負載均衡
1.簡單使用
一、添加依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency>
引入spring-cloud-starter-zuul包
二、配置文件
spring.application.name=gateway-service-zuul server.port=8888 #這裏的配置表示,訪問/it/** 直接重定向到http://www.ityouknow.com/** zuul.routes.baidu.path=/it/** zuul.routes.baidu.url=http://www.ityouknow.com/
三、啓動類
@SpringBootApplication @EnableZuulProxy public class GatewayServiceZuulApplication { public static void main(String[] args) { SpringApplication.run(GatewayServiceZuulApplication.class, args); } }
啓動類添加@EnableZuulProxy,支持網關路由。
史上最簡單的zuul案例就配置完了。
總體代碼結構以下: