分享一些關於網關和代理的初學者指南

2020-12-10 三微授漁

你是否聽說過網關,代理(正向和反向),負載平衡器,API網關?你可能做到了,即使你沒有聽說過,也可能聽說過nginx,HAProxy,Envoy,Traefik,Gloo,Kong,Ambassador,Tyk等產品。你可能每次都使用網關,甚至都不知道。網關通常位於客戶端與支持應用程式或服務之間。網關的工作是代理或「協商」客戶端與伺服器之間的通信。想像一下通過正門走進購物中心。當你走進時,可能會遇到以下其中一種情況:

購物中心目錄。無論你去哪個購物中心,你都將遇到一個顯示所有商店名稱及其位置的目錄,並且可能還包括地圖。假設你想參觀樂高商店。你知道這家商店在購物中心內,但你不知道確切的地址。幸運的是,知道商店的名稱並使用目錄查找商店在購物中心內的位置就足夠了。

現在,如果我們將購物中心視為伺服器(或伺服器集群),那麼購物中心中的商店就是在該伺服器上運行的服務或應用程式。在這種情況下,客戶端是你或你的計算機。如果購物中心中只有一家商店,那麼問題就不那麼重要了-只有一個地址,你知道去哪裡。

但是,我們都知道那不是現實。就像購物中心裡有數百家商店一樣,伺服器上也可以運行數百個或更多應用程式。我們可以說,記住所有地址的客戶端至少是不實際的,更不用說在伺服器上只運行一個應用程式了。

回到類比-你可以將Mall目錄視為軟體世界中的網關。該網關知道所有應用程式所在的位置。它知道伺服器上運行的每個應用程式的實際地址(例如IP或完全限定的域名)。

就像你不需要知道商店的確切地址一樣,客戶端也不需要通過網關發出請求。

如果你想到達lego商店或致電應用程式,則可以請求stores.example.com/lego,網關將知道將請求轉發或代理到實際地址。可以在客戶端和應用程式之間放置一個用於傳入流量的網關,因此稱為入口網關。客戶端不需要發出請求來分離應用程式,而只需要了解網關並向網關發出請求。路由傳入的請求並通過公共端點公開API僅是網關可以承擔的部分職責。網關執行的其他典型任務是速率限制,SSL終止,負載平衡等。

什麼是限速?

將速率限制視為一個漏鬥,它僅允許每單位時間一定數量的請求通過應用程式。如果我將購物中心的類比與黑色星期五結合在一起,則商店已滿,因此你需要限制可以進入商店的人數。

速率限制器的作用非常相似-它限制了一定時間內可以發出的請求數量。例如,對於每秒10個請求的速率限制,客戶端每秒只能發出10個請求。如果客戶端嘗試每秒發出10個以上的請求,則表示它們受到伺服器的速率限制。在這種情況下,伺服器的HTTP響應為429:Too Many Requests。

什麼是SSL終止?

SSL代表安全套接字層協議。SSL終止或也稱為SSL卸載是解密加密流量的過程。SSL終止與網關模式完美配合。當加密的流量到達網關時,它將在那裡解密,然後傳遞到後端應用程式。在網關級別執行SSL終止還可以減輕伺服器的負擔,因為你僅在網關級別執行一次,而不是在每個應用程式中執行一次。

你可以在每個應用程式或服務上實現這些功能,如下圖所示。

但是,如果在每個應用程式級別執行SSL終止和速率限制,則都會「花費」時間和資源。網關可以幫助卸載此功能,並在網關級別執行一次。

這是一些可以在網關級別上卸載和執行的功能的列表:

認證方式

SSL終止

負載均衡

限速

斷路

基於客戶端的響應轉換

什麼是斷路?

斷路是可以幫助提高服務彈性的一種模式。一旦應用程式已經失敗,它可以防止對應用程式進行不必要的請求。你可以檢查「什麼是電路斷路?」 找到更多詳細信息。

網關方法也有其缺點。它是你必須開發,維護或至少配置(如果使用現有網關解決方案)的附加軟體。你還需要確保網關不會成為瓶頸-如果不需要,不要嘗試將太多的東西卸載到網關上。

出口網關

另一方面(或另一端),出口網關在你的專用網絡內部運行,並且可以用作退出網絡的流量的出口點。例如,如果你的應用程式與外部API(例如,Github)進行交互,則對https://api.github.com的任何請求都將首先通過出口網關,然後出口網關可以將調用代理到外部服務。

