中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang怎么實現加權輪詢負載均衡

發布時間:2021-06-18 14:10:34 來源:億速云 閱讀:243 作者:chen 欄目:開發技術

這篇文章主要講解了“Golang怎么實現加權輪詢負載均衡”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Golang怎么實現加權輪詢負載均衡”吧!

目錄
  • 實現加權輪詢負載均衡思路

  • 加權輪詢負載均衡代碼

  • 測試代碼

實現加權輪詢負載均衡思路

代碼實現一個加權負載均衡

  • Weight            初始化時對節點約定的權重

  • currentWeight     節點臨時權重,每輪都會變化

  • effectiveWeight   節點有效權重,默認與Weight相同

  • totalWeight       所有節點有效權重之和:sum(effectiveWeight)

代碼實現一個加權負載均衡

  • currentWeight = currentWeight+effecitveWeight

  • 選中最大的 currentWeight 節點為選中節點

  • currentWeight = currentWeight-totalWeight  (4+3+2=9)

所以我們能夠 在表格模擬運行情況:

請求次數請求前currentWelght選中的節點請求后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]

加權輪詢負載均衡代碼

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 // 服務器地址
 weight          int //權重值
 currentWeight   int //節點當前權重
 effectiveWeight int //有效權重
}

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 統計所有有效權重之和
  total += w.effectiveWeight

  //step 2 變更節點臨時權重為的節點臨時權重+節點有效權重
  w.currentWeight += w.effectiveWeight

  //step 3 有效權重默認與權重相同,通訊異常時-1, 通訊成功+1,直到恢復到weight大小
  if w.effectiveWeight < w.weight {
   w.effectiveWeight++
  }
  //step 4 選擇最大臨時權重點節點
  if best == nil || w.currentWeight > best.currentWeight {
   best = w
  }
 }
 if best == nil {
  return ""
 }
 //step 5 變更臨時權重為 臨時權重-有效權重之和
 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
}

測試代碼

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())
}

測試結果

$ 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 權重兩倍。而從答應結果上看,符合要求

感謝各位的閱讀,以上就是“Golang怎么實現加權輪詢負載均衡”的內容了,經過本文的學習后,相信大家對Golang怎么實現加權輪詢負載均衡這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

望都县| 阳江市| 千阳县| 鄂托克前旗| 乐至县| 陇川县| 湖北省| 乌拉特中旗| 水富县| 滨海县| 富顺县| 通河县| 社旗县| 曲松县| 吕梁市| 孝感市| 巴南区| 钟山县| 呈贡县| 潞西市| 贺兰县| 张家川| 五峰| 伊金霍洛旗| 柳江县| 辉县市| 清丰县| 太和县| 无锡市| 专栏| 贵定县| 涟源市| 闻喜县| 遵义市| 利津县| 廊坊市| 玉林市| 会宁县| 青河县| 阳信县| 永川市|