淺談如何設計一個可用的企業(yè)級API網(wǎng)關

在上一篇《淺談微服務架構下的API網(wǎng)關》文章中, 我們介紹了API網(wǎng)關的概念、優(yōu)勢、應用場景和選型要素, 本文我們將從API網(wǎng)關的架構設計與功能要素兩個方面介紹如何設計一個企業(yè)級API網(wǎng)關。

1. 使用API網(wǎng)關統(tǒng)一應用入口

API網(wǎng)關的核心設計理念是使用一個輕量級的消息網(wǎng)關作為所有客戶端的應用入口,并且在 API 網(wǎng)關層面上實現(xiàn)通用的非功能性需求。如下圖所示:所有的服務通過 API 網(wǎng)關來暴露,這是所有客戶端訪問的唯一入口;如果一個服務要訪問另一個服務,也要通過這個網(wǎng)關。

API網(wǎng)關統(tǒng)一應用入口

一旦 API 網(wǎng)關允許客戶端消費一個受管理的 API,那么我們就可以以受管理的 API 形式使用它來暴露這個微服務所實現(xiàn)的業(yè)務邏輯。API 網(wǎng)關可以通過HTTP、HTTPS、RPC等方式來連接內部受管理的 API,以實現(xiàn) API 網(wǎng)關的高并發(fā)。

2. API網(wǎng)關架構

API網(wǎng)關架構

API網(wǎng)關為企業(yè)的應用提供統(tǒng)一的應用入口, API網(wǎng)關隱藏了企業(yè)內部應用系統(tǒng)的應用細節(jié), 從一定程度上保證了企業(yè)內部應用的安全性。 API網(wǎng)關為各種應用場景提供支撐服務。

3. API網(wǎng)關的功能

企業(yè)級API網(wǎng)關應該提供下列的功能:

API網(wǎng)關功能
  1. 服務路由:外部服務訪問接口映射到對應的內部服務訪問接口。

  2. 認證授權:提供對用戶身份的認證以及用戶權限驗證,包括用戶身份的合法性、針對用戶角色的訪問授權驗證、針對用戶的訪問授權驗證、IP 黑名單驗證等。

  3. 超時處理:當 API 網(wǎng)關調用的內部服務響應時間超過了在自主開發(fā)的 API 網(wǎng)關后臺管理子系統(tǒng)中所設置的允許最長的超時時間時,API 網(wǎng)關會立即停止調用,并返回相關消息給你。

  4. 限流控制:當你通過 API 網(wǎng)關調用內部服務的頻率達到在某個閾值時,API 網(wǎng)關會立即做斷開鏈路處理。過了時間后,鏈路會自動閉合回去。

  5. 熔斷處理:熔斷處理對避免無謂的資源消耗特別有用,當通過 API 網(wǎng)關調用的內部服務出現(xiàn)異常的頻率達到某個閾值時,那么 API 網(wǎng)關會做臨時熔斷處理即臨時斷開鏈路,暫時停止你對那個內部服務的調用。臨時熔斷后,過了一段時間后,鏈路會自動閉合回去。

  6. 日志信息記錄:會記錄客戶 IP、客戶請求參數(shù)、返回結果、異常信息等信息。

  7. 負載均衡: 提供API接口的負載均衡,能夠處理API接口的高并發(fā)訪問,防止服務雪崩。

  8. 安全防護:提供嚴格的認證服務,支持算法簽名,用戶使用 API 網(wǎng)關提供的密鑰進行認證,沒有被授予密鑰的客戶端無法調用業(yè)務 API接口,經(jīng)過認證授權的請求才能到達后端應用服務。同時SSL 加密。

  9. 灰度發(fā)布:支持API接口線上灰度部署,減少應用版本切換風險。

4. 如何設計一個好的企業(yè)級API網(wǎng)關

設計一個企業(yè)級API網(wǎng)關時, 應該從功能需求、性能需求、高可用性、擴展性等方面進行綜合考量, 覆蓋企業(yè)的API應用場景,從而滿足企業(yè)的業(yè)務需求。下面我們將從功能、性能、高可用性和擴展性四方面進行介紹。

