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

Go語(yǔ)言實(shí)戰(zhàn)之實(shí)現(xiàn)均衡器功能

 更新時(shí)間:2023年04月12日 11:14:36   作者:小雄Ya  
這篇文章主要為大家詳細(xì)介紹了如何利用Golang?實(shí)現(xiàn)一個(gè)簡(jiǎn)單的流浪均衡器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

前言

當(dāng)我們需要處理成千上萬(wàn)的的用戶請(qǐng)求時(shí),當(dāng)一臺(tái)服務(wù)器可能無(wú)法滿足這千萬(wàn)級(jí)別的請(qǐng)求時(shí)就可能需要擴(kuò)容,增加服務(wù)器的數(shù)量來(lái)維持響應(yīng)請(qǐng)求。服務(wù)器數(shù)量增多了,那流量如何均衡分配也是一個(gè)問(wèn)題。這時(shí)就需要一個(gè)負(fù)載均衡,進(jìn)行協(xié)調(diào)可用服務(wù)器之間的流量。

本文主要講述使用 Golang 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的流浪均衡器。

負(fù)載均衡

負(fù)載均衡器就是一個(gè)能夠?qū)φ?qǐng)求流量通過(guò)算法將請(qǐng)求轉(zhuǎn)發(fā)到相應(yīng)的后端服務(wù)。其基本是在所有后端服務(wù)前置。一個(gè)用戶請(qǐng)求過(guò)來(lái)先經(jīng)過(guò)負(fù)載均衡器,然后由負(fù)載均衡器轉(zhuǎn)發(fā)請(qǐng)求到具體的后端服務(wù)上。所以其功能相對(duì)來(lái)說(shuō)其實(shí)很簡(jiǎn)單:轉(zhuǎn)發(fā)請(qǐng)求。其核心就是,均衡算法然后實(shí)現(xiàn)均衡轉(zhuǎn)發(fā)請(qǐng)求。常用的算法有以下幾種:

輪詢算法

輪詢法就是通過(guò)順序輪流轉(zhuǎn)發(fā)到后端服務(wù)器上。這種方式是最簡(jiǎn)單的,只需要按照順序進(jìn)行分配,不關(guān)心各服務(wù)負(fù)載情況,只需關(guān)心服務(wù)是否可用。如果檢查服務(wù)存活可用則直接轉(zhuǎn)發(fā)到當(dāng)前服務(wù)。

所以這種方法比較適合用在多個(gè)服務(wù)器間硬件能力和處理能力都差不多的情況,然后對(duì)請(qǐng)求進(jìn)行拆分均衡的轉(zhuǎn)發(fā)到各服務(wù)上。

簡(jiǎn)單實(shí)現(xiàn)輪詢例子:

type roundRobin struct {
    targets []*url.URL
    index   int
}

func (rr *roundRobin) nextTarget() *url.URL {
    target := rr.targets[rr.index]
    rr.index = (rr.index + 1) % len(rr.targets)
    return target
}

func (rr *roundRobin) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    target := rr.nextTarget()
    proxy := httputil.NewSingleHostReverseProxy(target)
    proxy.ServeHTTP(w, r)
}

定義了一個(gè)名為 roundRobin 的結(jié)構(gòu)體,并實(shí)現(xiàn)了一個(gè)名為 nextTarget 的方法,該方法返回下一個(gè)目標(biāo)服務(wù)器的 URL。在 ServeHTTP 方法中,我們使用 nextTarget 方法獲取下一個(gè)目標(biāo)服務(wù)器的 URL,并創(chuàng)建一個(gè)反向代理對(duì)象來(lái)將請(qǐng)求轉(zhuǎn)發(fā)到選定的服務(wù)器。

加權(quán)輪詢算法

加圈輪詢算法是基于輪詢算法的。當(dāng)后端服務(wù)處理能力有差別的時(shí)候,比如可能A服務(wù)處理能力強(qiáng)于B服務(wù)2倍,那可以通過(guò)加權(quán)方式控制A服務(wù)處理請(qǐng)求多于B服務(wù)。

type serverWeight int

const (
	ServerA serverWeight = 6
	ServerB serverWeight = 3
	ServerC serverWeight = 1
)

