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

Golang負(fù)載均衡和保活設(shè)計(jì)原理示例探究

 更新時(shí)間:2024年01月24日 11:11:18   作者:紹納 nullbody筆記  
這篇文章主要為大家介紹了Golang負(fù)載均衡和?;钤O(shè)計(jì)原理示例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

通過(guò)本項(xiàng)目可以學(xué)到什么?

負(fù)載均衡算法代碼實(shí)現(xiàn)

調(diào)度器如何維護(hù)節(jié)點(diǎn)Live方案(參考)

loadbalance 負(fù)載均衡算法

隨機(jī)算法,輪詢算法,加權(quán)輪詢算法

隨機(jī)算法

// 隨機(jī)
type Rand struct {
	addrs []string
}

func (r *Rand) Add(param []string) error {

	iflen(param) != 1 {
		return ErrParam
	}
	r.addrs = append(r.addrs, param[0])
	returnnil
}

// 隨機(jī)種子,每次隨機(jī)返回一個(gè)
func (r *Rand) Get() (string, error) {
	iflen(r.addrs) == 0 {
		return"", ErrNoAddr
	}
	rand.Seed(time.Now().UnixNano())
	idx := rand.Intn(len(r.addrs))
	return r.addrs[idx], nil
}

輪詢算法

// 輪詢
type RoundRobin struct {
	addrs []string

	curIdx int
}

func (r *RoundRobin) Add(param []string) error {
	iflen(param) != 1 {
		return ErrParam
	}
	r.addrs = append(r.addrs, param[0])
	returnnil
}

func (r *RoundRobin) Get() (string, error) {
	iflen(r.addrs) == 0 || r.curIdx >= len(r.addrs) {
		return"", ErrNoAddr
	}
	addr := r.addrs[r.curIdx]
	r.curIdx = (r.curIdx + 1) % len(r.addrs) // 對(duì)curIdx每次+1
	return addr, nil
}

加權(quán)輪詢算法

實(shí)現(xiàn)原理

對(duì)節(jié)點(diǎn)設(shè)置權(quán)重,權(quán)重越大被選中次數(shù)越高,節(jié)點(diǎn)被選中的次數(shù)≈(本節(jié)點(diǎn)權(quán)重/全部權(quán)重) * 總次數(shù)。

舉例說(shuō)明:

節(jié)點(diǎn)權(quán)重為:weight [a=1,b=2,c=5]

節(jié)點(diǎn)當(dāng)前權(quán)重為curWeight:初始值為[a=0,b=0,c=0],變化規(guī)則為:curWeight + weight

全部權(quán)重sumWeight:  代表所有節(jié)點(diǎn)初始權(quán)重之和 1+2+5=8

第一次請(qǐng)求:

curWeight 為 [a=0+1,b=0+2,c=0+5] ,選中最大的c做為本次輸出,之后c節(jié)點(diǎn)的權(quán)重需要減去sumWeight,調(diào)整后 [a=1,b=2,c=5-8]  也就是 [a=1,b=2,c=-3]

第二次請(qǐng)求:

curWeight 為  [a=1+1,b=2+2,c=-3+5]  結(jié)果為 [a=2,b=4,c=2],選中最大的b作為本次輸出,之后節(jié)點(diǎn)權(quán)重變更為 [a=2,b=-4,c=2]

第三次請(qǐng)求:

curWeight 為  [a=2+1,b=-4+2,c=2+5]  結(jié)果為 [a=3,b=-2,c=7],又輪到c(權(quán)重大的好處體現(xiàn)出來(lái)了),之后節(jié)點(diǎn)權(quán)重變更為 [a=3,b=-2,c=-1]

第四次請(qǐng)求:

[a=3,b=-2,c=-1] 加權(quán)后[a=4,b=0,c=4],a與c相等,優(yōu)先選前者輸出a

