顧名思義,是出現在系統邊界上的一個面向API的、串列集中式的強管控服務,這裡的邊界是企業IT系統的邊界,主要起到隔離外部訪問與內部系統的作用。在微服務概念的流行之前,API網關的實體就已經誕生了,例如銀行、證券等領域常見的前置機系統,它也是解決訪問認證、報文轉換、訪問統計等問題的。移動應用、企業互聯 ...
顧名思義,是出現在系統邊界上的一個面向API的、串列集中式的強管控服務,這裡的邊界是企業IT系統的邊界,主要起到隔離外部訪問與內部系統的作用。在微服務概念的流行之前,API網關的實體就已經誕生了,例如銀行、證券等領域常見的前置機系統,它也是解決訪問認證、報文轉換、訪問統計等問題的。移動應用、企業互聯,使得後臺服務支持的對象,從以前單一的Web應用,擴展到多種使用場景,且每種使用場景對後臺服務的要求都不盡相同。這不僅增加了後臺服務的響應量,還增加了後臺服務的複雜性。隨著微服務架構概念的提出,API網關成為了微服務架構的一個標配組件。
API網關網關的價值:
-
網關層對外部和內部進行了隔離,保障了後臺服務的安全性。
-
對外訪問控制由網路層面轉換成了運維層面,減少變更的流程和錯誤成本
-
減少客戶端與服務的耦合,服務可以獨立發展。通過網關層來做映射。
-
通過網關層聚合,減少外部訪問的頻次,提升訪問效率。
-
節約後端服務開發成本,減少上線風險。
-
為服務熔斷,灰度發佈,線上測試提供簡單方案。
-
便於擴展。
常用的API網關方案
業界API網關解決方案有很多,包括商業的、開源的。例如
Tyk、
Kong、
下麵介紹三種常見的 API 網關方案。
Nginx+ Lua
Nginx是由IgorSysoev為俄羅斯訪問量第二的Rambler.ru站點開發的,一個高性能的HTTP和反向代理伺服器。2012年,Nginx榮獲年度雲計算開發獎,併成長為世界第二大Web伺服器。全世界流量最高的前1000名網站中,超過25%都使用Nginx來處理海量的互聯網請求。
Nginx基本功能:
-
靜態web資源伺服器,能夠緩存打開的文件描述符
-
支持http/imap/pop3/smtp的反向代理;支持緩存、負載均衡
-
支持fastcgi(fpm)
-
模塊化,非DSO機制,支持過濾器zip壓縮,SSI以及圖像大小調整
-
支持SSL
Nginx通過插件的擴展功能:
-
基於名稱和IP的虛擬主機
-
支持keepalive的保持機制
-
支持平滑升級
-
定製訪問日誌,支持使用日誌緩存區提高日誌存儲性能
-
支持url rewrite
-
支持路徑別名(root或alias指定)
-
支持基於IP以及用戶的訪問控制
-
支持傳輸速率限制,併發限制
Nginx在性能和高可用性上的表現:
Nginx性能極高,Nginx先天的事件驅動型設計、全非同步的網路I/O處理機制、極少的進程間切換以及許多優化設計,都使得Nginx天生善於處理高併發壓力下的互聯網請求。Nginx的穩定性也在各大網站得到驗證。官方提供的常用模塊都非常穩定,每個worker進程相對獨立,master進程在1個worker進程出錯時可以快速“拉起”新的worker子進程提供服務。支持熱部署,可以不停機更新配置文件、更新日誌文件、更新伺服器程式版本。
Nginx的擴展性:
Nginx的設計極具擴展性,它完全是由多個不同功能、不同層次、不同類型且耦合度極低的模塊組成。因此,當對某一個模塊修複Bug或進行升級時,可以專註於模塊自身,無須在意其他。
Nginx的易用性:
Nginx使用最自由的BSD許可協議,允許用戶在自己的項目中直接使用或修改Nginx源碼,有大量的插件可以利用。但是,Nginx模塊需要用C開發,而且必須符合一系列複雜的規則。雖然通過第三方模塊,可以支持Nginx與Perl、Lua等腳本語言集成工作,但對使用者的要求還是很高。
Nginx可以說是一款能夠工業化API網關,在國內的很多互聯網公司,例如阿裡、新浪等都得到很好的應用。
SpringCloud Zuul
Zuul Netflix公司開源的一個API網關組件。提供了認證&鑒權、限流、動態路由,監控,彈性,安全、負載均衡、協助單點壓測、靜態響應等邊緣服務的框架。
Zuul的基本功能:
-
驗證與安全保障: 識別面向各類資源的驗證要求並拒絕那些與要求不符的請求。
-
審查與監控: 在邊緣位置追蹤有意義數據及統計結果,從而為我們帶來準確的生產狀態結論。
-
動態路由: 以動態方式根據需要將請求路由至不同後端集群處。
-
壓力測試: 逐漸增加指向集群的負載流量,從而計算性能水平。
-
負載分配: 為每一種負載類型分配對應容量,並棄用超出限定值的請求。
-
靜態響應處理: 在邊緣位置直接建立部分響應,從而避免其流入內部集群。
-
Netflix公司還利用Zuul的功能通過金絲雀版本實現精確路由與壓力測試。
-
雖然提供的功能還算豐富,但都比較弱,很難滿足高要求的場景。
Zuul在性能和高可用性上的表現:
Zuul處理每個請求的方式是針對每個請求是用一個線程來處理。通常情況下,為了提高性能,所有請求會被放到處理隊列中,從線程池中選取空閑線程來處理該請求。2016年底,Netflix將它們的網關服務Zuul進行了升級,全新的Zuul 2將HTTP請求的處理方式從同步變成了非同步,以提升其處理性能。除了Netflix公司,目前Zuul在企業中用的還比較少,性能和穩定性方面還有待進一步觀察。
Zuul的擴展性:
從Zuul的架構圖上可以看出,Zuul更像是一個過濾器框架,其自身的路由、日誌、反向代理、ddos預防等功能都是通過過濾器實現的。提供了PRE、ROUTING、POST和ERROR四個擴展點,可以很容易的添加自定義的過濾器。
Zuul的易用性:
Zuul的搭建非常簡便,使用和配置也很簡單。Zuul的開源社區比較活躍,一直在更新狀態,但版本不算太穩定,在使用的過程中,還有一些坑要踩。例如重定向問題、異常處理問題,還沒有解決的很好,需要自己重寫一些filter。
如果從通盤考慮, 這種方案不是最佳方案。但如果自己的團隊對整體技術設施把控有限,且團隊規模不大,沒有專門的網關開發人員的情況下,Zuul是一款快速上手的最佳方案。
MashapeKong
Kong是Mashape提供的一款API管理軟體,它本身是基於Ngnix+lua的,但比nginx提供了更簡單的配置方式,數據採用了 ApacheCassandra/PostgreSQL存儲,並且提供了一些優秀的插件,比如驗證,日誌,調用頻次限制等。
Kong的一個非常誘人的地方就是提供了大量的插件來擴展應用,通過設置不同的插件可以為服務提供各種增強的功能。Kong預設插件插件包括:
-
身份認證:Kong提供了Basic Authentication、Key authentication、OAuth2.0authentication、HMAC authentication、JWT、LDAP authentication認證實現。
-
安全:ACL(訪問控制)、CORS(跨域資源共用)、動態SSL、IP限制、爬蟲檢測實現。
-
流量控制:請求限流(基於請求計數限流)、上游響應限流(根據upstream響應計數限流)、請求大小限制。限流支持本地、Redis和集群限流模式。
-
分析監控:Galileo(記錄請求和響應數據,實現API分析)、Datadog(記錄API Metric如請求次數、請求大小、響應狀態和延遲,可視化API Metric)、Runscope(記錄請求和響應數據,實現API性能測試和監控)。
-
轉換:請求轉換、響應轉換
Kong本身也是基於Nginx的,所以在性能和穩定性上都沒有問題。Kong作為一款商業軟體,在Nginx上做了很擴展工作,而且還有很多付費的商業插件。Kong本身也有付費的企業版,其中包括技術支持、使用培訓服務以及API 分析插件。
從對上面三種方案的比較中可以看到,Spring Cloud Zuul非常適合創業初期的團隊,快速搭建一個“基本可用”的API網關。Nginx適合有較強研發團隊,自主開發企業自己的API網關。Kong適合於沒有自身研發團隊,但需要擁有企業級API網關能力的公司。
轉載請標明本文來源: http://www.cnblogs.com/yswenli/p/7423254.html
更多內容歡迎star作者的github:https://github.com/yswenli
如果發現本文有什麼問題和任何建議,也隨時歡迎交流~