ホームページ  >  記事  >  バックエンド開発  >  golang WebSocket サーバー導入ガイド: 高可用性の実現

golang WebSocket サーバー導入ガイド: 高可用性の実現

PHPz
PHPzオリジナル
2023-12-17 11:36:491309ブラウズ

golang WebSocket服务器部署指南:实现高可用性

Web アプリケーションの開発に伴い、オープン ネットワーク プロトコルとしての WebSocket は、リアルタイム通信のための重要なツールの 1 つになりました。この場合、WebSocket サーバーを展開および管理できることが重要です。この記事では、Golang を使用して WebSocket サーバーを構築する方法に焦点を当て、高可用性とスケーラビリティを実現するためのコード例をいくつか示します。

1. Golang WebSocket サーバーの概要

Golang では、サードパーティのパッケージを使用して WebSocket サーバーを作成できます。これらのパッケージは、WebSocket サーバーで HTTP サーバーを使用したり、ping、pong、ハートビート チェックなどの詳細なクライアント ソケット操作を提供したりするなど、いくつかの便利な機能を提供します。

以下は、より一般的に使用されるパッケージの一部です:

  1. Gorilla WebSocket
  2. Go-WebSocket
  3. Gobwas WebSocket

この記事では、Gorilla WebSocket パッケージを使用します。

2. WebSocket サーバーの実装

Golang では、WebSocket サーバーの作成は非常に簡単です。 HTTP サーバーを作成したのと同じように、WebSocket サーバーを作成できます。 WebSocket サーバー実装の単純だが完全な例を次に示します。

package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,

    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}

func reader(conn *websocket.Conn) {
    for {
        _, message, err := conn.ReadMessage()
        if err != nil {
            log.Println(err)
            return
        }
        log.Printf("收到消息:%s
", message)
    }
}

func echoHandler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println(err)
        return
    }

    go reader(conn)

    for {
        messageType, p, err := conn.ReadMessage()
        if err != nil {
            log.Println(err)
            return
        }
        log.Printf("收到消息:%s
", p)

        err = conn.WriteMessage(messageType, p)
        if err != nil {
            log.Println(err)
            return
        }
    }
}

func main() {
    http.HandleFunc("/echo", echoHandler)

    port := "8000"
    log.Printf("Starting server on port %v...
", port)

    err := http.ListenAndServe(fmt.Sprintf(":%v", port), nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

上記のコードでは、まず websocket.Upgrader を宣言します。これにより、HTTP 接続が WebSocket 接続にアップグレードされます。次に、データの読み取りと書き込みの操作をそれぞれ処理するために、reader 関数と echoHandler 関数が定義されます。

main 関数では、HTTP ルートを定義し、echoHandler を「/echo」パスにバインドします。最後に、http.ListenAndServe 関数を使用して HTTP サーバーを起動し、ポート 8000 ですべてのリクエストのリッスンを開始しました。

3. WebSocket サーバーの高可用性とスケーラビリティ

実際のアプリケーションでは、高可用性とスケーラビリティを実現するために複数の WebSocket サーバーをデプロイする必要があることがよくあります。この場合、ロード バランサーを使用して WebSocket サーバーを管理できます。ロード バランサは、WebSocket クライアントのリクエストを複数の WebSocket サーバーにルーティングして、高可用性とスケーラビリティを実現します。

以下は、ロード バランサーとして Nginx を使用する構成例です:

http {
    upstream websocket_servers {
        server 192.168.1.101:8000;
        server 192.168.1.102:8000;
        server 192.168.1.103:8000;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://websocket_servers;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
            proxy_set_header Host $host;
        }
    }
}

上記の構成では、IP アドレス 192.168.1.101、ポート 8000 で実行される 3 つの WebSocket サーバーを定義しました。 192.168.1.102 および 192.168.1.103。次に、ポート 80 でリッスンする Nginx サーバーを定義しました。クライアントからのすべてのリクエストを websocket_servers に転送し、対応するプロキシ ヘッダーを設定します。

このようにして、各 WebSocket サーバーの負荷が高い場合、Nginx は自動的にリクエストを他のサーバーに分散し、WebSocket 接続を常に切断しないようにできます。

4. 概要

この記事では、Golang を使用して WebSocket サーバーを構築する方法を紹介し、高可用性とスケーラビリティを実現するためのコード例をいくつか示します。 Gorilla WebSocket パッケージを使用して WebSocket サーバーを実装し、Nginx をロード バランサーとして使用して WebSocket サーバーを展開および管理する方法について説明しました。

以上がgolang WebSocket サーバー導入ガイド: 高可用性の実現の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。