微服務架構下的API網關

来源:http://www.cnblogs.com/yswenli/archive/2017/08/24/7423254.html
-Advertisement-
Play Games

顧名思義,是出現在系統邊界上的一個面向API的、串列集中式的強管控服務,這裡的邊界是企業IT系統的邊界,主要起到隔離外部訪問與內部系統的作用。在微服務概念的流行之前,API網關的實體就已經誕生了,例如銀行、證券等領域常見的前置機系統,它也是解決訪問認證、報文轉換、訪問統計等問題的。移動應用、企業互聯 ...


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

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
如果發現本文有什麼問題和任何建議,也隨時歡迎交流~

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 為什麼將單例模式排名第一,很簡單,面試的時候聊到設計模式,大概率就從單例模式開始入手,循循漸進。 當然,我們學習單例模式不是為了去應付面試,而是學好設計模式後,融匯貫通,應用於我們的設計,開發,項目中。 單例模式是最簡單的設計模式之一 單例模式【Singleton Pattern】:保證一個類僅有一 ...
  • ## 業務場景寫一個數據層的loader,loader的數據拉取有可能走本地或者走網路,所以肯定需要通過回調來返回數據,而且兩種情況在view層的表現不一樣(一個顯示載入框一個不顯示),也需要通過回調來告知。## 優化前最簡單的做法是寫一個這樣的介面,把所有可能要做的事情都各寫一個方法,比如這樣:`... ...
  • 裝飾者模式類似於代理,你將一個對象傳進去裝飾類,它將此對象的同名方法做一些加強 1.要被修飾的父類 2.裝飾的父類 3.創建兩種被修飾的類 4.創建裝飾類 5.組合(把被修飾的類進行裝飾加強) 結果是這樣的: tip:這裡,你可以說,幹嘛這麼麻煩,繼承不就搞定了,但是,你有沒有想過,如果萬一有一點, ...
  • 目前微服務受到很多關註:文章、博客、社交媒體上的討論和會議演講。他們正在迅速走向加德納技術成熟度曲線(Gartner Hype cycle)的高峰。與此同時,也有持懷疑態度的軟體社區人員認為微服務沒什麼新鮮可言。反對者聲稱它的思想只是面向服務架構(SOA)的重塑。然而,無論是炒作還是懷疑,不可否認微... ...
  • 本文是筆者多年來積累和收集的知識技能圖譜,有的是筆者原創總結的最佳實踐,有的是小伙伴們的分享,其中每個秘籍圖譜裡面的內容都是互聯網高併發架構師應該瞭解和掌握的知識,筆者索性把這些圖譜收集在一起,並且歸類便於查找和學習,希望能夠幫助到每一位想成為架構師或者已經是架構師的小伙伴,這裡我們的標題“史上最全 ...
  • 針對功能需求 是否詳細定義了系統的全部輸入,包括其他源、精度、取值範圍、出現頻率等 是否定義了系統的全部輸出,包括目的地、精度、取值範圍、出現頻率、格式等 是否詳細定義了所有輸出格式,web頁面、報表等 是否詳細定義了所有硬體和軟體的外部介面,是否詳細定義了全部外部通信介面,包括握手協議,糾錯協議、 ...
  • 兩個介面,一個主題介面(一般包含了註冊觀察者,刪除觀察者,發佈三個方法),一個觀察者介面(一般只要有一個update,但發佈消息時給主題調用). 1.觀察者介面 2.主題發佈者介面 3.觀察者實現 4.主題發佈者實現 5.整合測試,兄弟 結果應該是這樣的,他們都收到了消息. ...
  • 接收請求參數 一、使用HttpServletRequest 二、參數自動匹配 SpringMVC會自動將表單參數註入到方法參數,只要和表單的name屬性保持一致 前端請求的表單 Controller代碼 三、bean對象的自動裝箱 Controller代碼段 四、 @RequestParam獲取參數 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...