您現在的位置是:首頁 > 垂釣

Java架構師分享:微服務架構之API閘道器

  • 由 少鷹 發表于 垂釣
  • 2022-01-06
簡介現在我們採用微服務架構了,在一個專案中微服務節點很多,如果讓每一個節點都去處理上面這些 “鑑權認證功能、Session處理、安全檢查、日誌處理等” 會多出很多冗餘的程式碼,也會給增加業務程式碼的複雜度,因此我們就需要有一個「 API閘道器

萬能閘道器如何解除安裝

Java架構師分享:微服務架構之API閘道器

API閘道器 」是任何微服務架構的重要組成部分。有了它我們可以在一個獨立的模組上方便的處理一些非業務邏輯,可以讓微服務本身專注在自身特定的功能上,使得每個微服務的開發更容易和更快速。

後面還會有文章繼續介紹 配置中心、服務框架、服務監控、服務追蹤、服務治理等。還是那句話,只有將這些基礎設施弄清楚了,微服務實踐的道路才能走的穩、走的遠。

一、為什麼需要「 API閘道器 」?

為什麼做微服務的需要「 API閘道器 」呢?「 API閘道器 」到底有些啥功能呢?我們以前專案結構比較簡單的時候有用到過「 API閘道器 」概念的模組嗎?

其實在我們的專案曾經還是單體應用的時候,雖然沒有「 API閘道器 」的概念,但是一般在專案中都會用到filter/過濾器之類的東西,filter的作用就是把專案中的一些非業務邏輯的功能抽離出來獨立處理,避免與業務邏輯混在一起增加程式碼複雜度。比如 鑑權認證功能、Session處理、安全檢查、日誌處理等等。

Java架構師分享:微服務架構之API閘道器

現在我們採用微服務架構了,在一個專案中微服務節點很多,如果讓每一個節點都去處理上面這些 “鑑權認證功能、Session處理、安全檢查、日誌處理等” 會多出很多冗餘的程式碼,也會給增加業務程式碼的複雜度,因此我們就需要有一個「 API閘道器 」把這些公共的功能獨立出來成為一個服務來統一的處理這些事情。

我們看一下下面這個微服務架構示意圖:

Java架構師分享:微服務架構之API閘道器

「 API閘道器 」就像是微服務的大門守衛一樣,是連通外部客戶端與內部微服務之間的一個橋樑。

其主要功能有:

路由轉發

之前說了「API閘道器」是內部微服務的對外唯一入口,所以外面全部的請求都會先發到這個「API閘道器」上,然後由「API閘道器」來根據不同的請求去路由到不同的微服務節點上。例如可以 根據路徑 來轉發、也可以 根據引數 來轉發。

並且由於內部微服務例項也會隨著業務調整不停的變更,增加或者刪除節點,「API閘道器」可以與「服務註冊」模組進行協同工作,保證將外部請求轉發到最合適的微服務例項上面去。

負載均衡

既然「API閘道器」是內部微服務的單一入口,所以「API閘道器」在收到外部請求之後,還可以根據內部微服務每個例項的負荷情況進行動態的負載均衡調節。一旦內部的某個微服務例項負載很高,甚至是不能及時響應,則「API閘道器」就透過負載均衡策略減少或停止向這個例項轉發請求。當所有的內部微服務例項都處理不過來的時候,「API閘道器」還可以採用限流或熔斷的形式阻止外部請求,以保障整個系統的可用性。

安全認證

「API閘道器」就像是微服務的大門守衛,每一個請求進來之後,都必須先在「API閘道器」上進行身份驗證,身份驗證通過後才轉發給後面的服務,轉發的時候一般也會帶上身份資訊。

同時「API閘道器」也需要對每一個請求進行安全性檢查,例如引數的安全性、傳輸的安全性等等。

日誌記錄

既然所有的請求都需要走「API閘道器」,那麼我們就可以在「API閘道器」上統一集中的記錄下這些行為日誌。這些日誌既可以作為我們後續事件查詢使用,也可以作為系統的效能監控使用。

資料轉換

因為「API閘道器」對外是面向多種不同的客戶端,不同的客戶端所傳輸的資料型別可能是不一樣的。因此「API閘道器」還需要具備資料轉換的功能,將不同客戶端傳輸進來的資料轉換成同一種類型再轉發給內部微服務上,這樣,相容了這些請求的多樣性,保證了微服務的靈活性。

Java架構師分享:微服務架構之API閘道器

二、「 API閘道器 」原理與應用?

上面聊完了「為什麼需要API閘道器」,我們再來看一下在實際專案中應該如何去應用。雖然我們可以自己去開發一套「API閘道器」,但是如果沒有特殊需求,還是不建議重複造輪子了,市面上有很多成熟的方案可以直接使用,下面簡單介紹一下 Zuul、Tyk、Kong三個比較熱門的開源元件。

Zuul

Java架構師分享:微服務架構之API閘道器

Zuul 是由 Netflix 所開源的元件,基於JAVA技術棧開發的。

Zuul閘道器的使用熱度非常高,並且也整合到了 Spring Cloud 全家桶中了,使用起來非常方便。

Java架構師分享:微服務架構之API閘道器

上圖可以看到Zuul的一個簡化結構,過濾器filter是整個Zuul的核心,分為前置過濾器(pre filter)、路由過濾器(routing filter)、後置過濾器(post filter)以及 錯誤過濾器(error filter)。

一個請求過來,會先執行所有的 pre filter,然後再透過 routing filter 將請求轉發給後端服務,後端服務進行結果響應之後,再執行 post filter,最後再響應給客戶端。在不同的filter裡面可以執行不同的邏輯,比如安全檢查、日誌記錄等等。

Tyk

Java架構師分享:微服務架構之API閘道器

Tyk是一個基於GO編寫的,輕量級、快速可伸縮的開源的API閘道器。

可以透過下圖簡單瞭解一下Tyk的流程原理。

Java架構師分享:微服務架構之API閘道器

Kong

Java架構師分享:微服務架構之API閘道器

Kong是基於OpenResty技術棧的開源閘道器服務,因此其也是基於Nginx實現的。

Kong可以做到高效能、外掛自定義、叢集以及易於使用的Restful API管理。

Java架構師分享:微服務架構之API閘道器

以上,就是對微服務架構中「 服務閘道器」的一些思考。

需要的Java架構師方面的資料可以關注之後私信哈,

回覆“資料”領取免費架構影片資料,記得要點贊轉發噢!!!

Top