Heim  >  Artikel  >  Backend-Entwicklung  >  Golang-Langverbindungslösung

Golang-Langverbindungslösung

PHPz
PHPzOriginal
2023-05-13 09:48:36867Durchsuche

Golang ist eine schnelle, statisch typisierte, kompilierte Programmiersprache, die ursprünglich von Google entworfen und entwickelt wurde. Golang wird häufig in der Entwicklung von Webanwendungen und Cloud-Systemen eingesetzt, insbesondere in Szenarien mit hoher Parallelität.

In modernen Webanwendungen sind lange Verbindungen eine sehr wichtige Technologie. Dies liegt daran, dass bei einer normalen HTTP-Anfrage die Verbindung geschlossen wird, sobald der Client die Antwort vom Server erhält. Dies führt dazu, dass bei jeder Anfrage eine Verbindung hergestellt und geschlossen wird, was einen großen Einfluss auf die Leistung des Servers und des Clients hat. Die Long-Connection-Technologie ist eine Möglichkeit, eine Verbindung aufrechtzuerhalten, sodass Client und Server miteinander kommunizieren und die Verbindung kontinuierlich aufrechterhalten können. In diesem Artikel werden die Langverbindungslösungen von Golang vorgestellt und ihre Vor- und Nachteile erörtert.

  1. WebSocket

WebSocket ist ein Protokoll für die Vollduplex-Kommunikation über eine einzelne TCP-Verbindung. Es verwendet das HTTP-Protokoll zum Herstellen einer Verbindung und konvertiert es dann in das WebSocket-Protokoll, um eine lange Verbindung zu erreichen. Mithilfe des WebSocket-Protokolls können Client und Server miteinander kommunizieren, ohne die Verbindung schließen zu müssen, sodass Nachrichten effizient zugestellt werden können.

Golangs Standardbibliothek bietet ein integriertes WebSocket-Paket („net/http“), das zur Implementierung von WebSocket-Servern und -Clients verwendet werden kann. Das Folgende ist ein einfaches Beispiel für einen WebSocket-Server:

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 wsHandler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println("websocket upgrade error:", err)
        return
    }

    for {
        _, msg, err := conn.ReadMessage()
        if err != nil {
            break
        }

        fmt.Printf("received message: %s
", msg)
    }
}

func main() {
    http.HandleFunc("/ws", wsHandler)
    http.ListenAndServe(":8080", nil)
}

In diesem Beispiel verwenden wir die Gorilla WebSocket-Bibliothek, die WebSocket-Anfragen bequemer verarbeiten kann. Verwenden Sie die Funktion websocket.Upgrader(), um die HTTP-Verbindung auf eine WebSocket-Verbindung zu aktualisieren. In der Funktion wsHandler() warten wir kontinuierlich auf Nachrichten vom Client. websocket.Upgrader()函数将HTTP连接升级为WebSocket连接。在wsHandler()函数中,我们不断地监听来自客户端的消息。

使用WebSocket的优点是它能够轻松地实现双向通讯。客户端和服务器都可以发送和接收消息,而无需关闭连接。而且WebSocket协议的开销较小,能够高效地传输数据。缺点是WebSocket需要浏览器或客户端应用程序特别支持。对于一些低版本浏览器或客户端,WebSocket技术可能存在一些问题。此外,由于WebSocket连接是全双工的,如果服务器需要向大量客户端广播消息,那么它需要维护大量的长连接,这会占用大量的内存资源。

  1. Server-Sent Events

Server-Sent Events(SSE)是另一种在Web应用程序中实现长连接的技术。SSE提供了一种服务器向客户端发送数据的方法,并且这个数据是实时的。与WebSocket不同,SSE是单项流,只允许服务器向客户端发送数据,而不支持客户端向服务器发送数据。

使用Golang实现SSE非常简单。以下是一个SSE服务器的示例:

package main

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

func sseHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "text/event-stream")
    w.Header().Set("Cache-Control", "no-cache")
    w.Header().Set("Connection", "keep-alive")

    for {
        fmt.Fprintf(w, "data: %s

", "Hello, world!")
        w.(http.Flusher).Flush()

        // Artificially slow down the server so
        // that we're forced to use multiple connections.
        time.Sleep(1 * time.Second)
    }
}

