API閘道器意義
API閘道器旨在用一套單一且統一的API入口點,來組合一個或多個內部API。
API閘道器定位為應用系統服務介面的閘道器,區別於網路技術的閘道器,但是原理是一樣的。API閘道器統一服務入口,可方便實現對平臺眾多服務介面進行管控,如對訪問服務的身份認證、防報文重放與防資料篡改、功能呼叫的業務鑑權,以及響應資料的脫敏、流量與併發控制,甚至基於API呼叫的計量或計費等。
API並不能適用於所有場景
在基於微服務的架構設計中,往往包含多個服務,這些服務並不能適用於所有場景。例如,在一個面向PC的Web應用中,服務所要提供的API是要返回一個頁面,而非單純的資料,那麼這樣的API只能適用於Web應用,而不能適用於移動APP。
又如,在移動APP的架構設計中,由於網路頻寬的限制,在設計API時,往往會考慮較少的網路傳輸次數及更少的傳輸資料。而面向PC的Web應用卻無須考慮這些限制。
圖10-1展示了不同場景下的API閘道器使用情況。
API閘道器常用於以下場景。
黑白名單:實現通過IP地址控制禁止訪問閘道器功能。日誌:實現訪問日誌的記錄,可用於分析訪問、處理效能指標,同時將分析結果支援其他模組功能應用。協議適配:實現通訊協議校驗、適配轉換的功能。身份認證:負責閘道器訪問身份認證驗證。計流限流:實現微服務訪問流量計算,基於流量計算分析進行限流,可以定義多種限流規則。路由:是API閘道器很核心的模組功能,此模組實現根據請求鎖定目標微服務,並將請求進行轉發。API閘道器所帶來的好處
API閘道器能夠為外部消費方提供一套統一的入口點,且不會受到內部微服務的具體數量與組成的影響。
API閘道器為微服務架構系統帶來了如下好處。
1.避免將內部資訊洩露給外部
在資料安全方面,API閘道器能夠將外部公共API與內部微服務API區分開來,使各項微服務在新增或變更時,能有明確的安全邊界。這樣,微服務架構就能隨時間推移而始終通過重組來保證系統安全,且不會對外部繫結客戶造成影響。另外,其還能夠為全部微服務提供單一入口點,從而避免外部客戶進行服務發現及版本控制資訊檢視。
2.為微服務新增額外的安全層
API閘道器能夠提供─套額外的保護層,足以應對SQL注入、XML解析攻擊及拒絕服務(DoS)攻擊等常見威脅因素,從而實現額外的保護層效果。系統的許可權控制也可以在這一層來實施。
3.支援混合通訊協議
面向外部的API,由於考慮到平臺和語言的無關性,往往向外提供基於HTTP或REST的API。但內部微服務往往會採用不同的通訊協議。此類協議包括ProtoBuf、AMQP或其他整合有SOAP、JSON-RPC或XML-RPC的系統。API閘道器可跨越這些協議,提供一個外部統一的、基於REST的API,並允許各團隊以此為基礎選擇最適合內部架構的協議方案。
4.降低構建微服務的複雜性
微服務架構系統往往擁有比單個架構更多的管理複雜度,如API令牌驗證、訪問控制及速率限制等。每一項功能的實施,都會給相關實現服務帶來影響,進而會延長微服務的開發時間。API閘道器能夠從程式碼層面隔離這些功能項,使開發人員在構建單個微服務時,能夠專注於實際的核心業務。
5.微服務模擬與虛擬化
通過將微服務內部API與外部API加以區分,大家可以模擬或虛擬化自己的服務,從而滿足設
計要求或配合整合測試。
API閘道器的弊端
雖然使用API閘道器會給微服務架構帶來一定的好處,但同時仍然要考慮如下的弊端。
由於額外API閘道器的加入,會使整個開發在架構上考慮更多的編排與管理工作。在開發過程中,對路由邏輯配置要進行統一的管理,從而能夠確保以合理的路由方式對接外部API與專用微服務。除非架構本身充分適應高可用性與規模化要求,否則API閘道器往往會成為一項限制性因素,甚至引發單點故障。常見API閘道器的實現方式業界常用的API閘道器方式有很多,技術方案也很成熟,其中也不乏很多開源的產品,如NG-INX、Tyk、Kong、API Umbrella、ApiAxle、Zuul、WSO2 API Manager等。下面介紹三種常見的API閘道器方案。
NGINX
NGINX是一個免費的、開源的、高效能的HTTP伺服器和反向代理,以及一個IMAP/POP3代理伺服器。NGINX以其高效能、穩定性、豐富的功能集、簡單的配置和低資源消耗而聞名。
NGINX是為解決C10K問題而編寫的少數伺服器之一。與傳統伺服器不同,NGINX不依賴於執行緒來處理請求。相反,它使用可擴充套件的事件驅動(非同步)架構。這種架構在負載下使用小的但更重要的可預測的記憶體量。即使使用者不希望處理數千個併發請求,仍然可以從NGINX的高效能和小記憶體中獲益。NGINX在各個方向擴充套件:從最小的VPS一直到大型伺服器叢集。
NGINX擁有諸如Netflix、Hulu、Pinterest、CloudFlare、Airbnb、WordPress.com、GitHub、SoundCloud、Zynga、Eventbrite、Zappos、Media Temple、Heroku、RightScale、Engine、Yard,MaxCDN等眾多高知名度網站。
NGINX具有很多非常優越的特性。
作為Web伺服器;相比Apache,NGINX使用更少的資源,支援更多的併發連線,體現更高的效率,這點使NGINX尤其受到虛擬主機提供商的歡迎。作為負載均衡伺服器:NGINX既可以在內部直接支援Rails和PHP,也可以支援作為HTTP代理伺服器對外進行服務。NGINX用C語言編寫,系統資源開銷小,CPU使用效率高。作為郵件代理伺服器:NGINX同時也是一個非常優秀的郵件代理伺服器(最早開發這個產品的目的之一也是作為郵件代理伺服器)。將NGINX作為API閘道器
NGINX用server_name來定義伺服器名稱,所以它可以決定哪一個server塊將用來處理給定的請求,也就是實現了API閘道器的功能。
NGINX可以使用精確名稱、萬用字元、正則表示式來定義伺服器名稱。下面是一個例子。
server{listen80;server name example.org www.example.org;server {listen 80;server name .example.org;..server{listen 80;server namemail.*;server {listen80;server name~^(?<user>.+).examplel.net$;。。。}
當尋找一個虛擬伺服器的名稱時,如果指定的名稱匹配多個變數,如萬用字元和正則表示式都匹配,將會按照以下的順序選擇第一個匹配的變數。
精確名稱。以星號“*”開頭的最長的萬用字元,如“*.example.org”。以星號“*”結尾的最長的萬用字元,如“mail.*”。第一個匹配的正則表示式(根據在配置檔案中出現的順序)。Spring Cloud Zuul
Zuul是Netflix公司開源的一個API閘道器元件,提供了認證、鑑權、限流、動態路由、監控、彈性、安全、負載均衡、協助單點壓測、靜態響應等邊緣服務的框架。
Zuul的基本功能如下。
驗證與安全保障:識別面向各類資源的驗證要求並拒絕那些與要求不符的請求。審查與監控:在邊緣位置追蹤有意義的資料及統計結果,從而為使用者帶來準確的生產狀態結論。動態路由:以動態方式根據需要將請求路由至不同後端叢集處。壓力測試:逐漸增加指向叢集的負載流量,從而計算效能水平。負載分配:為每一種負載型別分配對應容量,並棄用超出限定值的請求。靜態響應處理:在邊緣位置直接建立部分響應,從而避免其流入內部叢集。Zuul處理每個請求的方式是針對每個請求使用一個執行緒來處理。通常情況下,為了提高效能,所有請求會被放到處理佇列中,從執行緒池中選取空閒執行緒來處理該請求。2016年年底,Netlix將它們的閘道器服務Zuul進行了升級,全新的Zuul 2將HTTP請求的處理方式從同步變成了非同步,以提升其處理效能。
Spring Cloud Zuul是基於Netflix Zuul的微服務路由和過濾器的解決方案,也用於實現API閘道器。
有關Zuul的內容,將會在本文後續章節中詳細介紹。
Kong
Kong 是專注於提供微服務API閘道器的管理平臺,它本身是基於NGINX的,但比NGINX提供了更為簡單的配置方式,並且提供了一些優秀的外掛,如驗證、日誌、呼叫頻次限制等。
Kong 另外一個強大之處在於提供了大量的外掛來擴充套件應用,通過設定不同的外掛,可以為服務提供各種增強的功能。Kong 的外掛平臺可以訪問/file/2020/09/14/20200914094608_8.jpg 的架構示意圖,該圖來自Kong官網。
本篇文章內容給大家講解的是API閘道器的意義和常見API閘道器的實現方式下篇文章給大家講解如何整合 Zuul和實現API閘道器;覺得文章不錯的朋友可以轉發此文關注小編;感謝大家的支援