Maison  >  Article  >  développement back-end  >  solution de connexion longue Golang

solution de connexion longue Golang

PHPz
PHPzoriginal
2023-05-13 09:48:36867parcourir

Golang est un langage de programmation rapide, typé statiquement et compilé, conçu et développé à l'origine par Google. Golang est largement utilisé dans le développement d'applications Web et de systèmes cloud, en particulier dans les scénarios à forte concurrence.

Dans les applications Web modernes, les connexions longues sont une technologie très importante. En effet, dans une requête HTTP normale, la connexion est fermée une fois que le client reçoit la réponse du serveur. Cela amènera chaque requête à établir et à fermer une connexion, ce qui aura un impact important sur les performances du serveur et du client. La technologie de connexion longue est un moyen de maintenir une connexion, afin que le client et le serveur puissent communiquer entre eux et maintenir en permanence la connexion. Cet article présentera les solutions de connexion longue de Golang et discutera de leurs avantages et inconvénients.

  1. WebSocket

WebSocket est un protocole de communication full-duplex sur une seule connexion TCP. Il utilise le protocole HTTP pour établir une connexion, puis la convertit en protocole WebSocket pour obtenir une connexion longue. Grâce au protocole WebSocket, le client et le serveur peuvent communiquer entre eux sans avoir à fermer la connexion, permettant ainsi la transmission efficace des messages.

La bibliothèque standard de Golang fournit un package WebSocket intégré (« net/http ») qui peut être utilisé pour implémenter des serveurs et des clients WebSocket. Voici un exemple simple de serveur 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 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)
}

Dans cet exemple, nous utilisons la bibliothèque Gorilla WebSocket, qui peut gérer les requêtes WebSocket plus facilement. Utilisez la fonction websocket.Upgrader() pour mettre à niveau la connexion HTTP vers une connexion WebSocket. Dans la fonction wsHandler(), nous écoutons en permanence les messages du 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()

L'avantage d'utiliser WebSocket est qu'il peut facilement réaliser une communication bidirectionnelle. Les clients et les serveurs peuvent envoyer et recevoir des messages sans fermer la connexion. De plus, le protocole WebSocket entraîne moins de surcharge et peut transmettre des données efficacement. L'inconvénient est que WebSocket nécessite une prise en charge spéciale de la part du navigateur ou de l'application client. Pour certains navigateurs ou clients de versions inférieures, la technologie WebSocket peut rencontrer quelques problèmes. De plus, les connexions WebSocket étant en full-duplex, si le serveur doit diffuser des messages à un grand nombre de clients, il devra maintenir un grand nombre de connexions longues, qui occuperont beaucoup de ressources mémoire.

    Server-Sent Events

    🎜Server-Sent Events (SSE) est une autre technologie permettant d'implémenter de longues connexions dans les applications Web. SSE fournit une méthode permettant au serveur d'envoyer des données au client, et ces données sont en temps réel. Contrairement à WebSocket, SSE est un flux unique, qui permet uniquement au serveur d'envoyer des données au client, mais ne permet pas au client d'envoyer des données au serveur. 🎜🎜La mise en œuvre de SSE à l'aide de Golang est très simple. Voici un exemple de serveur SSE : 🎜rrreee🎜 Dans cet exemple, nous définissons les en-têtes de réponse HTTP pour indiquer au navigateur qu'il reçoit les événements envoyés par le serveur au lieu d'attendre une réponse unique. Nous envoyons un simple message au client et utilisons http.Flusher pour envoyer la réponse immédiatement au client. Ensuite, nous attendons une seconde et envoyons à nouveau le nouveau message. 🎜🎜L'avantage d'utiliser les événements envoyés par le serveur est qu'ils utilisent le protocole HTTP et ne nécessitent donc aucune prise en charge de protocole particulière. De plus, les données SSE sont faciles à analyser, ce qui les rend idéales pour les applications prenant en charge les serveurs transmettant les données aux clients en temps réel. L'inconvénient est que SSE ne prend en charge que la communication unidirectionnelle et permet uniquement au serveur d'envoyer des données au client. Pour les applications qui nécessitent que les clients envoient des données au serveur, SSE peut ne pas être approprié. 🎜
      🎜gRPC🎜🎜🎜gRPC est un protocole d'appel de procédure à distance (RPC) hautement évolutif et optimisé en termes de performances qui utilise les tampons de protocole de Google pour l'échange de données. Son objectif est de permettre aux applications clientes de communiquer avec les applications serveur en temps linéaire et de fournir une alternative évolutive et efficace à l'API HTTP REST traditionnelle. 🎜🎜Bien que gRPC ne soit pas spécifiquement conçu pour les connexions longues, il peut également être utilisé pour mettre en œuvre des connexions longues. Étant donné que gRPC utilise HTTP/2 pour le transport, il peut transférer de grandes quantités de données de manière rapide et fiable, et prend en charge le push du serveur. Grâce à gRPC, le client peut établir une longue connexion avec le serveur et le serveur peut envoyer des messages au client à tout moment. 🎜🎜Ce qui suit est un exemple simple de serveur gRPC : 🎜rrreee🎜Dans cet exemple, nous définissons une fonction Push(), qui sera appelée lorsqu'un message du client est reçu. Dans cette fonction, nous pouvons traiter les informations du client selon les besoins et envoyer des messages au client si nécessaire. 🎜🎜L'avantage de l'utilisation de gRPC est qu'il peut transférer de grandes quantités de données de manière rapide et fiable et qu'il prend en charge le push du serveur. De plus, étant donné que gRPC utilise HTTP/2 pour le transport, vous pouvez profiter de certains des avantages de HTTP/2, tels que le multiplexage et le push serveur. L'inconvénient est que gRPC peut nécessiter plus de temps et de ressources pour être configuré et démarré, et nécessite que le client et le serveur prennent en charge le protocole gRPC. 🎜🎜Résumé🎜

      Chaque technologie de connexion longue a ses avantages et ses inconvénients qui lui sont propres. WebSocket est une technologie de connexion puissante à long terme qui permet d'établir une communication bidirectionnelle, mais elle nécessite un support spécial et nécessite une grande quantité de ressources de serveur. Les événements envoyés par le serveur sont une autre technologie de connexion simple à long terme, facile à utiliser et à mettre en œuvre, mais qui ne prend en charge que la communication unidirectionnelle. gRPC est un protocole d'appel de procédure à distance (RPC) hautement évolutif et optimisé en termes de performances, capable de transférer de grandes quantités de données de manière rapide et fiable et prenant en charge le push du serveur, mais peut nécessiter plus de temps et de ressources pour la configuration et le démarrage, et nécessite à la fois le client et le serveur prend en charge le protocole gRPC.

      Pour la plupart des applications Web, WebSocket et les événements envoyés par le serveur sont probablement le meilleur choix. Ils sont faciles à utiliser et à mettre en œuvre et peuvent, dans la plupart des cas, répondre aux besoins de connexions longues. Si vous devez traiter de grandes quantités de données ou si le serveur doit envoyer des données au client en temps réel, gRPC peut être un meilleur choix. Quelle que soit la technologie choisie, elle doit être sélectionnée et optimisée en fonction des besoins et des scénarios de l'application.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn