11 微服務架構學習與思考:開源 API 網關02-以 Java 為基礎的 API 網關詳細介紹

微服務架構學習與思考(11):開源 API 網關02-以 Java 為基礎的 API 網關詳細介紹
上一篇關于網關的文章:
微服務架構學習與思考(10):微服務網關和開源 API 網關01-以 Nginx 為基礎的 API 網關詳細介紹,介紹了為什么會有網關及以 Nginx 為基礎的網關 。
一、網關 zuulzuul 網關使用 java 語言開發,是 Netflix 公司出品的開源網關 。它是 SpringCloud 的組件之一 。zuul 有 2 個大的版本:

  • zuul1:zuul1 wiki
  • zuul2:zuul2 wiki
1.1 zuul1 架構zuul1 是基于 Servlet 構建的,采用的是阻塞和多線程方式,它一個線程處理一次連接 。I/O 操作是通過從線程池中選擇一個工作線程執行 I/O 來完成的,并且請求線程將阻塞,直到工作線程完成為止 。工作線程在其工作完成時通知請求線程 。如下圖:
11 微服務架構學習與思考:開源 API 網關02-以 Java 為基礎的 API 網關詳細介紹

文章插圖
(netflix blog: https://netflixtechblog.com/zuul-2-the-netflix-journey-to-asynchronous-non-blocking-systems-45947377fb5c)
這種處理線程模型,當后端API延遲增加或錯誤導致重試,線程數也會隨之增加 。這種情況發生時,就會給節點服務器帶來麻煩,使服務器負載激增,為了消除這種麻煩,構建了限流機制(比如hystrix)保持系統的穩定 。
zuul1 中網關功能怎么實現,在請求周期通過 Filter 實現,如下圖:
11 微服務架構學習與思考:開源 API 網關02-以 Java 為基礎的 API 網關詳細介紹

文章插圖
?(from:https://github.com/Netflix/zuul/wiki/How-it-Works)
1.2 zuul2 架構zuul2 對 zuul1 進行了重大的重構,采用異步和事件驅動模式處理程序 。請求和響應的生命周期通過事件和回調機制來處理 。沒有像 zuul1 那樣針對每個請求使用一個線程,不需要大量的線程成本,只需要一個文件描述符和一個監聽器 。而且像 zuul1 發生后端延遲和“重試風暴”,不是增加線程,zuul2 中是在隊列中增加事件,這個開銷比多個線程開銷小得多 。
11 微服務架構學習與思考:開源 API 網關02-以 Java 為基礎的 API 網關詳細介紹

文章插圖
(netflix blog: https://netflixtechblog.com/zuul-2-the-netflix-journey-to-asynchronous-non-blocking-systems-45947377fb5c)
關于高性能網絡IO編程模型,可以看我之前的文章,點擊這里看文章
zuul2 網關中那么多功能是怎么實現的呢?是在請求周期(request cycle)中,通過 Filter 來處理實現 。
11 微服務架構學習與思考:開源 API 網關02-以 Java 為基礎的 API 網關詳細介紹

文章插圖
?(from:https://github.com/Netflix/zuul/wiki/How-It-Works-2.0)
Filter:
Filter 過濾器是 zuul2 業務邏輯處理的核心,它可以在請求-響應周期的不同部分運行 。分為 3 個 Filter:
  1. Inbound Filters:Inbound 過濾器,在請求到源之前執行,可用于身份驗證、路由和裝飾請求等處理操作
  2. Endpoint Filters:Endpoint 過濾器,可用于返回靜態響應,否則內置的 ProxyEndpoint 過濾器會將請求路由到源 。
  3. Outbound Filters:Outbound 過濾器,請求處理之后執行,可用于度量、裝飾處理之后的請求或增加自定義 header 。
更多 zuul2 Filter 用法請查看 Filter wiki 。
說明:在 zuul2 中編寫 Filter,使用的是 groovy 語言,它可以動態更新,不需要重啟服務器 。
1.3 zuul2 特性