您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Go語言中怎么實現一個負載均衡算法,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
將請求按順序輪流地分配到后端服務器上,它均衡地對待后端的每一臺服務器,而不關心服務器實際的連接數和當前的系統負載。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-eAolzy2P-1619539822631)(https://cache.yisu.com/upload/information/20210524/357/973.png)]
Go語言實現示例如下:
/** * Author: ClassmateLin * Site: https://www.classmatelin.top * mail: classmatelin.site@gmail.com * Date: 2021/4/26 21:32 */package mainimport ("fmt")type RoundRobin struct { servers []string current int}/** 獲取下一個服務器 */func (R *RoundRobin) next() string { R.current++ R.current = R.current % len(R.servers) // 訪問到最后一個服務器之后,重置會第一臺。 5%5=0。return R.servers[R.current]}func main() { r := &RoundRobin{ servers: []string{ "192.168.10", "192.168.11", "192.168.12"}, current: -1,}for i := 0; i < 10; i++ { fmt.Printf("| %d | %s |\n", i + 1, r.next())}}
每臺后端服務器的配置可能不太一樣,有些性能好,能處理的請求多, 有些則性能比較差,能處理的請求較少。
它們的抗壓能力不相同,因此按順序的分配服務器的話導致性能好的服務器無法發揮最大作用,性能差的服務器壓力太大。
那么加權輪詢法可以解決這個問題,給性能好的服務器分配較高的權重,性能差的服務器分配較低的權重。
go語言實現的平滑的加權輪詢法:
/** * @Author: ClassmateLin * @Site: https://www.classmatelin.top * @Email: classmatelin.site@gmail.com * @Date: 2021/4/27 22:44 */package mainimport "fmt"type Server struct { host string // 主機地址 weight int // 配置的權重 currentWeight int // 當前權重}func getSever(servers []*Server) (s *Server) { allWeight := 0 // 總權重for _, server := range servers { if server == nil { return nil}// 每一輪選擇都用自身的權重加到當前權重 allWeight += server.weight server.currentWeight += server.weight // 當前未選中節點或當前節點比之前選中的節點權重高,那么更新當前選中的節點if s == nil || server.currentWeight > s.currentWeight{ s = server }} s.currentWeight -= allWeight return}func main() { servers := []*Server{ { "192.168.10.10", 5, 0},{ "192.168.10.11", 2, 0},{ "192.168.10.12", 1, 0},}for i := 0; i < 20; i++ { server := getSever(servers)if server == nil { continue} fmt.Printf("| %s | %d |\n", server.host, server.weight)}}
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-eVhLqR1j-1619539822633)(https://cache.yisu.com/upload/information/20210524/357/975.png)]
平滑是指什么?例如有以下三臺服務器:
A: { host:"192.168.10.10", "weight": 3}B: { host:"192.168.10.11", "weight": 1}C: { host:"192.168.10.12", "weight": 1}
如果出現的序列為AAABC, 可能會給第一臺機器造成壓力過大。如果出現的序列為ABACA,避免同時造成同一臺服務器壓力過大的問題,就是平滑的。)
隨機法就是通過隨機算法,從服務器列表中隨機地選取一臺服務器進行訪問。隨著客戶端調用服務器的次數增加到一定數量級別,每臺服務器的平均訪問次數跟輪詢法的次數相近,也就是說趨近于輪詢法。
go實現示例:
/** * @Author: ClassmateLin * @Site: https://www.classmatelin.top * @Email: classmatelin.site@gmail.com * @Date: 2021/4/27 22:44 */package mainimport ("fmt""math/rand")type Random struct { servers []string}func (R *Random) next() string { return R.servers[rand.Intn(len(R.servers))]}func main() { r := Random{ servers: []string{ "192.168.10.10", "192.168.10.11", "192.168.10.12"},}for i := 0; i < 10; i++ { fmt.Println(r.next())}}
關于Go語言中怎么實現一個負載均衡算法就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。