Web アプリケーションの開発に伴い、オープン ネットワーク プロトコルとしての WebSocket は、リアルタイム通信のための重要なツールの 1 つになりました。この場合、WebSocket サーバーを展開および管理できることが重要です。この記事では、Golang を使用して WebSocket サーバーを構築する方法に焦点を当て、高可用性とスケーラビリティを実現するためのコード例をいくつか示します。
1. Golang WebSocket サーバーの概要
Golang では、サードパーティのパッケージを使用して WebSocket サーバーを作成できます。これらのパッケージは、WebSocket サーバーで HTTP サーバーを使用したり、ping、pong、ハートビート チェックなどの詳細なクライアント ソケット操作を提供したりするなど、いくつかの便利な機能を提供します。
以下は、より一般的に使用されるパッケージの一部です:
この記事では、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 サイトの他の関連記事を参照してください。