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 特性
  • Core Features
    • Service Discovery
    • Load Balancing
    • Connection Pooling
    • Status Categories
    • Retries
    • Request Passport
    • Request Attempts
    • Origin Concurrency Protection
    • HTTP/2
    • Mutual TLS
    • Proxy Protocol
    • GZip
  • Push Messaging
二、SpringCloud Gateway2.1 介紹Spring Cloud Gateway3.1.x 旨在提供一種簡單而有效的方式路由到 API,并為它們它們提供橫切關注,比如:安全、監控和彈性 。
它是構建在 Spring 生態之上,包括 Spring5、Spring2 和 Project Reactor(Spring WebFlux) 。
Spring WebFlux 框架底層使用了 Reactor 模式高性能通信框架 Netty 。
官網:官網地址
github: github 地址
Spring Cloud Gateway 是用來替代 zuul 網關,因為 zuul2 開發進度落后 。
2.2 Spring Cloud Gateway 特性Features:
  1. 基于 Spring Framework 5、Project Reactor 和 Spring 2.0 構建
  2. 能夠在任何請求屬性上匹配路由
  3. 推薦閱讀