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

solution de connexion longue Golang

May 13, 2023 am 09:48 AM

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)
}
Copier après la connexion

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)
}
Copier après la connexion

在这个例子中,我们设置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)
    }
}
Copier après la connexion

这个例子中,我们定义了一个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 de ce site Web
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quelles sont les vulnérabilités de Debian OpenSSL Quelles sont les vulnérabilités de Debian OpenSSL Apr 02, 2025 am 07:30 AM

OpenSSL, en tant que bibliothèque open source largement utilisée dans les communications sécurisées, fournit des algorithmes de chiffrement, des clés et des fonctions de gestion des certificats. Cependant, il existe des vulnérabilités de sécurité connues dans sa version historique, dont certaines sont extrêmement nocives. Cet article se concentrera sur les vulnérabilités et les mesures de réponse communes pour OpenSSL dans Debian Systems. DebianopenSSL CONNUTS Vulnérabilités: OpenSSL a connu plusieurs vulnérabilités graves, telles que: la vulnérabilité des saignements cardiaques (CVE-2014-0160): cette vulnérabilité affecte OpenSSL 1.0.1 à 1.0.1F et 1.0.2 à 1.0.2 Versions bêta. Un attaquant peut utiliser cette vulnérabilité à des informations sensibles en lecture non autorisées sur le serveur, y compris les clés de chiffrement, etc.

Comment utilisez-vous l'outil PPROF pour analyser les performances GO? Comment utilisez-vous l'outil PPROF pour analyser les performances GO? Mar 21, 2025 pm 06:37 PM

L'article explique comment utiliser l'outil PPROF pour analyser les performances GO, notamment l'activation du profilage, la collecte de données et l'identification des goulots d'étranglement communs comme le processeur et les problèmes de mémoire. COMMANDE: 159

Comment rédigez-vous des tests unitaires en Go? Comment rédigez-vous des tests unitaires en Go? Mar 21, 2025 pm 06:34 PM

L'article traite des tests d'unité d'écriture dans GO, couvrant les meilleures pratiques, des techniques de moquerie et des outils pour une gestion efficace des tests.

Comment écrire des objets et des talons simulés pour les tests en Go? Comment écrire des objets et des talons simulés pour les tests en Go? Mar 10, 2025 pm 05:38 PM

Cet article montre la création de simulations et de talons dans GO pour les tests unitaires. Il met l'accent sur l'utilisation des interfaces, fournit des exemples d'implémentations simulées et discute des meilleures pratiques telles que la tenue de simulations concentrées et l'utilisation de bibliothèques d'assertion. L'articl

Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go? Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go? Mar 10, 2025 pm 03:20 PM

Cet article explore les contraintes de type personnalisé de Go pour les génériques. Il détaille comment les interfaces définissent les exigences de type minimum pour les fonctions génériques, améliorant la sécurité du type et la réutilisabilité du code. L'article discute également des limitations et des meilleures pratiques

Expliquez le but du package de réflexion de Go. Quand utiliseriez-vous la réflexion? Quelles sont les implications de performance? Expliquez le but du package de réflexion de Go. Quand utiliseriez-vous la réflexion? Quelles sont les implications de performance? Mar 25, 2025 am 11:17 AM

L'article traite du package de réflexion de Go, utilisé pour la manipulation d'exécution du code, bénéfique pour la sérialisation, la programmation générique, etc. Il met en garde contre les coûts de performance comme une exécution plus lente et une utilisation de la mémoire plus élevée, conseillant une utilisation judicieuse et la meilleure

Comment utilisez-vous des tests basés sur la table dans GO? Comment utilisez-vous des tests basés sur la table dans GO? Mar 21, 2025 pm 06:35 PM

L'article discute de l'utilisation de tests basés sur la table dans GO, une méthode qui utilise un tableau des cas de test pour tester les fonctions avec plusieurs entrées et résultats. Il met en évidence des avantages comme une amélioration de la lisibilité, une duplication réduite, l'évolutivité, la cohérence et un

Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO? Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO? Mar 10, 2025 pm 05:36 PM

Cet article explore l'utilisation d'outils de traçage pour analyser le flux d'exécution des applications GO. Il traite des techniques d'instrumentation manuelles et automatiques, de comparaison d'outils comme Jaeger, Zipkin et OpenTelelemetry, et mettant en évidence une visualisation efficace des données

See all articles