Heim  >  Artikel  >  Backend-Entwicklung  >  golang WebSocket-Server-Bereitstellungshandbuch: Erreichen einer hohen Verfügbarkeit

golang WebSocket-Server-Bereitstellungshandbuch: Erreichen einer hohen Verfügbarkeit

PHPz
PHPzOriginal
2023-12-17 11:36:491309Durchsuche

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

Mit der Entwicklung von Webanwendungen ist WebSocket als offenes Netzwerkprotokoll zu einem der wichtigen Werkzeuge für die Echtzeitkommunikation geworden. In diesem Fall ist die Fähigkeit, einen WebSocket-Server bereitzustellen und zu verwalten, von entscheidender Bedeutung. Dieser Artikel konzentriert sich auf den Aufbau eines WebSocket-Servers mit Golang und stellt einige Codebeispiele zur Erzielung hoher Verfügbarkeit und Skalierbarkeit bereit.

1. Einführung in den Golang WebSocket-Server

In Golang können wir Pakete von Drittanbietern verwenden, um WebSocket-Server zu erstellen. Diese Pakete bieten einige nützliche Funktionen, z. B. die Verwendung eines HTTP-Servers mit einem WebSocket-Server und die Bereitstellung detaillierter Client-Socket-Vorgänge wie Ping-, Pong- und Heartbeat-Prüfungen.

Hier sind einige der am häufigsten verwendeten Pakete:

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

In diesem Artikel verwenden wir das Gorilla WebSocket-Paket.

2. WebSocket-Server implementieren

In Golang ist das Erstellen eines WebSocket-Servers sehr einfach. Wir können den WebSocket-Server genauso erstellen, wie wir den HTTP-Server erstellt haben. Hier ist ein einfaches, aber vollständiges Beispiel einer WebSocket-Serverimplementierung:

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)
    }
}

Im obigen Code deklarieren wir zunächst einen websocket.Upgrader, der die HTTP-Verbindung auf eine WebSocket-Verbindung aktualisiert. Als nächstes werden eine Reader-Funktion und eine echoHandler-Funktion definiert, um die Vorgänge des Lesens bzw. Schreibens von Daten abzuwickeln.

In der Hauptfunktion definieren wir eine HTTP-Route und binden den echoHandler an den „/echo“-Pfad. Schließlich haben wir den HTTP-Server mit der Funktion http.ListenAndServe gestartet und begonnen, auf Port 8000 auf alle Anfragen zu warten.

3. Hohe Verfügbarkeit und Skalierbarkeit von WebSocket-Servern

In praktischen Anwendungen müssen wir häufig mehrere WebSocket-Server bereitstellen, um eine hohe Verfügbarkeit und Skalierbarkeit zu erreichen. In diesem Fall können wir einen Load Balancer verwenden, um den WebSocket-Server zu verwalten. Ein Load Balancer leitet WebSocket-Client-Anfragen an mehrere WebSocket-Server weiter, um eine hohe Verfügbarkeit und Skalierbarkeit zu erreichen.

Das Folgende ist eine Beispielkonfiguration mit Nginx als Load Balancer:

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;
        }
    }
}

In der obigen Konfiguration haben wir drei WebSocket-Server definiert, die auf den IP-Adressen 192.168.1.101, 192.168.1.102 und 192.168.1.103 8000 Port laufen. Dann haben wir einen Nginx-Server definiert, der Port 80 überwacht. Wir leiten alle Anfragen vom Client an websocket_servers weiter und setzen die entsprechenden Proxy-Header.

Auf diese Weise kann Nginx bei hoher Auslastung jedes WebSocket-Servers Anfragen automatisch an andere Server verteilen und stets verhindern, dass die WebSocket-Verbindung getrennt wird.

4. Zusammenfassung

Dieser Artikel stellt vor, wie man einen WebSocket-Server mit Golang erstellt, und bietet einige Codebeispiele, um eine hohe Verfügbarkeit und Skalierbarkeit zu erreichen. Wir haben das Gorilla WebSocket-Paket zur Implementierung des WebSocket-Servers verwendet und besprochen, wie man Nginx als Load Balancer zum Bereitstellen und Verwalten des WebSocket-Servers verwendet.

Das obige ist der detaillierte Inhalt vongolang WebSocket-Server-Bereitstellungshandbuch: Erreichen einer hohen Verfügbarkeit. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn