顧名思義,是出如今系統邊界上的一個面向API的、串行集中式的強管控服務,這裏的邊界是企業IT系統的邊界,主要起到隔離外部訪問與內部系統的做用。在微服務概念的流行以前,API網關的實體就已經誕生了,例如銀行、證券等領域常見的前置機系統,它也是解決訪問認證、報文轉換、訪問統計等問題的。移動應用、企業互聯,使得後臺服務支持的對象,從之前單一的Web應用,擴展到多種使用場景,且每種使用場景對後臺服務的要求都不盡相同。這不只增長了後臺服務的響應量,還增長了後臺服務的複雜性。隨着微服務架構概念的提出,API網關成爲了微服務架構的一個標配組件。html
API網關網關的價值: nginx
網關層對外部和內部進行了隔離,保障了後臺服務的安全性。git
對外訪問控制由網絡層面轉換成了運維層面,減小變動的流程和錯誤成本github
減小客戶端與服務的耦合,服務能夠獨立發展。經過網關層來作映射。web
經過網關層聚合,減小外部訪問的頻次,提高訪問效率。後端
節約後端服務開發成本,減小上線風險。api
爲服務熔斷,灰度發佈,線上測試提供簡單方案。跨域
便於擴展。緩存
經常使用的API網關方案安全
業界API網關解決方案有不少,包括商業的、開源的。例如
Tyk、
Kong、
下面介紹三種常見的 API 網關方案。
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網關,在國內的不少互聯網公司,例如阿里、新浪等都獲得很好的應用。
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是一款快速上手的最佳方案。
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若是發現本文有什麼問題和任何建議,也隨時歡迎交流~