背景
互聯(lián)網(wǎng)的廣泛應(yīng)用只搁,使分布式系統(tǒng)越來越流行,但也同時引入了兩個問題:
- 每個層次各個服務(wù)節(jié)點(diǎn)的負(fù)載均衡問題
- 服務(wù)節(jié)點(diǎn)的臨時故障問題(容災(zāi))
什么是服務(wù)發(fā)現(xiàn)
簡單的說唐全,在soa架構(gòu)體系中奈搜,通常地,服務(wù)作為一個功能模塊昧绣,只對外開放一個服務(wù)名,使用方只需要拿著這個服務(wù)名捶闸,就可以找到一個可以提供正常服務(wù)的機(jī)器滞乙。這種根據(jù)服務(wù)名發(fā)現(xiàn)服務(wù)的功能,就叫做服務(wù)發(fā)現(xiàn)鉴嗤。
服務(wù)發(fā)現(xiàn)的好處
在soa架構(gòu)體系下,可以方便地進(jìn)行水平伸縮序调。
傳統(tǒng)方式下醉锅,每增加一個服務(wù)實(shí)例,就需要更新一下客戶端的應(yīng)用配置发绢。
但是到了微服務(wù)時代硬耍,這種處理方式顯得太過于低效。引入了服務(wù)發(fā)現(xiàn)边酒,可以讓這種伸縮不對客戶端造成影響经柴,只在中間做一層轉(zhuǎn)換,使服務(wù)的變化都在這個系統(tǒng)中登記墩朦,外部只需要在調(diào)用時去獲取實(shí)例的網(wǎng)絡(luò)位置(IP地址和端口)坯认,不需要頻繁修改自己的配置。
什么是lvs
lvs是Linux虛擬服務(wù)器氓涣,將內(nèi)網(wǎng)的機(jī)器組成機(jī)器群提供網(wǎng)絡(luò)服務(wù)牛哺,外部的請求打在負(fù)載均衡器上,負(fù)載均衡器再將請求分發(fā)到其中一臺服務(wù)器上去劳吠。
服務(wù)發(fā)現(xiàn)與lvs的差異
共同點(diǎn)
服務(wù)發(fā)現(xiàn)與lvs都是為了實(shí)現(xiàn)負(fù)載均衡引润;
不同點(diǎn)
- 服務(wù)發(fā)現(xiàn)只是提供服務(wù)查詢,服務(wù)發(fā)現(xiàn)掛了痒玩,客戶端仍可以通過緩存的查詢結(jié)果淳附,繼續(xù)與服務(wù)端簡歷連接议慰;
- lvs則是網(wǎng)絡(luò)中的一個關(guān)鍵節(jié)點(diǎn),lvs掛了奴曙,將直接導(dǎo)致整個網(wǎng)絡(luò)服務(wù)對外不可用别凹;
負(fù)載均衡算法
比較常見的有權(quán)重隨機(jī)算法(RandomLoadBalance),權(quán)重輪詢算法(RobinRoundLoadBalance)缆毁,一致性哈希算法(ConsistenHashLoadBalance)番川,最少活躍度算法(LeastActiviteLoadBalance)。
權(quán)重隨機(jī)算法
這種算法最簡單脊框,權(quán)重為幾個隨機(jī)對象的命中比例颁督,權(quán)重設(shè)置越高越容易命中。
<?php
/**
* file: random.php
*/
$config = [
'apple' => 5,
'banana' => 3,
'orange' => 3,
'pear' => 4
];
$choices = [];
foreach ($config as $choice => $weight) {
while ($weight >= 0) {
$choices[] = $choice;
$weight--;
}
}
if (count($choices) <= 0) {
throw new Exception("weight config invalid");
}
for ($i = 0; $i < 30; $i++) {
$choosedKey = array_rand($choices);
var_dump($choices[$choosedKey]);
}
<?php
/**
* 權(quán)重隨機(jī)算法改進(jìn)版
* file: random_v2.php
*/
$config = [
'apple' => 5,
'banana' => 3,
'orange' => 3,
'pear' => 4
];
function random_choose($config)
{
$weightSum = array_sum($config);
if ($weightSum <= 0) {
throw new Exception("config valid");
}
$randNum = rand(1, $weightSum);
foreach ($config as $choice => $weight) {
if ($randNum <= $weight) {
return $choice;
}
$randNum -= $weight;
}
}
for ($i = 0; $i < 30; $i++) {
$choosed = random_choose($config);
var_dump($choosed);
}
權(quán)重輪詢算法
輪流使用共享資源的基礎(chǔ)上浇雹,加上權(quán)重分配沉御,相對公平地使用各個資源。
一致性哈希算法
通過對請求做hash處理昭灵,映射到hash環(huán)上吠裆,來分配到對應(yīng)的資源。