4.1 功能需求

企業(yè)級API網(wǎng)關除了上述的服務路由、認證授權、超時處理、限流控制、熔斷處理、日志記錄、負載均衡、灰度發(fā)布等基礎服務外,還需要提供以下的功能。

1)API 生命周期管理功能

覆蓋 API 的定義、測試、發(fā)布和下線的整個生命周期管理,便捷的日常管理、版本管理,支持熱升級和快速回滾。并能夠提供API接口測試,預發(fā)布,發(fā)布等多種環(huán)境。

2)開發(fā)支持功能

提供頁面調試工具,能夠自動生成 API 文檔和 SDK,這樣可以大大降低人力成本。開源的API文檔生成方案有Swagger等。

3)流量控制功能

可控制單位時間內 API 允許被調用次數(shù)。用來保護企業(yè)的后端服務,實現(xiàn)業(yè)務分級和用戶分級。 支持對 API 流控,您可以根據(jù) API 的重要程度來配置不同流控,從而保障重要業(yè)務的穩(wěn)定運行; 支持用戶、應用和例外流控,您可以根據(jù)用戶的重要性來配置不同流控,從而可以保證大用戶的權益; 流控粒度:分鐘、小時、天。

4)請求管理功能

可根據(jù)配置進行參數(shù)類型、參數(shù)值(范圍、枚舉、正則、Json Schema)的校驗,減少后端對非法請求、無效請求的資源消耗和處理成本。可以在 API 網(wǎng)關定義參數(shù)映射規(guī)則,網(wǎng)關通過映射規(guī)則將后端服務通過映射翻譯成任何形式,以滿足不同用戶的不同需求,從而避免功能重復開發(fā)。

5)監(jiān)控告警功能

提供實時、可視化的 API 監(jiān)控,包括:調用量、調用方式、響應時間、錯誤率,讓您能夠清楚的了解 API 的運行狀況和用戶的行為習慣。

支持自定義報警規(guī)則,來針對異常情況進行報警,降低故障處理時間。

提供可訂閱的數(shù)據(jù)分析報表和智能分析。

4.2 高性能設計

傳統(tǒng)的基于線程的并發(fā)模型(Thread-based concurrency),為每一個請求分配一個線程或進程。這種模型編程簡單,可以將處理一個完整請求的代碼編寫在一個代碼路徑中。這種模型的弊端是,隨著線程(進程)數(shù)的上升,操作系統(tǒng)在這些線程(進程)之間的頻繁切換,將急劇降低系統(tǒng)的性能。

高性能設計

4.3 高可用設計

1) 無狀態(tài)設計原則

網(wǎng)關層為保證高可用、易于擴展、快速啟動,需要設計成無狀態(tài)的。用戶的狀態(tài)數(shù)據(jù)我們通常使用session對象來封裝,網(wǎng)關層要設計成無狀態(tài)的,也就是說,不能由網(wǎng)關來負責session的維護。那由誰來維護session相關的信息呢?我們是采用cookie+session服務器的方式;

a) 用戶在登錄頁完成登錄操作后,服務器會生成一個登錄session信息,保存起來,設置個失效時間,并設置到用戶的cookie里。

b) 用戶后續(xù)的每次請求里會帶著這個cookie信息,服務端會對這個cookie信息進行校驗,通過了就認為是合法用戶,執(zhí)行請求操作。

2)優(yōu)雅下線原則

當需要撤掉一臺網(wǎng)關服務的時候,不是直接結束網(wǎng)關進程,而是先關閉監(jiān)聽套接字,但是繼續(xù)為當前連接的客戶提供服務,所有客戶端的服務完成后,在把進程關閉。

3)Slow Start特性

當網(wǎng)關監(jiān)聽到有一臺新的服務注冊上來時,考慮到有些服務啟動后,剛開始會有許多初始化的工作,此時服務對請求的響應速度是比較慢的。如果一開始就給這臺服務分配太多的壓力,有可能導致服務瞬間被壓垮。為了避免這種情況,網(wǎng)關層需要考慮支持Slow Start特性。即,經(jīng)過一段時間,逐漸把壓力增加到預設的值。

