主頁 > 軟體設計 > Ribbon粗淺理解

Ribbon粗淺理解

2021-04-02 11:06:48 軟體設計

一、Ribbon簡介

? Ribbon是Netflix發布的負載均衡器,有助于控制Http和Tcp的客戶端行為,配置Ribbon服務提供者地址后,Ribbon就可以基于某種負載均衡演算法,自動地去幫助服務者請求,Ribbon默認提供了幾種負載均衡演算法,例如輪詢、隨機等,我們也可以自己定義自己的負載均衡演算法,

? 在SpringCloud中,當Ribbon與Eureka配合使用時,Ribbon可自動從Eureka Server獲取服務提供者地址串列,并基于負載均衡演算法,請求其中一個服務提供者實體,展示了Ribbon與Eureka配合使用時的架構,

在這里插入圖片描述

二、Ribbon的使用

首先需要去搭建一個本地的 Eureka 注冊中心具體流程省略:
在這里插入圖片描述

其次就是去搭建兩個Eureka Client,流程省略:
在這里插入圖片描述

讓它們注冊到本地注冊中心當中,

在這里插入圖片描述

然后開始負載均衡的配置,因為Eureka Client包當中已經引入Ribbon的相關依賴了,所以不需要新加入Ribbon依賴

在這里插入圖片描述

在我們服務呼叫方也就TRADE-ADMIN中,在Application.class中去添加注解@LoadBlanced,不加就是不使用負載均衡,那么它呼叫服務后,就可能默認優先在第一個埠,偶爾會切換第二個埠,

在這里插入圖片描述

然后用@feign就可以呼叫我們的服務了,由于這里Ribbon沒有配置,Ribbon就會根據它的默認負載均衡演算法從我們的服務串列中找到合適的埠去呼叫服務了

測驗結果如下:

TRADE-ADMIN 服務利用feign去遠程呼叫 TRADE-CLIENT 服務,以埠號作為標記,發出請求:

在這里插入圖片描述

TRADE-ADMIN 請求第一次的回傳:

在這里插入圖片描述

TRADE-ADMIN 請求第二次的回傳:

在這里插入圖片描述

三、Ribbon的負債均衡的策略

什么是負載?

? 負載是linux機器的一個重要指標,直觀的反應了機器的狀態,

? 在UNIX系統當中,系統負載是對當前CPU作業量的度量,被定義為特定時間間隔內運行的佇列中的平均執行緒數,Load average表示機器一段時間內的平均Load,這個值越低越好,負載過高會導致機器無法處理其他請求及,甚至導致死機,

什么是負載均衡?

? 負載均衡是由多臺服務器以對稱的方式組成一個服務器集合,每臺服務器都具有等價的地位,都可以單獨對外供應效力而無須其他服務器的輔助,經過某種負載分管技術,將外部發送來的央求均勻分配到對稱結構中的某一臺服務器上,而接收到央求的服務器獨登時回應客戶的央求,均衡負載可以平均分配客戶央求到服務器列陣,籍此供應快速獲取重要資料,解決很多并發訪問效力問題,這種群集技術可以用最少的出資取得接近于大型主機的性能,

負載均衡的策略?

1.輪詢

每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器down掉,能自動剔除,

2.指定權重

指定輪詢幾率,weight和訪問比率成正比,用于后端服務器性能不均的情況,

3.IP系結 (ip hash)

每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題,

4.fair(第三方)

按后端服務器的回應時間來分配請求,回應時間短的優先分配,

5.url_hash(第三方)

按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,后端服務器為快取時比較有效,

Ribbon負載均衡策略

? 1.RandomRule 隨機策略 :隨機選擇server

? 原理:通過Random類,隨機從可用服務器串列取一個

? 優勢:適用于集群中各個節點提供服務能力等同且無狀態的場景,

? 缺點:不關心服務端負載,服務端處理能力的波動可能造成堵塞

? 測驗使用改策略效果圖:

? 測驗準備了注冊了三個同名服務,以埠號不同作為標識依據,

? 組態檔修改 RandomRule策略模式
在這里插入圖片描述

? 第一次呼叫:

? 在這里插入圖片描述

? 第二次呼叫:

? 在這里插入圖片描述

? 第三次呼叫:

? 在這里插入圖片描述

? 從測驗結果可以看出,7002埠的服務被讀取了兩次,而且分配的三個埠當前只被讀取了7001,7002,7003埠沒有被讀到,隨機策略模式是隨機去讀取一個可用服務,可能讀取程序中會讀取到重復的埠,可能會有一個埠讀不到,