你為什麼要使用出口網關?出口網關用於控制所有退出網絡的流量。例如,如果你知道自己的外部依賴關係(例如Github API),則可以阻止任何其他出站連接。萬一你的服務受到威脅,阻止所有出站連接將阻止潛在的攻擊者進行進一步的攻擊。如果我們更進一步,則可以在專用計算機上運行出口網關,在其中可以應用更嚴格的安全策略並分別監視計算機。另一個常見的情況是你的伺服器無法訪問外部IP或公共Internet。在這種情況下,你的出口網關(可訪問網絡中的服務)充當所有外部請求的出口點。

實踐中的網關

讓我們以一個簡單的示例來結束此示例,該示例顯示網關的一些基本功能。我將使用HAProxy,但其他代理也可以實現相同的功能。你可以從GitHub存儲庫中獲取原始碼。

我創建了一個名為Square的服務,該服務公開了一個API。API從URL(一個數字)中獲取一個參數,然後返回該數字的平方。該服務打包在Docker映像中。要在你的機器上運行它,你將必須下載並安裝Docker。你可以按照說明下載和安裝Docker Desktop。

安裝Docker Desktop後,打開終端窗口,然後運行learnloudnative/square:0.1.0Docker映像。

第一次運行上述命令時,可能需要花費一些時間,因為Docker需要下載(或使用Docker術語提取)鏡像。由於Square服務公開了API,因此我們需要在要訪問API的位置提供埠號。因此-p 8080:8080-第一個8080是說我們要在本地計算機的埠8080上公開該服務,第二個8080是該服務正在偵聽的埠號。

下載映像並運行容器後,你將看到以下消息:

讓我們嘗試向服務發送請求。打開第二個終端窗口,以使服務保持運行,並運行以下命令

該服務將返回結果(625),你將在上一個終端窗口中注意到請求也已記錄:

你可以按CTRL + C停止運行該程序。

添加代理

為了使事情更容易運行,我將使用同時運行Square服務和HAProxy實例的Docker Compose。如果您不熟悉Docker Compose,請不要擔心,它只是同時運行多個Docker容器的一種方式。

該docker-compose.yaml文件定義了兩個服務- haproxy和和square-service。該docker-compose.yaml文件如下所示:

除了撰寫文件之外,我們還需要一個配置文件來配置HAProxy應該做什麼。記住,我們不會直接調用square-serviceDirect,而是將請求發送到代理,代理會將請求傳遞給square-service。

使用haproxy.cfg具有以下內容的文件配置HAProxy :

我們對兩個部分感興趣- frontend和backend。我們正在調用前端部分api_gateway,這是將代理綁定到地址和埠以及路由傳入流量的位置。我們只是在前端部分之後定義default_backend的be_square後端設置a 即可。

在後端部分,我們將創建一個s1帶有端點的單個伺服器square-service:8080-這是我們為docker-compose.yaml文件中的Square服務定義的名稱。

讓我們使用Docker compose來運行這兩個服務。請確保您從你的文件夾運行以下命令docker-compose.yaml和haproxy.cfg文件包括:

Docker compose完成工作,創建一個新網絡和兩個服務。從第二個終端,讓我們再次運行curl命令:

請注意,這次,我們使用的埠5000是HAProxy公開的埠(請查看docker-compose.yaml文件中的ports部分)。和之前一樣,你可以從Square服務獲得響應。這次的區別是請求首先通過了代理。

您可以再次按CTRL + C停止運行Docker compose。

在HAProxy上啟用統計信息

由於每個請求都通過代理,因此它可以收集有關請求,前端和後端伺服器的統計信息。

讓我們在HAProxy中啟用統計信息,方法是在haproxy.cfg文件末尾添加以下幾行:

上面啟用了port 8404和URI的統計信息/stats。由於我們要從代理訪問統計信息,因此我們還需要在中公開它docker-compose.yaml。在文件"8404:8404"的ports鍵下添加以下行docker-compose.yaml:

ports:

停止docker-compose如果它正在運行(按CTRL + C),然後運行docker-compose down以刪除服務,然後docker-compose up再次啟動它們。

容器啟動後,即可http://localhost:8404/stats在瀏覽器中打開。通過運行curl localhost:5000/square/25以生成一些數據來提出幾個請求。你將在HAProxy的統計信息報告中注意到會話數。

啟用健康檢查