4)業(yè)務攔截擴展

我們知道,網(wǎng)關對請求的處理,可以分為三個階段:接受請求、路由并轉發(fā)請求、接受服務的返回數(shù)據(jù)并返回給請求者,除此之外,還有一種情況是處理錯誤。所以我們也可以在這四個地方添加擴展點。

(1)接受到請求后;

(2)定位到一個服務,并準備轉發(fā)之前;

(3)接受到服務的返回數(shù)據(jù),返回給客戶端之前;

(4)當服務調用失敗后。

攔截器的處理順序,可以分為兩大類:

1. 網(wǎng)關平臺自帶的攔截器,例如安全校驗、日志記錄等;

2. 網(wǎng)關層邏輯開發(fā)的功能,例如格式轉換等。

一般來說,網(wǎng)關先執(zhí)行網(wǎng)關平臺自帶的攔截器,再執(zhí)行為了業(yè)務邏輯編寫的攔截器。當然,API網(wǎng)關也需要提供一種機制,可以比較容易地調整攔截器的執(zhí)行順序。最簡單的一種方法,就是給每個攔截器定義一個優(yōu)先級,網(wǎng)關按優(yōu)先級順序依次調用各攔截器。

對網(wǎng)關層來說,它接收和處理的數(shù)據(jù)都是業(yè)務請求(Request)對象,網(wǎng)關層在接收到請求后,把請求封裝為Request對象,為了讓后續(xù)的過濾器(Filter)能夠獲得這個對象,可以考慮把Request對象保存在線程變量中。

有些攔截器,例如一些調試日志的攔截器,通常情況下都是關閉的,只有在出現(xiàn)問題的時候才需要打開。為了保證網(wǎng)關的高可用,網(wǎng)關層必須具備在線啟用或關閉攔截器的能力。一般,API網(wǎng)關需要提供RESTful接口方式來關閉和啟用一個攔截器。

類似這樣的命令:PUT /gateway/v1/filters/filterName?enable=value

5)API管理與動態(tài)發(fā)布設計

對服務管理來說,分為前端服務管理與后端服務管理。前端服務指的是網(wǎng)關層暴露給客戶端使用的服務API,后端服務指的是服務層提供的業(yè)務服務API。一個服務暴露給客戶端使用,除了網(wǎng)關層和服務層提供服務的代碼外,還需要配置前端服務與后端服務的映射關系。

網(wǎng)關層API調用服務層API,有多種方式。例如,可以由按照服務層API的服務契約,生成一段客戶端代碼,發(fā)布給網(wǎng)關層使用。這種方式的弊端是,網(wǎng)關層代碼依賴于服務層代碼,服務層頻繁修改和調整接口時,導致網(wǎng)關層的代碼很難維護。

可以通過配置前后端服務映射的方式,解耦網(wǎng)關層對服務層的依賴。當服務層的API(例如服務名、參數(shù)名等)發(fā)生變化時,只需調整映射關系,無需對網(wǎng)關層的代碼進行調整。網(wǎng)關層按照映射,自動裝配服務層API所需要的數(shù)據(jù)格式。這樣,網(wǎng)關層團隊與服務層團隊可以相互不受干擾地開發(fā)各自的服務。

4.4 可擴展性設計

從靈活性和擴展性方面來說,在設計API網(wǎng)關時應該考慮如何對API網(wǎng)關的功能進行擴展, 網(wǎng)關應該提供擴展插件機制, 企業(yè)可以根據(jù)業(yè)務應用需求對網(wǎng)關功能進行擴展。API網(wǎng)關管理平臺可以對API網(wǎng)關業(yè)務擴展插件進行發(fā)布與下架操作。例如Kong網(wǎng)關可以通過plugin接口發(fā)布擴展插件,同時也可以通過接口下架某個插件。

總之,API網(wǎng)關作為企業(yè)業(yè)務能力開放的一個應用門戶,除了具備基本的請求轉發(fā)、認證授權、路由等功能,以及高性能和高可用性外,還需具備良好的擴展性,以便于API網(wǎng)關能力的不斷增強。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容