? 2.RoundRobinRule 輪詢策略: 從服務端串列里面回圈獲取

? 原理:維護一個AtomicInteger變數,和服務器總數求余得到index,取 服務器串列第index的值

? 優勢:適用于集群中各個節點提供服務能力等同且無狀態的場景,

? 缺點:不關心服務端負載,服務端處理能力的波動可能造成堵塞,

? 測驗使用改策略效果圖:

? 測驗準備了注冊了三個同名提供方服務,以埠號不同作為標識依據,

? 組態檔修改 RoundRobinRule 策略模式

在這里插入圖片描述

第一次呼叫:

在這里插入圖片描述

第二次呼叫:

在這里插入圖片描述

第三次呼叫:
在這里插入圖片描述

?

? 3.WeightedResponseTimeRule 回應時間加權重策略**:根據每個服務的回應時間設定權重,回應時間越長,所占權重越少,

? **原理:**維護一個volatile List型別的權重串列,里面保存了根據當前服務回應時間計算出的權重值,該串列默認每30秒重繪一次,采用輪詢來獲取服務,

? **優勢:**允許各節點服務能力不相等并且允許波動,

? 測驗使用改策略效果圖:

? 在 服務二 和 服務三 中設定Thread.sleep模擬介面回應時間,

TRADE-CLIENT2

在這里插入圖片描述

TRADE-CLENT3

在這里插入圖片描述

TRADE-CLENT1不設定執行緒延時,可以查出每個埠的權重,按逆序排列,可見會多次讀取7001埠,但是其實,隨著時間權重的疊加,讀取的概率也會疊加,效果不是很明顯,

? 4.RetryRule 重試策略: 鑒于IRule可以級聯,此RetryRule類允許向現有規則添加重試邏輯,(和負載均衡無關)

? **原理:**在指定時間(默認500ms)內不斷的呼叫指定路由策略(默認值:RoundRobinRule)獲取服務,直到獲取成功,

? **優勢:**具體適用場景同指定的路由策略,只是添加了重試功能

? 測驗使用改策略效果圖:

? 測驗準備了注冊了三個同名提供方服務,以埠號不同作為標識依據,

? 組態檔修改 RetryRule 策略模式

在這里插入圖片描述

測驗結果:

在這里插入圖片描述

在這里插入圖片描述

可以看到這個請求會被重試5秒之后,再回傳一個錯誤頁面,然后依據輪詢的方式依次訪問下一個埠,

? 5.BestAvailableRule 最低并發策略: 跳過具有“跳閘”斷路器的服務器的規則,并選擇具有最低并發請求的服務器,

? **優勢:**此規則通常應與ServerListSubsetFilter一起使用,后者對規則可見的服務器設定限制, 這確保了它只需要在少量服務器中找到最小的并發請求, 此外,每個客戶端將獲得一個隨機的服務器串列,避免了大量客戶端選擇一個具有最低并發請求的服務器并立即被淹沒的問題,
? 沒條件測驗家里窮,核心CORE:
在這里插入圖片描述

? 6.AvailabilityFilteringRule 可用過濾策略:過濾掉那些因為一直連接失敗的被標記為circuit tripped的后端server,并過濾掉那些高并發的的后端server(active connections 超過配置的閾值)

? **原理:**使用一個AvailabilityPredicate來包含過濾server的邏輯,其實就就是檢查status里記錄的各個server的運行狀態 ,

? 沒條件測驗家里窮,核心程序:

? 在這里插入圖片描述

? 7.ZoneAvoidanceRule 區域權重策略: 使用CompositePredicate根據區域和可用性過濾服務器的規則

? **原理:**通過Predicate鏈進行判斷,最后在所用通過判斷的服務器串列中采用輪詢策略選擇服務器

? **優勢:**服務器分布范圍很廣,呼叫方分布范圍也很廣,可使呼叫方請求路由到最近的服務器集群

? 沒條件測驗家里窮:

? 在這里插入圖片描述

? 8.自定義:一致性hash策略:對關鍵值進行hash運算,每次計算的結果一致,再加上其他的條件,使某種請求路由到同一個服務上,

? **優勢:**服務存在大量本地快取,例如根據token進行hash一致性運算,同一個token每次路由到同一個服務,這個服務可以做一些關于用戶權限相關的本地快取,