type WeigthRoundRobin struct {
	weightAddrs []*weightAddr
}
type weightAddr struct {
	addr      string// 地址
	weight    int// 權(quán)重
	curWeight int// 計(jì)算使用
}
func (w *WeigthRoundRobin) Add(param []string) error {
	iflen(param) != 2 {
		return ErrParam
	}
	weight, err := strconv.Atoi(param[1])
	if err != nil {
		return err
	}
	w.weightAddrs = append(w.weightAddrs, &weightAddr{
		addr:      param[0],
		weight:    weight,
		curWeight: 0,
	})
	returnnil
}
func (w *WeigthRoundRobin) Get() (string, error) {
	iflen(w.weightAddrs) == 0 {
		return"", ErrNoAddr
	}
	maxWeight := math.MinInt
	idx := 0
	sumWeight := 0// 權(quán)重總和
	for k, weightAddr := range w.weightAddrs {
		sumWeight += weightAddr.weight // 權(quán)重總和
		weightAddr.curWeight += weightAddr.weight // 加上權(quán)重
		if weightAddr.curWeight > maxWeight {     // 記錄最大值
			maxWeight = weightAddr.curWeight
			idx = k
		}
	}
	w.weightAddrs[idx].curWeight -= sumWeight // 減去權(quán)重總和
	return w.weightAddrs[idx].addr, nil// 返回最大權(quán)重的結(jié)果
}

有效服務(wù)維護(hù)方案(參考)

方案一:heart【心跳】

前置配置:

1.啟動(dòng)docker

docker-compose -f docker-compose-env.yml   up -d zookeeper
docker-compose -f docker-compose-env.yml   up -d kafka

2.修改本地hostsvim /etc/hosts增加 127.0.0.1 kafka

3.kafka常用腳本【可選】 [進(jìn)入docker中*.sh位于 /opt/kafka/bin目錄](méi)

# 創(chuàng)建topic
./kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 --partitions 3 --topic easy_topic
# 列出所有topic
./kafka-topics.sh --list --zookeeper zookeeper:2181
# 從頭開(kāi)始消費(fèi)
./kafka-console-consumer.sh --bootstrap-server kafka:9092 --from-beginning --topic easy_topic
# 消費(fèi)組【從最新的消息消費(fèi)】
./kafka-console-consumer.sh --bootstrap-server kafka:9092 --consumer-property group.id=testGroup --topic easy_topic
# 從最新開(kāi)始消費(fèi)
./kafka-console-consumer.sh --bootstrap-server kafka:9092 --topic easy_topic
# 生產(chǎn)消息
./kafka-console-producer.sh --broker-list kafka:9092 --topic easy_topic

調(diào)度器訂閱kafka消息,同時(shí)維護(hù)一個(gè)有效服務(wù),然后按照負(fù)載均衡策略分發(fā)請(qǐng)求。

func main() {

	// 服務(wù)負(fù)責(zé)發(fā)送心跳
	go heart.RunHeartBeat()
	// 調(diào)度器負(fù)責(zé)接收心跳
	go heart.ListenHeartbeat()

	// 利用負(fù)載均衡獲取

	lb := loadbalance.LoadBalanceFactory(loadbalance.BalanceTypeRand)
	gofunc() {
		for {
			time.Sleep(5 * time.Second)
			for _, v := range heart.GetAddrList() {
				lb.Add([]string{v})
			}
			fmt.Println(lb.Get())
		}

	}()

	sigusr1 := make(chan os.Signal, 1)
	signal.Notify(sigusr1, syscall.SIGTERM)
	<-sigusr1
}

方案二:health【健康檢查】

通過(guò)HTTP請(qǐng)求服務(wù),維護(hù)活躍節(jié)點(diǎn)

func main() {
	health.AddAddr("https://www.sina.com.cn/", "https://www.baidu.com/", "http://www.aajklsdfjklsd")
	go health.HealthCheck()

	time.Sleep(50 * time.Second)

	alist := health.GetAliveAddrList()
	for i := 0; i < len(alist); i++ {
		fmt.Println(alist[i])
	}

	var block = make(chanbool)
	<-block
}

