最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang加權(quán)輪詢負(fù)載均衡的實(shí)現(xiàn)

 更新時(shí)間:2021年06月18日 11:34:11   作者:銳玩道  
負(fù)載均衡器在向后端服務(wù)分發(fā)流量負(fù)載時(shí)可以使用幾種策略。本文主要介紹了Golang加權(quán)輪詢負(fù)載均衡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

實(shí)現(xiàn)加權(quán)輪詢負(fù)載均衡思路

代碼實(shí)現(xiàn)一個(gè)加權(quán)負(fù)載均衡

  • Weight            初始化時(shí)對(duì)節(jié)點(diǎn)約定的權(quán)重
  • currentWeight     節(jié)點(diǎn)臨時(shí)權(quán)重,每輪都會(huì)變化
  • effectiveWeight   節(jié)點(diǎn)有效權(quán)重,默認(rèn)與Weight相同
  • totalWeight       所有節(jié)點(diǎn)有效權(quán)重之和:sum(effectiveWeight)

代碼實(shí)現(xiàn)一個(gè)加權(quán)負(fù)載均衡

  • currentWeight = currentWeight+effecitveWeight
  • 選中最大的 currentWeight 節(jié)點(diǎn)為選中節(jié)點(diǎn)
  • currentWeight = currentWeight-totalWeight  (4+3+2=9)

所以我們能夠 在表格模擬運(yùn)行情況:

請(qǐng)求次數(shù) 請(qǐng)求前currentWelght 選中的節(jié)點(diǎn) 請(qǐng)求后currentWelght
1 [serverA=4,serverB=3,serverC=2] serverA [serverA=-1,serverB=6,serverC=4]
2 [serverA=-1,serverB=6,serverC=4] serverB [serverA=3,serverB=0,serverC=6]
3 [serverA=3,serverB=0,serverC=6] serverc [serverA=7,serverB=3,serverC=-1]
4 [serverA=7,serverB=3,serverC=-1] serverA [serverA=2,serverB=6,serverC=1]
5 [serverA=2,serverB=6,serverC=1] serverB [serverA=6,serverB=0,serverC=3]
6 [serverA=6,serverB=0,serverC=3] serverA [serverA=1,serverB=3,serverC=5]
7 [serverA=1,serverB=3,serverC=5] serverc [serverA=5,serverB=6,serverC=-2]

加權(quán)輪詢負(fù)載均衡代碼

package load_balance

import (
 "errors"
 "strconv"

)

type WeightRoundRobinBalance struct {
 curIndex int
 rss      []*WeightNode
 rsw      []int

 //觀察主體
 conf LoadBalanceConf
}

// 配置主題
type LoadBalanceConf interface {
 GetConf() []string
 WatchConf()
 UpdateConf(conf []string)
}

type WeightNode struct {
 addr            string // 服務(wù)器地址
 weight          int //權(quán)重值
 currentWeight   int //節(jié)點(diǎn)當(dāng)前權(quán)重
 effectiveWeight int //有效權(quán)重
}

func (r *WeightRoundRobinBalance) Add(params ...string) error {
 if len(params) != 2 {
  return errors.New("param len need 2")
 }
 parInt, err := strconv.ParseInt(params[1], 10, 64)
 if err != nil {
  return err
 }
 node := &WeightNode{addr: params[0], weight: int(parInt)}
 node.effectiveWeight = node.weight
 r.rss = append(r.rss, node)
 return nil
}

func (r *WeightRoundRobinBalance) Next() string {
 total := 0
 var best *WeightNode
 for i := 0; i < len(r.rss); i++ {
  w := r.rss[i]
  //step 1 統(tǒng)計(jì)所有有效權(quán)重之和
  total += w.effectiveWeight

  //step 2 變更節(jié)點(diǎn)臨時(shí)權(quán)重為的節(jié)點(diǎn)臨時(shí)權(quán)重+節(jié)點(diǎn)有效權(quán)重
  w.currentWeight += w.effectiveWeight

  //step 3 有效權(quán)重默認(rèn)與權(quán)重相同,通訊異常時(shí)-1, 通訊成功+1,直到恢復(fù)到weight大小
  if w.effectiveWeight < w.weight {
   w.effectiveWeight++
  }
  //step 4 選擇最大臨時(shí)權(quán)重點(diǎn)節(jié)點(diǎn)
  if best == nil || w.currentWeight > best.currentWeight {
   best = w
  }
 }
 if best == nil {
  return ""
 }
 //step 5 變更臨時(shí)權(quán)重為 臨時(shí)權(quán)重-有效權(quán)重之和
 best.currentWeight -= total
 return best.addr
}

func (r *WeightRoundRobinBalance) Get(key string) (string, error) {
 return r.Next(), nil
}

func (r *WeightRoundRobinBalance) SetConf(conf LoadBalanceConf) {
 r.conf = conf
}

測(cè)試代碼

package load_balance

import (
 "fmt"
 "testing"
)

func TestLB(t *testing.T) {
 rb := &WeightRoundRobinBalance{}
 rb.Add("127.0.0.1:2003", "4") //0
 // rb.Add("127.0.0.1:2004", "3") //1
 rb.Add("127.0.0.1:2005", "2") //2

 fmt.Println(rb.Next())
 fmt.Println(rb.Next())
 fmt.Println(rb.Next())
 fmt.Println(rb.Next())
 fmt.Println(rb.Next())
 fmt.Println(rb.Next())
 fmt.Println(rb.Next())
 fmt.Println(rb.Next())
 fmt.Println(rb.Next())
 fmt.Println(rb.Next())
 fmt.Println(rb.Next())
 fmt.Println(rb.Next())
 fmt.Println(rb.Next())
 fmt.Println(rb.Next())
}

