理解WEB API網關

来源:http://www.cnblogs.com/ASPNET2008/archive/2017/02/25/6442423.html
-Advertisement-
Play Games

隱藏細節 現實生活中有很多隱藏細節的案例,比如我們平時用的電腦,當我們按電源按鈕後電腦就自動開始啟動了,對用戶來講很簡單隻需要知道按按鈕就行。但電腦內部的工作原理其實是很複雜的一個流程,這裡不多說。 如果不隱藏細節會怎樣? 我想可能的結果就是電腦只能是特別特別的專業人員才能操作,永遠無法像現在一樣成 ...


隱藏細節

現實生活中有很多隱藏細節的案例,比如我們平時用的電腦,當我們按電源按鈕後電腦就自動開始啟動了,對用戶來講很簡單隻需要知道按按鈕就行。但電腦內部的工作原理其實是很複雜的一個流程,這裡不多說。

如果不隱藏細節會怎樣?

我想可能的結果就是電腦只能是特別特別的專業人員才能操作,永遠無法像現在一樣成為大家的必備工具。對大多數用戶來講他們根本不知道知道什麼CPU,記憶體,硬碟,顯卡相互之間是如何配合工作的,只關心打開電腦後能夠正常使用軟體完成他們的任務即可。

門面模式

在面向對象設計中,GOF有個門面模式就是對客戶端隱藏細節的一個典型應用,也可以看看我早幾年前的筆記:門面模式

WEB API網關

通常WEB API網關是系統的唯一入口,它封裝了系統內部架構,為客戶端統一提供服務。有一些與業務無關的公共邏輯可以抽象到網關中實現,比如客戶端的認證,訪問控制,監控,緩存等,示意圖如下。

  • 客戶端認證
    無論是對內網還是外網的介面都是需要做用戶身份認證的,而用戶認證在一些規模大點的公司都會有統一的單點登錄系統,如果每個微服務系統都是做對接單點登錄系統的工作,那麼顯然比較浪費資源,開發效率低。可以將認證的部分抽取到網關層,然後微服務系統無需關註認證的邏輯只關註自身業務即可。

  • 訪問控制
    對一些特定的介面設置白名單,訪問次數,訪問頻率等各類設置。而這些非業務功能的配置以及變更不會影響微服務的實現可以在網關層單獨做操作。

  • 負載均衡
    可以靈活的在網關層制定負載均衡策略。

  • 安全
    可以統一在網關層增加一個額外的保護層來防止惡意攻擊,如果客戶端直連微服務的話,每個暴露的微服務都需要面臨安全問題。

WEB API網關在設計上與上面提供到門面模式是相當的,也是對客戶端隱藏細節。除了上面提供的那些常見公共功能外,還有如下一些實用的功能:

限流

對於大型互聯網項目還會有限流的需求。為了防止站點不被未知的大流量沖跨,有可能會採取限流的策略,網關配置一個閥值,當請求數超過閥值時就直接返回錯誤而不會走剩下的邏輯。

限流如何實現?限流的方案有很多:

  • 在網關層可以利用hystrix來實現。
  • 如果是針對待定的客戶端也可以利用nginx的限流。
  • guava提供了一個RateLimiter,它是基於令牌桶的演算法實現,以固定的速率往隊列中放令牌,可以結合它自己實現限流可以結合它自己實現限流。

可相容更多的協議

比如有些服務是SOAP,基於二進位的Thrift,還有DUBBO這類RPC實現,可以統一轉換成HTTP來對外提供。

微服務帶來的問題

隨著業務的發展,原來簡單的系統會變得越來越複雜,一個團隊變成多個團隊,多個團隊同時在一個系統中開發會存在各種各樣的問題,數據量的增長也會使單庫的性能越來越慢,所以隨其自然的會按業務對系統進行垂直劃分,比如:

  • 產品系統
  • 價格系統
  • 促銷系統
  • 訂單系統
  • 庫存系統
  • 評論系統
  • 推薦系統
  • 用戶系統

這些系統當下比較流行的是以微服務的形式存在,暴露一批細粒度的介面給其它系統調用。

前端系統如何調用微服務?

比如用戶查看一個產品的明細頁面,它會包含產品基本信息,價格信息,促銷信息,推薦信息,評論信息等,按上面的微服務組成,前端系統想拿到產品的所有數據需要調用眾多的微服務,這在要求性能的互聯網項目上是不太可行的,光http請求就比之前增加多倍,而且也會增加客戶端的複雜度,它需要知道所有這些微服務的詳細信息。

不要讓前端知道微服務的存在

即使系統從業務領域的層次上被劃分成多個獨立的微服務,但對於前端系統還是應該隱藏細節,提供粗粒度的介面。

系統架構

