Golang (également connu sous le nom de Go) est un langage de programmation relativement jeune largement utilisé dans le développement de services back-end et d'API. HTTP est un protocole couramment utilisé et de nombreux développeurs Golang choisissent d'utiliser le package HTTP fourni avec Golang pour développer des serveurs HTTP. Cependant, nous rencontrons quelques problèmes lorsque nous devons arrêter le serveur HTTP. Dans cet article, nous expliquerons comment arrêter correctement un serveur HTTP dans Golang.
Dans Golang, nous utilisons généralement la fonction http.ListenAndServe() pour démarrer le serveur HTTP. Cette fonction s'exécutera jusqu'à ce que le programme soit arrêté ou que le serveur soit arrêté. Si nous fermons simplement le programme, le serveur HTTP cessera immédiatement de fonctionner. Toutefois, cette méthode ne constitue pas un arrêt progressif car le client en cours de traitement sera obligé de se déconnecter, ce qui peut entraîner une perte de données ou des exceptions.
Une autre façon de fermer est d'utiliser la méthode Done() du contexte du serveur. Lorsque nous appelons la méthode Done(), le serveur HTTP s'arrête correctement et cesse d'accepter de nouvelles connexions client, mais gérera toujours certaines connexions déjà acceptées. Bien que cela ne force pas la connexion du client en cours de traitement, certaines demandes peuvent néanmoins ne plus répondre.
Enfin, nous avons une manière élégante d'arrêter, qui consiste à utiliser la méthode Shutdown() dans la structure http.Server. Cette méthode arrête progressivement le serveur HTTP en attendant la fin de la demande en cours de traitement avant d'arrêter le serveur.
Supposons que nous ayons écrit le code suivant pour démarrer le serveur HTTP :
package main import ( "log" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello World!")) }) if err := http.ListenAndServe(":8080", nil); err != nil { log.Fatal(err) } }
Nous devons maintenant arrêter correctement le serveur HTTP à la fin du programme. Nous pouvons suivre les étapes suivantes :
1) Créez une instance http.Server et définissez la propriété Handler de l'instance sur notre fonction Handler existante.
server := http.Server{ Addr: ":8080", Handler: http.DefaultServeMux, }
2) Utilisez une goroutine pour démarrer la méthode ListenAndServe() de http.Server afin de gérer les demandes de connexion client.
go func() { if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatal(err) } }()
3) Utilisez la méthode Shutdown() de http.Server pour arrêter le serveur en toute sécurité lorsque notre programme se termine.
// 用于停止 HTTP 服务器的通道 stopChan := make(chan os.Signal) // 监听 Interrupt 和 Terminate 信号 signal.Notify(stopChan, os.Interrupt, syscall.SIGTERM) // 等待接收到信号,执行 Shutdown() <-stopChan log.Println("Shutting down server...") // 等待处理完成的请求处理完成 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := server.Shutdown(ctx); err != nil { log.Fatal(err) } log.Println("Server gracefully stopped.")
Dans ce code, nous créons d'abord un canal pour écouter les signaux d'interruption ou de terminaison envoyés par le système d'exploitation (tels que Ctrl + C). Ensuite, nous attendons que le signal soit reçu et exécutons la méthode Shutdown(). Avant d'appeler la méthode Shutdown(), nous utilisons context.WithTimeout() pour créer un contexte (Context) pour attendre que la demande en cours de traitement se termine dans le délai d'expiration spécifié. La méthode Shutdown() arrête le serveur HTTP en toute sécurité une fois que toutes les requêtes ont été traitées.
Cet article explique comment arrêter en douceur le serveur HTTP dans Golang. Utilisez la méthode Shutdown() de http.Server pour arrêter le serveur HTTP en douceur et éviter la perte de données ou les exceptions causées par une déconnexion forcée.
Il est à noter que s'il y a déjà des connexions en cours de traitement par le client et le serveur, l'arrêt du serveur devra attendre que ces connexions soient traitées avant de pouvoir être fermé normalement. Par conséquent, pour être plus sûr d'un arrêt complet, nous pouvons utiliser context.WithTimeout() pour définir un délai d'attente pour attendre la fin de la demande en cours de traitement avant d'appeler la méthode Shutdown().
J'espère que cet article pourra aider les développeurs Golang lors du développement de serveurs HTTP.
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!