? 實際上,在負載均衡策略的選擇上,為了保證我們的服務的穩定性和平衡性等問題,我們會使用隨機策略使得每個用戶每次訪問都會均攤到不同的生產者服務上,使得單個服務器的壓力減小,但對于快取服務器來說,隨機取樣是一種方式,但是隨機取樣影響查找的性能,隨機獲取一臺服務器然后將Object存入,應用程式中通過id從快取服務器查找Object,這種方式是無法第一時間確定其所在的服務器的,需要遍歷集群中的所有服務器,然后比對查找出來的物件的id,才能獲得查找的Object,資料結構中的哈希表可以解決查找的問題,S集合使用線性串列方式存盤,這樣每臺服務器相對應的都有個編號,對于上面的4臺服務器來說,A的編號為0,其余的服務器編號依此類推,這樣的話確定了編號,就可以確定選擇的服務器,這個線性串列就是一張哈希表,通過公式hash(id)%N(N代表服務器個數)來確定我們的Object注冊到哪個服務器,以保證我們每次都可以訪問到之前快取服務器上,但是這個時候問題就來了,通過公式我們可以看出,當我們的服務器數量增加或者減少的話,我們的N就會發生變動,那么我們的計算出來的hash值就會發生變化,導致我們找不到原來的服務器,那么這樣他就會重新去請求資料庫,假設有大量的請求進來,我們資料庫可能承受不住壓力而導致崩潰,造成快取雪崩現象,

? 為此我們引入了一致性hash的策略,為了解決我們的hash函式計算出來的值受到服務器數量的影響,我們對hash函式進行了改進->hash(id),通過這個哈希函式計算出來的值,通常都是4個位元組,也就是32位,所以取值范圍就是0~2^32-1,所有的哈希值都會在這個區間內,將這個區間抽象成一個環

在這里插入圖片描述

那么我們先將這4個物件映射到我們的換上面

h1 = hash(id);
h2 = hash(id);
h3 = hash(id);
h4 = hash(id);

然后對服務器也進行標識:

c1 = hash(cache1);
c2 = hash(cache2);
c3 = hash(cache3);

在這里插入圖片描述

那么如何去確定h 和 c 之間的對應關系呢?我們可以想象一個人沿著環去尋找下一個地點,如果C節點的服務器掛掉,那么物件就會沿著環去尋找下一個節點,這里采用順時針的方式去尋找

在這里插入圖片描述

我們可以看到h1物件被分配到c1節點,h4節點被分配到了c2節點,h2,h3被分配到了c3節點,那么當c2節點崩潰的時候,那么h4就會被分配到c3節點,

在這里插入圖片描述

可以看到,c2服務下線,h4服務器就會去重新查詢資料庫,然后快取在下一個服務器上面,如圖就會尋找下一個節點c3,只會影響c3 服務器 ,并不會對其他服務器造成影響,這和普通的hash演算法的表現是不同的,普通hash演算法會影響其他快取服務器上的資料,

那么我們來看增加快取服務器看看:

增加Cache4,c4節點落在h2和h3之間,此時根據id2進行查找,定位到h2節點,從h2出發尋找對應的c節點,未增加之前找到的是c3節點,增加之后找到的是c4節點,c4節點代表的快取服務器Cache4并沒有Object2資料,那么應用程式從資料庫或其他地方獲取Object2資料然后重新放入到Cache2中,Cache3中的Object2此時就是無效的,可以看出增加Cache4服務器,只會影響到Cache2和Cache4之間的h節點代表的資料,

增加Cache4服務器后,最終的查找效果如下:

在這里插入圖片描述

虛擬節點:

假設當前只有兩臺快取服務器,那么我們現在總共有4個物件,那么假設如圖分布

在這里插入圖片描述

按照邏輯,我們h4,h2,h1都會集中分配在c2服務器上面,只有h3被分配到c1服務器上面,那么這樣就會導致我們的服務器分配不均衡,

在這里插入圖片描述

如圖可見我們c2服務器就會承受很大滴壓力,如何解決這種問題呢?

可以采用虛擬節點的方式,給每個c服務器再分配多個虛擬節點,虛擬節點也是隨機分配在此區間環上面,那么每個c服務器的虛擬節點都是其本身的克隆節點,但是也是散列分布在這個哈希環當中,目的就是為了將部分節點的壓力均分,

在這里插入圖片描述

如圖可見

h2被分配到c2.1節點,h4被分配到c1.2節點,h1被分配到c2.2節點,h3被分配到c1.1節點,節點的分配變得均衡,當然這不是絕對的,一致性hash只能解區域分不重連資料庫的問題,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/271557.html

標籤:其他

上一篇:關于分布式架構下介面的冪等性和并發性控制

下一篇:記:2020.3.31

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more