比如以上配置表示,每有10個(gè)請(qǐng)求就會(huì)有6個(gè)會(huì)轉(zhuǎn)發(fā)到A服務(wù)器,3個(gè)轉(zhuǎn)發(fā)到B服務(wù)器,1個(gè)轉(zhuǎn)發(fā)到C服務(wù)器。

最少連接數(shù)算法

最小連接數(shù)是轉(zhuǎn)發(fā)依據(jù)始終是按照服務(wù)器當(dāng)前連接數(shù)最小的那個(gè)進(jìn)行轉(zhuǎn)發(fā)。這種方式可以更加有效的利用后端服務(wù),合理的分流到各服務(wù)器。該算法不僅要檢查各服務(wù)是否有效,還需要記錄各服務(wù)已存在的連接數(shù)量。有點(diǎn)像連接池管理。

當(dāng)然最少連接數(shù)算法,也可以對(duì)它們?cè)黾訖?quán)重,即在比較連接數(shù)時(shí)同時(shí)考慮各服務(wù)的權(quán)重,被選中的服務(wù)器其連接數(shù)與權(quán)重的比要最小才能被選中。

詳細(xì)實(shí)現(xiàn)

定義結(jié)構(gòu)體

其他的算法,這里就不一一展開說(shuō)明,想了解可以自己搜索。本文主要實(shí)踐使用最少連接算法的負(fù)責(zé)均衡器。所以一個(gè)均衡器的工作是查找連接數(shù)最少的服務(wù),然后根據(jù)服務(wù)地址轉(zhuǎn)發(fā)出去。當(dāng)然還需要知道當(dāng)前可用服務(wù)是否存活。所以可以先定義一個(gè)記錄這些信息的結(jié)構(gòu)體,如服務(wù)請(qǐng)求地址,存活狀態(tài)、連接數(shù)等相關(guān)信息。

type Backend interface {
    GetURL() string
    GetConnections() int
}

type leastConn struct {
    targets []Backend
    mutex   sync.Mutex
}

func (lc *leastConn) leastTarget() Backend {
    var target Backend
    minConns := math.MaxInt32

    for _, t := range lc.targets {
        lc.mutex.Lock()
        conns := t.GetConnections()
        lc.mutex.Unlock()

        if conns < minConns {
            minConns = conns
            target = t
        }
    }
    return target
}

func (lc *leastConn) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    target := lc.leastTarget()
    targetURL := target.GetURL()

    proxy := httputil.NewSingleHostReverseProxy(targetURL)
    proxy.ServeHTTP(w, r)
}

為了避免出現(xiàn)競(jìng)爭(zhēng)情況,通過(guò)增加鎖來(lái)控制。RWMutex 適合用于讀多寫少的場(chǎng)景。支持多個(gè) goroutie 可以同時(shí)獲取讀鎖,但是寫時(shí)僅支持一個(gè) goroutine 占有。reverseProxy 官網(wǎng)的解釋:是一種 Http Handler ,接收請(qǐng)求并發(fā)送到另一臺(tái)服務(wù)器中,把響應(yīng)代理回客戶端。所以 ReverseProxy 的作用就是轉(zhuǎn)發(fā)原始的請(qǐng)求。

在上面的代碼中國(guó),我們定義了一個(gè)名為 Backend 的接口,并實(shí)現(xiàn)了一個(gè)名為 leastConn 的結(jié)構(gòu)體。在 leastConn 結(jié)構(gòu)體中,我們使用 Backend 接口代替直接使用 URL 來(lái)表示服務(wù)器,這樣我們可以將任何實(shí)現(xiàn)了 Backend 接口的服務(wù)器添加到負(fù)載均衡器中。

leastTarget 方法中,我們使用 Backend 接口的方法來(lái)獲取每個(gè)服務(wù)器的當(dāng)前連接數(shù),并選擇連接數(shù)最少的服務(wù)器來(lái)處理該請(qǐng)求。

