Maison  >  Article  >  développement back-end  >  Analysez comment arrêter gracieusement le service http dans Golang

Analysez comment arrêter gracieusement le service http dans Golang

PHPz
PHPzoriginal
2023-04-11 10:43:281275parcourir

Golang est un langage de programmation très populaire avec des capacités de traitement simultané efficaces et d'excellentes performances. Je pense que de nombreux développeurs Golang rencontreront un tel problème, comment arrêter gracieusement le service http dans Golang ?

Tout d'abord, il faut savoir qu'il est relativement simple de créer un service http. Il suffit de quelques lignes de code pour le faire. Par exemple, voici un exemple simple :

package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "Hello")
    })
    http.ListenAndServe(":8080", nil)
}

Ici, nous créons un nouveau service http, écoutons le port local 8080 et renvoyons un "Bonjour" à chaque accès. Mais comment arrêter ce service en douceur ?

Une méthode courante consiste à utiliser os.Signal pour gérer le cycle de vie du service. os.Signal est un signal d'interruption envoyé par le système d'exploitation au processus, tel que Ctrl+C, etc., dans le but d'obliger le programme à terminer son exécution. En Golang, nous pouvons écouter ces signaux, puis exécuter certaines fonctions de hook après avoir reçu le signal pour arrêter le service http en douceur.

L'implémentation spécifique est la suivante :

package main

import (
    "context"
    "fmt"
    "net/http"
    "os"
    "os/signal"
    "syscall"
    "time"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "Hello")
    })
    srv := &http.Server{Addr: ":8080"}

    signalChan := make(chan os.Signal, 1)
    signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)

    go func() {
        sig := <-signalChan
        fmt.Printf("Signal Received: %s,  Gracefully shutting down...\n", sig)
        ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
        defer cancel()
        srv.Shutdown(ctx)
    }()

    fmt.Println("Server starting...")
    if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
        fmt.Printf("server start failed, err: %v\n", err)
        return
    }

    fmt.Println("Server closed.")
}

Nous avons enregistré deux signaux via la méthode signal.Notify, à savoir Ctrl+C et kill. Ensuite, attendez l’arrivée du signal via une boucle infinie dans la fonction principale. Lorsque le signal arrive, nous imprimerons d'abord une ligne de journal indiquant que nous avons reçu un signal avec succès, puis nous appellerons la méthode Shutdown() de http.Server pour arrêter le service http normalement. Ces opérations seront effectuées dans. le contexte.

Lorsque nous passons un objet context.Context à la méthode Shutdown() de http.Server, le service http entrera dans le processus d'arrêt progressif. Le processus spécifique de la méthode Shutdown() est le suivant :

  1. Retour immédiat. ErrServerClosed pour toutes les connexions actives.
  2. Appelez l'arrêt sur toutes les connexions actives.
  3. Appelez l'arrêt sur l'écouteur du serveur.
  4. Attendez que toutes les goroutines associées au serveur se terminent.

C'est-à-dire une fois la méthode Shutdown() terminée. appelé , toutes les connexions actives seront immédiatement fermées et les nouvelles demandes de connexion seront également interdites. Ensuite, la méthode Shutdown() appellera la méthode Shutdown() de toutes les connexions actives pour fermer la connexion, afin que nous puissions garantir que toutes les connexions sont fermées normalement. Enfin, la méthode Shutdown() fermera notre serveur http. Une fois l'arrêt terminé, le programme se fermera.

Grâce à cette méthode d'arrêt gracieuse, nous pouvons garantir que le service http n'affectera pas les requêtes en cours de traitement lors de son arrêt. Même si vous appelez Ctrl+C lors de la réalisation de la requête HTTP, cela n'affectera pas les performances du HTTP. connexion. Cela peut rendre nos programmes plus robustes et plus fiables, ce qui les rend idéaux pour une utilisation dans des environnements de production.

Bien sûr, ce n'est qu'un exemple de fermeture gracieuse du service http par Golang. Vous pouvez le modifier en fonction de votre environnement réel. J'espère que cet article pourra vous aider.

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