func main() {
    http.HandleFunc("/sse", sseHandler)
    http.ListenAndServe(":8080", nil)
}

在这个例子中,我们设置HTTP响应头,告诉浏览器它正在接收到Server-Sent Events,而不是在等待一次性响应。我们向客户端发送一个简单的消息,并使用http.Flusher将响应立即发送到客户端。然后我们等待一秒钟,然后再次发送新的消息。

使用Server-Sent Events的优点是它使用HTTP协议,因此不需要任何特殊的协议支持。另外,SSE数据易于解析,非常适合支持服务器向客户端实时推送数据的应用程序。缺点是SSE仅支持单向通信,只允许服务器向客户端发送数据。对于需要客户端向服务器发送数据的应用程序,SSE可能不合适。

  1. gRPC

gRPC是一种高度可扩展和性能优化的远程过程调用(RPC)协议,使用Google的Protocol Buffers进行数据交换。它的目标是是让客户端应用程序在线性时间内与服务器应用程序通信,并提供可扩展和高效的方法来代替传统的HTTP REST API。

尽管gRPC不是专门为长连接而设计的,但它也可以用于实现长连接。由于gRPC使用HTTP/2进行传输,它能够快速而可靠地传输大量数据,并支持服务器推送。使用gRPC,客户端可以与服务器建立长连接,并且服务器可以随时将消息推送到客户端。

以下是一个简单的gRPC服务器示例:

package main

import (
    "context"
    "fmt"
    "log"
    "net"
    "google.golang.org/grpc"
    pb "github.com/proto/example"
)

type server struct{}

func (s *server) Push(ctx context.Context, in *pb.Message) (*pb.Response, error) {
    log.Printf("received message: %v", in)

    return &pb.Response{Code: 200}, nil
}

func main() {
    lis, err := net.Listen("tcp", ":9090")
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    s := grpc.NewServer()
    pb.RegisterPushServer(s, &server{})
    if err := s.Serve(lis); err != nil {
        log.Fatalf("failed to serve: %v", err)
    }
}

这个例子中,我们定义了一个Push()