HAProxy還支持運行狀況檢查。可以將HAProxy配置為定期向後端服務發出TCP請求,以確保它們「有效」。要啟用運行狀況檢查,你可以check在haproxy.cfg文件中定義伺服器後端的同一行上添加單詞。像這樣:

更新配置文件後,停止Docker compose(CTRL + C),然後docker-compose up再次運行以重新啟動容器。

如果你打開或刷新stats頁面http://localhost:8404/stats,你會注意到be_square表中的行現在變為綠色,這意味著代理正在執行運行狀況檢查,並且該服務運行正常。在報告圖例中,你將看到已active UP使用的。此外,該LastChk列還將顯示運行狀況檢查的結果。

拒絕要求

假設我們要保護我們的Square服務,並要求用戶在發出請求時提供API密鑰。如果他們沒有API密鑰,則我們不想允許他們調用該服務。

使用HAProxy進行此操作的一種方法是對其進行配置,以使其拒絕所有未設置API標頭的請求。為此,你可以bind在haproxy.cfg文件的前端部分中的命令之後添加以下行:

此行告訴代理拒絕所有請求,除非有一個名為api-keyset 的標頭。讓我們重新啟動容器(CTRL + C和docker-compose up),看看它是如何工作的。

如果你在未api-key設置標頭的情況下發出請求,則會返回403響應,如下所示:

但是,如果你包含api-key標頭,則代理將使請求通過,然後你將獲得服務的響應,就像之前一樣:

限速請求

最後,我們還要實現一個速率限制器,這樣一個用戶就不能發出太多請求,也不會給服務帶來不必要的壓力。

我們將不得不在haproxy.cfg文件中定義幾件事。我將首先分別解釋它們,然後我們將它們放在一起。

存儲/計數請求

為了使速率限制器正常工作,我們需要一種計數和存儲所發出請求數量的方法。我們將使用HAProxy稱為stick table的內存中存儲。使用stick表,你可以存儲請求數,然後在一定時間(在我們的情況下為5分鐘)後自動使請求過期(刪除):

設置請求限制

我們還需要設置一個限制。這個限制是一個數字,從這一點開始,我們將拒絕(或限制)請求。我們將使用訪問控制列表或ACL來測試條件(例如,請求數量是否大於X)並基於該條件執行操作(例如,拒絕請求):

上一行檢查具有特定api-key值的請求數是否大於10。如果未超出限制,我們將跟蹤請求並允許其繼續:

否則,如果超出限制,我們將拒絕該請求:

所有這些更改都需要frontend api_gateway在haproxy.cfg文件的部分中進行。這應該是這樣的:

是時候嘗試一下了!重新啟動容器,並向該服務發出10個請求。在第11個請求上,你將獲得429 Too Many Requests響應,如下所示:

您可以等待5分鐘以使速率限制器信息失效,或者嘗試使用其他方法api-key,您會發現請求將通過

最後,您可以再次檢查stats頁面,特別是表中的Denied列api_gateway。「 拒絕」列將顯示被拒絕的請求數。

總結

在本文中,我解釋了什麼是網關或代理,並展示了一些實用的示例,說明了如何使用網關來實現速率限制或拒絕請求。

