天天看點

認識API網關

為了應對業務的細分以及高并發的挑戰,微服務的架構被廣泛使用,由于微服務架構中應用會被拆分成多個服務。

為了友善用戶端對這些服務的調用于是引入了 API 的概念。今天我們就來看看API 網關的原理以及它是如何應用的。

API 網關的定義

網關一詞最早出現在網絡裝置,比如兩個互相獨立的區域網路之間通過路由器進行通信, 中間的路由被稱之為網關。

落實在開發層面來說,就是用戶端與微服務系統之間存在的網關。從業務層面來說,當用戶端完成某個業務的時候,需要同時調用多個微服務。

從系統層面來說,任何一個應用系統如果需要被其他系統調用,就需要暴露 API,這些 API 代表着的功能點。這個聚合的方式有點像設計模式中的門面模式(Facade),它為外部的調用提供了一個統一的通路入口。

從用戶端類型層面來說,為了屏蔽不同用戶端調用差異也可以加入 API 網關。由于 API 網關所處的位置是用戶端與微服務交界的地方,是以從功能上它還包括:路由,負載均衡,限流,緩存,日志,釋出等等。

Spring Cloud Gateway 概念與定義

API 網關的定義中我們提到了為什麼要使用 API 網關,是為了解決用戶端對多個微服務進行通路的問題。

由于服務的切分導緻一個操作需要同時調用多個服務,是以為這些服務的聚合提供一個統一的門面,這個門面就是 API 網關。

針對于 API 網關有很多的實作方式,例如:Zuul,Kong 等等。這裡我們以及 Spring Cloud Gateway 為例展開給大家介紹其具體實作。

一般來說,API 網關對内将微服務進行集合,對外暴露的統一 URL 或者接口資訊供用戶端調用。

那麼用戶端是如何與微服務進行連接配接,并且進行溝通的,需要引入下面幾個重要概念 。

①路由(Route):任何一個來自于用戶端的請求都會經過路由,然後到對應的微服務中。

每個路由會有一個唯一的 ID 和對應的目的 URL。同時包含若幹個斷言(Predicate)和過濾器(Filter)。

②斷言(Predicate):當用戶端通過 Http Request 請求進入 Spring Cloud Gateway 的時候,斷言會根據配置的路由規則,對 Http Request 請求進行斷言比對。

說白了就是進行一次或者多次 if 判斷,如果比對成功則進行下一步處理,否則斷言失敗直接傳回錯誤資訊。

③過濾器( Filter):簡單來說就是對流經的請求進行過濾,或者說對其進行擷取以及修改的操作。注意過濾器的功能是雙向的,也就是對請求和響應都會進行修改處理 。

一般來說 Spring Cloud Gateway 中的過濾器有兩種類型:Gateway Filter、Global Filter

Gateway Filter 用在單個路由和分組路由上。Global Filter 可以作用于所有路由,是一個全局的 Filter。

Spring Cloud Gateway 工作原理

說完了 Spring Cloud Gateway 定義和要素,再來看看其工作原理。總的來說是對用戶端請求的處理過程。

認識API網關

圖 1:Spring Cloud Gateway 處理請求流程圖

如圖 1 所示,當用戶端向 Spring Cloud Gateway 發起請求,該請求會被 HttpWebHandlerAdapter 擷取,并且對請求進行提取,進而組裝成網關上下文。将組成的上下文資訊傳遞到 DispatcherHandler 元件。DispatcherHandler 作為請求分發處理器,主要負責将請求分發到對應的處理器進行處理。這裡請求的處理器包括 RoutePredicate HandlerMapping (路由斷言處理映射器) 。 路由斷言處理映射器用于路由的查找,以及找到 路由後傳回對應的 FilteringWebHandler。 其負責組裝 Filter 連結清單并執行過濾處理,之後再将請求轉交給應用服務,應用服務處理完後,最後傳回 Response 給用戶端 。其中 FilteringWebHandler 處理請求的時候會交給 Filter 進行過濾的處理。這裡需要注意的是由于 Filter 是雙向的是以,當用戶端請求服務的時候,會通過 Pre Filter 中的 Filter 處理請求。

當服務處理完請求以後傳回用戶端的時候,會通過 Post Filter 再進行一次處理。

總結

由于微服務的盛行,API 網關悄然興起。針對 API 網關本身講述了其存在的原因,它不僅提供了服務的門面,而且可以協調不同的系統之間的通訊以及服務不同的用戶端接口。

針對 API 網關的定義和概念的解釋,其實作了路由、過濾器、斷言,針對不同的用戶端請求可以路由到不同的微服務,以及其中幾個元件是如何分工合作完成路由工作的。