Der Vorteil der Verwendung von WebSocket besteht darin, dass es eine einfache bidirektionale Kommunikation ermöglicht. Sowohl Clients als auch Server können Nachrichten senden und empfangen, ohne die Verbindung zu schließen. Darüber hinaus verursacht das WebSocket-Protokoll weniger Overhead und kann Daten effizient übertragen. Der Nachteil besteht darin, dass WebSocket eine spezielle Unterstützung durch den Browser oder die Clientanwendung erfordert. Bei einigen Browsern oder Clients niedrigerer Versionen kann es zu Problemen mit der WebSocket-Technologie kommen. Da WebSocket-Verbindungen außerdem Vollduplex-Verbindungen sind, muss der Server, wenn er Nachrichten an eine große Anzahl von Clients senden muss, eine große Anzahl langer Verbindungen aufrechterhalten, die viele Speicherressourcen beanspruchen.

    Server-Sent Events

    🎜Server-Sent Events (SSE) ist eine weitere Technologie zur Implementierung langer Verbindungen in Webanwendungen. SSE bietet dem Server eine Methode zum Senden von Daten an den Client. Diese Daten erfolgen in Echtzeit. Im Gegensatz zu WebSocket handelt es sich bei SSE um einen einzelnen Stream, der dem Server nur das Senden von Daten an den Client ermöglicht, den Client jedoch nicht beim Senden von Daten an den Server unterstützt. 🎜🎜Die Implementierung von SSE mit Golang ist sehr einfach. Hier ist ein Beispiel für einen SSE-Server: 🎜rrreee🎜 In diesem Beispiel legen wir HTTP-Antwortheader fest, um dem Browser mitzuteilen, dass er vom Server gesendete Ereignisse empfängt, anstatt auf eine einmalige Antwort zu warten. Wir senden eine einfache Nachricht an den Client und verwenden http.Flusher, um die Antwort sofort an den Client zu senden. Dann warten wir eine Sekunde und senden die neue Nachricht erneut. 🎜🎜Der Vorteil der Verwendung von Server-Sent Events besteht darin, dass das HTTP-Protokoll verwendet wird und daher keine spezielle Protokollunterstützung erforderlich ist. Darüber hinaus lassen sich SSE-Daten leicht analysieren, was sie ideal für Anwendungen macht, die Server unterstützen, die Daten in Echtzeit an Clients übertragen. Der Nachteil besteht darin, dass SSE nur die unidirektionale Kommunikation unterstützt und dem Server nur das Senden von Daten an den Client ermöglicht. Für Anwendungen, bei denen Clients Daten an den Server senden müssen, ist SSE möglicherweise nicht geeignet. 🎜
      🎜gRPC🎜🎜🎜gRPC ist ein hoch skalierbares und leistungsoptimiertes RPC-Protokoll (Remote Procedure Call), das die Protokollpuffer von Google für den Datenaustausch verwendet. Ziel ist es, Clientanwendungen die Kommunikation mit Serveranwendungen in linearer Zeit zu ermöglichen und eine skalierbare und effiziente Alternative zur herkömmlichen HTTP-REST-API bereitzustellen. 🎜🎜Obwohl gRPC nicht speziell für lange Verbindungen konzipiert ist, kann es auch zur Implementierung langer Verbindungen verwendet werden. Da gRPC HTTP/2 für den Transport verwendet, kann es große Datenmengen schnell und zuverlässig übertragen und unterstützt Server-Push. Mit gRPC kann der Client eine lange Verbindung mit dem Server herstellen und der Server kann jederzeit Nachrichten an den Client senden. 🎜🎜Das Folgende ist ein einfaches Beispiel für einen gRPC-Server: 🎜rrreee🎜In diesem Beispiel definieren wir eine Push()-Funktion, die aufgerufen wird, wenn eine Nachricht vom Client empfangen wird. In dieser Funktion können wir bei Bedarf Informationen vom Client verarbeiten und bei Bedarf Nachrichten an den Client pushen. 🎜🎜Der Vorteil der Verwendung von gRPC besteht darin, dass es große Datenmengen schnell und zuverlässig übertragen kann und Server-Push unterstützt. Da gRPC außerdem HTTP/2 für den Transport verwendet, können Sie einige der Vorteile von HTTP/2 nutzen, z. B. Multiplexing und Server-Push. Der Nachteil besteht darin, dass die Einrichtung und der Start von gRPC möglicherweise mehr Zeit und Ressourcen erfordern und dass sowohl Client als auch Server das gRPC-Protokoll unterstützen müssen. 🎜🎜Zusammenfassung🎜

      Jede Langverbindungstechnologie hat ihre einzigartigen Vor- und Nachteile. WebSocket ist eine leistungsstarke Langzeitverbindungstechnologie, die eine bidirektionale Kommunikation erreichen kann, erfordert jedoch besondere Unterstützung und stellt einen großen Bedarf an Serverressourcen dar. Server-Sent Events ist eine weitere einfache Langzeitverbindungstechnologie, die einfach zu verwenden und zu implementieren ist, aber nur unidirektionale Kommunikation unterstützt. gRPC ist ein hoch skalierbares und leistungsoptimiertes Remote Procedure Call (RPC)-Protokoll, das große Datenmengen schnell und zuverlässig übertragen kann und Server-Push unterstützt, aber möglicherweise mehr Zeit und Ressourcen für die Einrichtung und den Start erfordert und sowohl Client- als auch Client-Anforderungen erfüllt Server unterstützt das gRPC-Protokoll.

      Für die meisten Webanwendungen sind WebSocket und vom Server gesendete Ereignisse wahrscheinlich die beste Wahl. Sie sind einfach zu verwenden und zu implementieren und können in den meisten Fällen die Anforderungen langer Verbindungen erfüllen. Wenn Sie große Datenmengen verarbeiten müssen oder den Server benötigen, um Daten in Echtzeit an den Client zu übertragen, ist gRPC möglicherweise die bessere Wahl. Welche Technologie auch immer gewählt wird, sie sollte basierend auf den Anforderungen und Szenarien der Anwendung ausgewählt und optimiert werden.

Das obige ist der detaillierte Inhalt vonGolang-Langverbindungslösung. 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