相關焦點

  • 詳解API網關核心功能和API管理擴展
    當我們談到這裡的時候,你會發現我們常說的API網關的服務代理或透傳能力,實際和我們常說的Ngnix反向代理或路由是一個意思。如果你僅僅是為了統一API接口的訪問出口,並考慮類似DMZ區的安全隔離,那麼在你架構前期完全不需要馬上實施API網關,直接採用Ngnix進行服務路由代理即可。
  • 動態代理ip與靜態代理ip,有什麼區別?
    代理ip從ip的撥號方式來區分,分為動態ip和靜態ip,所以就衍生出來代理ip也分為動態代理ip和靜態代理ip。要了解動態代理ip與靜態代理ip有什麼區別,先說一下動態ip與靜態ip是什麼?動態ip就是可以變動的ip,在ip地址的使用過程中,由於大部分用戶上網設備和時間並不多,也不存在有監督的需求的緣故,為了減少由於IP位址設置有誤而不能上網的問題,有一種動態主機配置協議DHCP,來為連接的主機或手機等上網設備從他的地址池裡分配包括IP,子網掩碼,網關,DNS一系列邏輯地址來保證聯通,一般由路由器負責DHCP!所以動態ip也是住宅ip最常見的一種。
  • 拳擊套初學者指南
    拳擊套初學者指南進行出色的心血管鍛鍊拳擊-在30分鐘的激烈拳擊中,您也可以燃燒多達900卡路裡,從而使您成為燃燒脂肪,鍛鍊肌肉的機器。而且它恰好是一種出色的緩解壓力的鍛鍊方法。打一些東西以釋放被壓抑的侵略只是一種治療方法。
  • 代理伺服器有哪幾種 如何獲取代理伺服器【詳細介紹】
    代理,也稱網絡代理,是一種特殊的網絡服務,允許一個網絡終端(一般為客戶端)通過這個服務與另一個網絡終端(一般為伺服器)進行非直接的連接。一些網關、路由器等網絡設備具備網絡代理功能。  代理技巧  在搜索代理伺服器時,輸入的IP範圍非常重要,一般來說,設置代理伺服器比較多的地方是一些經濟比較發達的地區,你可以找到全國各省市的IP位址,然後有針對性地進行搜索。  代理伺服器新手應用指南  首先我要說明,我們這裡要談的代理,是代理伺服器,英文名叫Proxy Server。
  • Fizz Gateway 1.1.0 版本重大更新,基於 WebFlux 開發的微服務網關
    新增網關分組管理模塊3. 新增插件管理模塊4. 支持appid管理支持自定義配置和IP段配置5. 優化路由管理和插件展示6.刪除服務白名單配置,由統一路由控制Fizz Gateway是一個基於Java異步框架WebFlux開發的微服務網關,能夠實現熱服務編排、自動授權選擇、線上服務腳本編碼、在線測試、高性能路由、API審核管理等目的,擁有強大的自定義插件系統可以自行擴展,並且提供友好的圖形化配置界面,能夠快速幫助企業進行API服務治理、減少中間層膠水代碼以及降低編碼投入、提高API服務的穩定性和安全性。
  • LoRa網關是什麼、Lora容量、Lora網關分類
    一、LoRa網關是什麼?LoRa網關位處LoRa星形網絡的核心位置,是終端和伺服器(Server)間的信息橋梁,是多信道的收發機。LoRa網關有時又被稱為LoRa基站或LoRa集中器,雖然定義不同,但其實是同一含義。LoRa網關應用不一樣的擴頻因素,不一樣的擴頻因素兩組正交和因此理論上能夠 在同一無線信道中對好幾條不一樣擴頻因素的數據信號開展調製解調。
  • Apache Knox 1.3.0 發布,用於數據處理的 REST API 網關
    Apache Knox 1.3.0 已發布,Apache Knox 是一個 REST API 網關,用於提供對數據的安全訪問和處理 Hadoop 集群的資源。
  • 什麼是邊緣計算網關?TLINK邊緣計算網關又是啥?
    不用關心外網IP、設定路由、開放埠,也無需費時費力架設VPN網絡,TLINK網關解決上述的問題並提供完整解決方案。利用遠程協助的技術讓操作人員不需要到現場也可以診斷機臺的運行狀況,並且可以遠程修改HMI程序。目前已支持手機APP、微信小程序和PC瀏覽器。
  • 騫雲SmartCMP SaaS版12月產品更新 | 新增堡壘機與雲網關,雲上費用...
    您只需要在公有雲和網絡隔離的數據中心分別部署一個雲網關,就能藉助雲網關訪問並管理隔離區域的雲資源,從而避免將所有需要管理的雲資源的埠進行開通或暴露到公網。 雲網關部署成功之後,可以發揮以下功能:1、關聯雲網關與雲平臺,雲網關能夠負責轉發管理雲平臺的請求。例如:雲管平臺通過雲網關能夠連接並管理隔離網絡環境的雲平臺。
  • IP代理軟體哪個比較好,這些要了解!
    現在在百度上面搜索「IP代理軟體」,隨便一搜就可以搜索到很多IP代理軟體,有免費的也有付費的,有國內的也有國外的。那麼,市場上IP代理軟體眾多,如何選擇一個優秀的IP代理軟體呢?選擇一款有品質服務、售後保障、高效穩定的IP代理軟體,需要我們慧眼識金,大浪淘沙。為什麼需要IP代理軟體?為什麼說網際網路離不開IP代理軟體呢?
  • 案例分享:德國赫優訊NT100網關在華晨寶馬車廠中的應用
    在汽車安裝中幾乎所有系統和組件的製造過程都要用到視覺機器和ID工具。從工件組裝的第一步到最終的檢驗,所有重要產品參數都會被檢測、檢驗,其結果將發送至上位以備進一步處理。這可以最大限度地減少生產中的錯誤。在每個工作站各安裝有一臺 PC,操作員在此使用讀碼器對編碼進行掃描。創建的數據之後可以準確地分配到數據系統中。
  • 初學者必備,瑜伽入門完整指南
    在進一步的了解中,這裡有一些關於瑜伽的重要事項。01.瑜伽史(極簡版)瑜伽起源於印度,主要是作為宇宙哲學(意思,就像一切)。在瑜伽的大部分歷史中,身體方面主要包括幾個坐姿和呼吸控制,以支持深度冥想的練習。
  • 知點日語一對一:給初學者的一些建議和忠告
    如今學習小語種的人越來越多,其中以學習日語的人尤盛,當面對這門看似熟悉其實又很陌生的語言時,想必有很多的不安與彷徨,特別是對於初學者來說,學習一門語言這麼巨大繁雜的工程,知點學派日語一對一在這裡有幾點建議和忠告:1、關於五十音圖
  • HTTP代理ip協議都有什麼特點和原理
    一、HTTP協議1.1 HTTP特點無狀態使用URI定義網際網路資源HTTP方法GET:獲取資源POST:傳輸實體主體PUT:傳輸文件HEAD:獲得報文首部DELETE:刪除文件OPTIONS:詢問支持的方法TRACE:追蹤路徑CONNECT:要求用隧道協議連接代理持久連接節省通信量管線化實現並行發送多個請求
  • 荒野大鏢客2:終極版,送給你的Online線上初學者的指南
    荒野大鏢客2:終極版,送給你的Online線上初學者的指南荒野大鏢客2Online終於開啟了線上測試版,而Online版本與線下單人版本同樣擁有龐大的遊戲內容,並且在不斷的完善學習與進步,即時截止目前為止,可能已經有玩家投入了數十個小時去探索遊戲內容。
  • 家庭網關關鍵技術問題有哪些 家庭網關面臨技術挑戰介紹【圖文】
    新近另外的一種選擇也正在成為研究的熱點,那就是和3G網絡的結合。歐洲一些運營商正在研究把家庭網絡集成到UMTS網絡中,做為3G網絡的一個延伸,每個HG類似於一個簡化的小型微蜂窩。通過專用3G接入信道(WCDMA或HSDPA),提供任何類型的蜂窩服務,比如話音,Internet接入,下載,網絡電視等。由於幹擾環境局限在比較小的範圍,採用HSDPA可以達到幾Mbps的傳輸速率。
  • 淺談IP代理的種類和區別
    為什麼需要使用它來上網,因為網絡的設定是尤為複雜的,經常性以一同IP位址頻繁訪問某一網頁或相同IP位址登錄操作多個帳號,而導致其當前自身IP位址受限或IP被封的情況,此時就需要採用IP代理技術來獲取到新的IP位址進行網絡訪問,規避掉因封IP導致的網絡無法正常使用的情況,而在這其中IP代理又被細分為以下幾類,下面小編就談談它的種類和區別。
  • 初學者如何挑選網球拍
    每個人的體能、愛好與年齡各不相同,因此對於球拍的要求也不盡相同,針對自己打球的水平和習慣挑選一副好的球拍,可以使你在球場上的表現更加精彩,同時可以降低運動傷害
  • 長話不必短說 話費超便宜IP電話網關試用
    如果想開IP話吧,這款電話網關也支持計費功能,後文的評測中我們會詳細介紹。阿里通IP電話網關試用  HT-842R是一款廉價的四口IP語音網關,它能配合現在絕大部分營運商的H.323或SIP,IP電話系統使用,在轉換SIP和H.323協議時不需升級。提供4個標準的24V FXS電話接口,能配合各種標準電話機、無繩電話使用。
  • 手繪初學者自學方法分享
    但手繪對於很多設計類和美術專業的學生來說又是非常重要的。它不僅是畫師練習塑造能力和打形能力的關鍵,也是提高自己審美和藝術素養的最佳方式了。也正因為此依然有很多同學對於手繪的學習抱有極大的興趣。那麼對於美術初學者來說,自學手繪又該如何入門呢?其實方法真的有很多,不過從初學者角度考慮的話,還是從臨摹自己喜歡的東西開始最好。