測(cè)試結(jié)果

$ go test
127.0.0.1:2003
127.0.0.1:2005
127.0.0.1:2003
127.0.0.1:2003
127.0.0.1:2005
127.0.0.1:2003
127.0.0.1:2003
127.0.0.1:2005
127.0.0.1:2003
127.0.0.1:2003
127.0.0.1:2005
127.0.0.1:2003
127.0.0.1:2003
127.0.0.1:2005
PASS
ok      gateway/_test/demo      0.080s

## 127.0.0.1:2003 為 127.0.0.1:2005 權(quán)重兩倍。而從答應(yīng)結(jié)果上看,符合要求

到此這篇關(guān)于Golang加權(quán)輪詢負(fù)載均衡的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Golang加權(quán)輪詢負(fù)載均衡內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • go實(shí)現(xiàn)fping功能

    go實(shí)現(xiàn)fping功能

    這篇文章主要介紹了go實(shí)現(xiàn)fping功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Go 計(jì)時(shí)器使用示例全面講解

    Go 計(jì)時(shí)器使用示例全面講解

    這篇文章主要為大家介紹了Go 計(jì)時(shí)器使用示例全面講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Go1.21新增內(nèi)置函數(shù)(built-in?functions)詳解

    Go1.21新增內(nèi)置函數(shù)(built-in?functions)詳解

    Go?1.21新增的內(nèi)置函數(shù)分別是?min、max?和?clear,這篇文章主要帶大家一起了解一下這幾個(gè)函數(shù)的用途和使用示例,感興趣的小伙伴可以學(xué)習(xí)一下
    2023-08-08
  • golang中snappy的使用場(chǎng)合實(shí)例詳解

    golang中snappy的使用場(chǎng)合實(shí)例詳解

    在java 和go語(yǔ)言 大字符傳達(dá)的時(shí)候, 采用snappy 壓縮 解壓縮是最好的方案。下面這篇文章主要給大家介紹了關(guān)于golang中snappy使用場(chǎng)合的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-12-12
  • go語(yǔ)言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析

    go語(yǔ)言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析

    這篇文章主要為大家介紹了go語(yǔ)言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Golang使用Zookeeper實(shí)現(xiàn)分布式鎖

    Golang使用Zookeeper實(shí)現(xiàn)分布式鎖

    分布式鎖是一種在分布式系統(tǒng)中用于控制并發(fā)訪問(wèn)的機(jī)制,ZooKeeper?和?Redis?都是常用的實(shí)現(xiàn)分布式鎖的工具,本文就來(lái)使用Zookeeper實(shí)現(xiàn)分布式鎖,希望對(duì)大家有所幫助
    2024-02-02
  • golang使用sync.singleflight解決熱點(diǎn)緩存穿透問(wèn)題

    golang使用sync.singleflight解決熱點(diǎn)緩存穿透問(wèn)題

    在go的sync包中,有一個(gè)singleflight包,里面有一個(gè)?singleflight.go文件,代碼加注釋,一共200行出頭,通過(guò)?singleflight可以很容易實(shí)現(xiàn)緩存和去重的效果,避免重復(fù)計(jì)算,接下來(lái)我們就給大家詳細(xì)介紹一下sync.singleflight如何解決熱點(diǎn)緩存穿透問(wèn)題
    2023-07-07
  • Go語(yǔ)言基于viper的conf庫(kù)進(jìn)行配置文件解析

    Go語(yǔ)言基于viper的conf庫(kù)進(jìn)行配置文件解析

    在現(xiàn)代軟件開(kāi)發(fā)中,配置文件是不可或缺的一部分,如何高效地將這些格式解析到 Go 結(jié)構(gòu)體中,一直是開(kāi)發(fā)者的痛點(diǎn),下面我們來(lái)看看如何使用conf進(jìn)行配置文件解析吧
    2025-03-03
  • Go語(yǔ)言變量的聲明實(shí)現(xiàn)示例

    Go語(yǔ)言變量的聲明實(shí)現(xiàn)示例

    本文主要介紹了Go語(yǔ)言變量的聲明實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • 簡(jiǎn)單講解Go程序中使用MySQL的方法

    簡(jiǎn)單講解Go程序中使用MySQL的方法

    這篇文章主要介紹了Go程序中使用MySQL的方法,需要使用第三方包來(lái)進(jìn)行連接,需要的朋友可以參考下
    2015-10-10

最新評(píng)論

乐都县| 盘山县| 辽中县| 古丈县| 彩票| 马鞍山市| 那曲县| 五家渠市| 孝义市| 三门县| 来安县| 绥化市| 奉新县| 渝中区| 乐山市| 昆山市| 和政县| 布尔津县| 彭山县| 故城县| 临颍县| 阿克| 田阳县| 手机| 义马市| 弥勒县| 泗洪县| 丹棱县| 科技| 池州市| 句容市| 襄樊市| 名山县| 普兰店市| 云阳县| 科尔| 武义县| 台北县| 舒兰市| 务川| 宜春市|