以上就是Golang負(fù)載均衡和?;钤O(shè)計(jì)原理示例探究的詳細(xì)內(nèi)容,更多關(guān)于Golang負(fù)載均衡?;钤O(shè)計(jì)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • go語(yǔ)言yaml轉(zhuǎn)map、map遍歷的實(shí)現(xiàn)

    go語(yǔ)言yaml轉(zhuǎn)map、map遍歷的實(shí)現(xiàn)

    本文主要介紹了go語(yǔ)言yaml轉(zhuǎn)map、map遍歷的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Golang 實(shí)現(xiàn) Redis系列(六)如何實(shí)現(xiàn) pipeline 模式的 redis 客戶端

    Golang 實(shí)現(xiàn) Redis系列(六)如何實(shí)現(xiàn) pipeline 模式的 redis 客戶端

    pipeline 模式的 redis 客戶端需要有兩個(gè)后臺(tái)協(xié)程負(fù)責(zé) tcp 通信,調(diào)用方通過(guò) channel 向后臺(tái)協(xié)程發(fā)送指令,并阻塞等待直到收到響應(yīng),本文是使用 golang 實(shí)現(xiàn) redis 系列的第六篇, 將介紹如何實(shí)現(xiàn)一個(gè) Pipeline 模式的 Redis 客戶端。
    2021-07-07
  • 一文初探Go語(yǔ)言中的reflect反射包

    一文初探Go語(yǔ)言中的reflect反射包

    這篇文章主要和大家分享一下Go語(yǔ)言中的reflect反射包,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的小伙伴可以參考一下
    2022-12-12
  • Gin 路由與路由文件分組的實(shí)現(xiàn)實(shí)例

    Gin 路由與路由文件分組的實(shí)現(xiàn)實(shí)例

    本文主要介紹了Gin 路由與路由文件分組的實(shí)現(xiàn)實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-11-11
  • Go1.16新特性embed打包靜態(tài)資源文件實(shí)現(xiàn)

    Go1.16新特性embed打包靜態(tài)資源文件實(shí)現(xiàn)

    這篇文章主要為大家介紹了Go?1.16新特性embed打包靜態(tài)資源文件的實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Go語(yǔ)言中定時(shí)器cron的基本使用教程

    Go語(yǔ)言中定時(shí)器cron的基本使用教程

    這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言中定時(shí)器cron使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • 通過(guò)Golang實(shí)現(xiàn)linux命令ls命令(命令行工具構(gòu)建)

    通過(guò)Golang實(shí)現(xiàn)linux命令ls命令(命令行工具構(gòu)建)

    這篇文章主要為大家詳細(xì)介紹了如何通過(guò)Golang實(shí)現(xiàn)一個(gè)linux命令ls命令(命令行工具構(gòu)建),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下
    2023-01-01
  • Golang Gorm 更新字段save、update、updates

    Golang Gorm 更新字段save、update、updates

    在gorm中,批量更新操作可以通過(guò)使用Update方法來(lái)實(shí)現(xiàn),本文主要介紹了Golang Gorm 更新字段save、update、updates,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • Go語(yǔ)言sync.Map詳解及使用場(chǎng)景

    Go語(yǔ)言sync.Map詳解及使用場(chǎng)景

    Go語(yǔ)言中的sync.Map是一個(gè)高效的并發(fā)安全映射結(jié)構(gòu),適用于高并發(fā)讀多寫少的場(chǎng)景,它通過(guò)讀寫分離、無(wú)鎖讀取路徑、寫入時(shí)的鎖保護(hù)等機(jī)制,提高了讀取性能并減少了鎖競(jìng)爭(zhēng),sync.Map不需要手動(dòng)管理鎖,降低了編程復(fù)雜性,適合需要簡(jiǎn)單并發(fā)訪問(wèn)的場(chǎng)合
    2024-10-10
  • Go指針的具體使用

    Go指針的具體使用

    本文主要介紹了Go指針的具體使用,包括使用指針、空指針、指針數(shù)組、指向指針的指針等,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11

最新評(píng)論

大厂| 囊谦县| 西昌市| 应城市| 波密县| 新绛县| 综艺| 武乡县| 枣强县| 容城县| 图片| 威宁| 正镶白旗| 苍溪县| 高唐县| 桦南县| 监利县| 临沧市| 商南县| 临泉县| 庐江县| 柳州市| 五河县| 赤城县| 上高县| 盐边县| 兰溪市| 昌黎县| 谷城县| 西贡区| 金山区| 柘荣县| 绵阳市| 民和| 章丘市| 鄂托克前旗| 利辛县| 曲水县| 东台市| 益阳市| 丰顺县|