微服務架構下的API網關

顧名思義,是出如今系統邊界上的一個面向API的、串行集中式的強管控服務,這裏的邊界是企業IT系統的邊界,主要起到隔離外部訪問與內部系統的做用。在微服務概念的流行以前,API網關的實體就已經誕生了,例如銀行、證券等領域常見的前置機系統,它也是解決訪問認證、報文轉換、訪問統計等問題的。移動應用、企業互聯,使得後臺服務支持的對象,從之前單一的Web應用,擴展到多種使用場景,且每種使用場景對後臺服務的要求都不盡相同。這不只增長了後臺服務的響應量,還增長了後臺服務的複雜性。隨着微服務架構概念的提出,API網關成爲了微服務架構的一個標配組件。html

API網關網關的價值: nginx

  • 網關層對外部和內部進行了隔離,保障了後臺服務的安全性。git

  • 對外訪問控制由網絡層面轉換成了運維層面,減小變動的流程和錯誤成本github

  • 減小客戶端與服務的耦合,服務能夠獨立發展。經過網關層來作映射。web

  • 經過網關層聚合,減小外部訪問的頻次,提高訪問效率。後端

  • 節約後端服務開發成本,減小上線風險。api

  • 爲服務熔斷,灰度發佈,線上測試提供簡單方案。跨域

  • 便於擴展。緩存

 

經常使用的API網關方案安全

業界API網關解決方案有不少,包括商業的、開源的。例如

Amazon API Gateway

Tyk

Kong

api-umbrella

apiaxle

Netflix zuul

WSO2 API Manager

clydeio

阿里API網關

下面介紹三種常見的 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若是發現本文有什麼問題和任何建議,也隨時歡迎交流~

相關文章
相關標籤/搜索