這裡回顧下以前我參與的一個跨境電商系統,從架構來看還是做的比較標準的。前端是APP以及H5,對接一個mobile api,mobile api內部包含各類子服務。

其實我們是針對項目的,電商系統對接mobile api,另外一個線下店的APP對接的新開發的store api。這兩個api是完全獨立的,並不是一個公司一個web api,所以說我們這兩web api是項目級別的網關,而有些公司可能會提供公司級別的網關。

架構簡要說明:

  • 前端是APP+H5
  • H5站點是通過Nginx做反向代理去執行js,不懂APP,所以略過。
  • Mobile API,H5以及APP唯一對接後端的入口,採用Spring MVC實現。裡面包含了所有前端需要用到的介面。
  • 微服務,DUBBO實現的RPC,資料庫中間件mybatis。
  • 緩存,基於Spring Cache+redis。
  • 檢索系統,基於elasticsearch。
  • 消息系統,RabbitMQ。上圖中沒有體現,是將業務數據更新到檢索系統的一個broker。

未用到限流,當時數據量太小,擔心的不是伺服器被沖跨是擔心沒人沖。
也不包含一些並行請求合併的高級用法,可以理解成一個高內聚的服務。

WEB API網關的優點

  • 隱藏細節,對客戶端友好
  • 簡化了客戶端開發複雜度
  • 降低了客戶端與服務端交互交互
  • 可統一做切麵任務,避免每個子系統各自為營,五花八門
  • 使客戶端與服務端解耦,容易構造異構系統

WEB API網關的缺點

  • 需要增加一個高可用伸縮性強的站點。
  • WEB API網關項目在開發上是個串列任務,每暴露一個介面都需要去更新WEB API網關,如果同時有不同部門的需求去更新就會存在排隊更新的情況。

上面的缺點相對WEB API網關帶來的缺點是可以容忍的。


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

-Advertisement-
Play Games
更多相關文章
  • 四種引用類型的概念 強引用 StrongReference 如果一個對象具有強引用,那麼垃圾回收器絕對不會回收它,當記憶體不足時寧願拋出 OOM 錯誤,使得程式異常停止。 即是一個強引用。 軟引用 SoftReference 如果一個對象只具有軟引用,那麼垃圾回收器在記憶體充足的時候不會回收它,而在記憶體 ...
  • 一, java多線程 線程與進程 進程: 程式(任務)的執行過程,擁有資源(共用記憶體,共用資源)和線程(一個或者多個,至少一個)。 例如:打開任務管理器,qq,chrome,都屬於進程。 線程: 系統中最小的執行單元,同一進程中有多個線程,線程共用進程的資源。 例如:qq的聊天發送消息。 單線程:程 ...
  • 1. MyBaits基本概念:略 2. 案例:需求:建立資料庫查詢,一對一 3.開發步驟: (1).建立資料庫+表 (2).加包 (3).定義實體類 (4).編寫db.properties,將資料庫信息寫入其中;編寫MyBatis的配置文件conf.xml文件,引入db.properties;引入別 ...
  • 嗯,這篇講可用的多線程記憶體池。 零、上期彩蛋:不要重載全局new 或許,是一次很不愉快的經歷,所以在會有這麼一個“認識”。反正,大概就是:即使你足夠聰明,也不要自作聰明;在這就是不要重載全局new,無論你有著怎樣的目的和智商。因為: 這是一個不對稱的介面:只告訴了我們如何創建一個【堆】對象,但是釋放 ...
  • 1 package cn.temptation; 2 3 public class Sample01 { 4 public static void main(String[] args) { 5 System.out.println("第一個例子"); 6 } 7 } 1 package cn.te... ...
  • Java泛型是JDK1.5加入的新特性。泛型是指參數化的能力。可以定義帶泛型的類型的類或者方法,編譯時期編譯器會用具體的類型來代替它。Java泛型有泛型類、泛型介面和泛型方法。泛型的主要優點是能夠在編譯時期而不是在運行時期就檢測出錯誤。 泛型的出現 在JDK1.5之前,java.lang.Compa ...
  • 引入線程池的原因 通常我們需要使用線程去完成某項任務的時候都會去創建一個線程,一般都會這麼寫: 這樣操作直接且簡單,當然是沒有錯的,但是卻存在這一些問題。在應付一些線程併發不多的情況時是完全夠用的,但是如果併發的線程數量很多,就會造成系統的效率降低。主要會造成如下影響: 頻繁創建和銷毀線程占用大量不 ...
  • 運算符優先順序: siwtch語句註意事項: for迴圈 continue :跳過迴圈體中剩餘的語句執行下一次迴圈 break:退出指定的迴圈,直接執行迴圈後面的代碼 使用Scanner工具類來獲取用戶輸入的信息 示例:接收3個班級各4名學生的成績,計算每個班級的學生的平均分並列印出來。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...