以上就是Go語(yǔ)言實(shí)戰(zhàn)之實(shí)現(xiàn)均衡器功能的詳細(xì)內(nèi)容,更多關(guān)于Go均衡器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go數(shù)據(jù)庫(kù)遷移的實(shí)現(xiàn)步驟

    Go數(shù)據(jù)庫(kù)遷移的實(shí)現(xiàn)步驟

    本文主要介紹了Go數(shù)據(jù)庫(kù)遷移的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • sublime3+Golang+代碼補(bǔ)全的實(shí)現(xiàn)

    sublime3+Golang+代碼補(bǔ)全的實(shí)現(xiàn)

    本文主要介紹了sublime3+Golang+代碼補(bǔ)全的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • gorm FirstOrCreate和受影響的行數(shù)實(shí)例

    gorm FirstOrCreate和受影響的行數(shù)實(shí)例

    這篇文章主要介紹了gorm FirstOrCreate和受影響的行數(shù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Go語(yǔ)言通過(guò)chan進(jìn)行數(shù)據(jù)傳遞的方法詳解

    Go語(yǔ)言通過(guò)chan進(jìn)行數(shù)據(jù)傳遞的方法詳解

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言如何通過(guò)chan進(jìn)行數(shù)據(jù)傳遞的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-06-06
  • Go使用Weighted實(shí)現(xiàn)資源管理

    Go使用Weighted實(shí)現(xiàn)資源管理

    這篇文章主要介紹了Go?語(yǔ)言中的?Weighted?并發(fā)原語(yǔ),包括?Weighted?的基本使用方法、實(shí)現(xiàn)原理、使用注意事項(xiàng)等內(nèi)容,感興趣的小伙伴可以了解一下
    2023-06-06
  • Golang?WebSocket創(chuàng)建單獨(dú)會(huì)話詳細(xì)實(shí)例

    Golang?WebSocket創(chuàng)建單獨(dú)會(huì)話詳細(xì)實(shí)例

    這篇文章主要給大家介紹了關(guān)于Golang?WebSocket創(chuàng)建單獨(dú)會(huì)話的相關(guān)資料,WebSocket 協(xié)議主要為了解決基于 HTTP/1.x 的 Web 應(yīng)用無(wú)法實(shí)現(xiàn)服務(wù)端向客戶端主動(dòng)推送的問(wèn)題,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • 在Gin框架中解決跨域問(wèn)題的多種方法

    在Gin框架中解決跨域問(wèn)題的多種方法

    在使用Go語(yǔ)言進(jìn)行Web開發(fā)時(shí),Gin框架因其簡(jiǎn)潔、高效的特點(diǎn)而被廣泛使用,然而,在實(shí)際開發(fā)中,跨域問(wèn)題(CORS, Cross-Origin Resource Sharing)是一個(gè)常見(jiàn)的挑戰(zhàn),本文將結(jié)合實(shí)際案例,詳細(xì)介紹在Gin框架中解決跨域問(wèn)題的多種方法,需要的朋友可以參考下
    2024-10-10
  • Go語(yǔ)言獲取系統(tǒng)性能數(shù)據(jù)gopsutil庫(kù)的操作

    Go語(yǔ)言獲取系統(tǒng)性能數(shù)據(jù)gopsutil庫(kù)的操作

    這篇文章主要介紹了Go語(yǔ)言獲取系統(tǒng)性能數(shù)據(jù)gopsutil庫(kù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Golang生成Excel文檔的方法步驟

    Golang生成Excel文檔的方法步驟

    生成Excel是一個(gè)很常見(jiàn)的需求,本文將介紹如何使用Go的 Excelize庫(kù)去生成Excel文檔,以及一些具體場(chǎng)景下的代碼實(shí)現(xiàn),感興趣的可以參考一下
    2021-06-06
  • Golang將Map的鍵值對(duì)調(diào)的實(shí)現(xiàn)示例

    Golang將Map的鍵值對(duì)調(diào)的實(shí)現(xiàn)示例

    本文主要介紹了Golang將Map的鍵值對(duì)調(diào)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02

最新評(píng)論

唐山市| 军事| 武隆县| 三河市| 苍梧县| 鄄城县| 曲麻莱县| 社旗县| 彭州市| 小金县| 孟连| 海阳市| 武鸣县| 开江县| 建水县| 静宁县| 景德镇市| 柳江县| 聂拉木县| 布拖县| 平湖市| 曲周县| 珠海市| 安丘市| 台南市| 义马市| 秦皇岛市| 崇礼县| 株洲县| 土默特左旗| 内丘县| 万山特区| 陆丰市| 九台市| 正安县| 库伦旗| 信宜市| 嘉定区| 桃源县| 视频| 金溪县|