分布式服務中軟負載演算法實現

2021-09-25 01:12:07 字數 2143 閱讀 4587

統一介面和資料結構:

clusterstrategy:

public

inte***ce

clusterstrategy

providerservice:服務提供者,此處以rpc呼叫為例,選定指定介面後,從此介面的服務提供者列表中使用負載均衡演算法選出乙個服務服務者

public

class

providerservice

implements

serializable

//getter/setter

}

獲取服務列表大小範圍內的隨機數,將該隨機數作為列表索引,從服務提供列表中獲取服務提供者

public

class

randomclusterstrategyimpl

implements

clusterstrategy

}

在隨機演算法的基礎上針對權重做了處理

以權重大小作為服務提供者的數量,建立新列表,再進行隨機選取,權重大的數量多,更容易選上

public

class

weightrandomclusterstrategyimpl

implements

clusterstrategy

}int max_len = providerlist.

size()

;int index = randomutils.

nextint(0

, max_len -1)

;return providerlist.

get(index);}

}

將服務呼叫請求按順序輪流分配到服務提供者後端伺服器上,均衡對待每一台服務提供者機器

依次按順序獲取服務提供者列表中的資料,並使用計數器記錄使用過的資料索引,若資料索引到最後乙個資料,則計數器歸零,重新開始新的迴圈

public

class

pollingclusterstrategyimpl

implements

clusterstrategy

service = providerservices.

get(index)

; index++;}

catch

(interruptedexception e)

finally

//兜底,保證程式健壯性,若未取到服務,則直接取第乙個

if(service == null)

return service;

}}

在輪詢實現的基礎上針對權重做了處理

先根據加權數放大服務提供者列表,再在新列表使用輪詢演算法

public

class

weightpollingclusterstrategyimpl

implements

clusterstrategy

}//若計數大於服務提供者個數,將計數器歸0

if(index >= providerlist.

size()

) service = providerlist.

get(index)

; index++

;return service;

}catch

(interruptedexception e)

finally

//兜底,保證程式健壯性,若未取到服務,則直接取第乙個

return providerservices.

get(0)

;}}

基於請求**的ip的hashcode對服務提供者列表大小取模,得到服務提供者列表索引,進而獲取到服務提供者

使用呼叫方ip位址的hash值,對服務列表大小進行取模,得到的值作為服務列表索引,根據該索引取值

public

class

hashclusterstrategyimpl

implements

clusterstrategy

}

分布式架構的負載均衡演算法

輪詢 round robin 法 將請求按順序輪流分配到後台伺服器上,均衡的對待每一台伺服器,而不關心伺服器實際的連線數和當前的系統負載 缺點 當集群中伺服器硬體配置不同 效能差別大時,無法區別對待 隨機法 通過系統隨機函式,根據後台伺服器列表的大小值來隨機選取其中一台進行訪問。隨著呼叫量的增大,其...

集群 分布式 負載均衡

1 linux集群主要分成三大類 高可用集群,負載均衡集群,科學計算集群 負載均衡集群 load balance cluster 負載均衡系統 集群中所有的節點都處於活動狀態,它們分攤系統的工作負載。一般web伺服器集群 資料庫集群和應用伺服器集群都屬於這種型別。負載均衡集群一般用於相應網路請求的網...

集群,負載均衡,分布式

簡潔明瞭的解釋 記錄一下 集群 一堆伺服器互聯 負載均衡 一堆伺服器分攤壓力 分布式 一堆伺服器分開工作 相對來說,集群一般是指一堆伺服器去做同一項工作,一般是集中高速互聯實現快速的運算,對外的感覺是一台伺服器。負載均衡也是一堆伺服器做同一項工作,不同的伺服器做的事情基本相同,但是對外能發現是不同的...