Rumah >pembangunan bahagian belakang >Golang >Analisis bagaimana untuk menutup perkhidmatan http dengan anggun di golang

Analisis bagaimana untuk menutup perkhidmatan http dengan anggun di golang

PHPz
PHPzasal
2023-04-11 10:43:281340semak imbas

Golang ialah bahasa pengaturcaraan yang sangat popular dengan keupayaan pemprosesan serentak yang cekap dan prestasi cemerlang. Saya percaya ramai pembangun golang akan menghadapi masalah seperti itu, bagaimana untuk menutup perkhidmatan http dengan anggun di golang?

Pertama sekali, kita perlu tahu bahawa mencipta perkhidmatan http adalah agak mudah, dan ia hanya memerlukan beberapa baris kod. Sebagai contoh, berikut ialah contoh mudah:

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)
}

Di sini kami mencipta perkhidmatan http baharu yang mendengar port tempatan 8080 dan mengembalikan "Hello" untuk setiap lawatan. Tetapi bagaimana untuk menutup perkhidmatan ini dengan anggun?

Kaedah biasa ialah menggunakan os.Signal untuk menguruskan kitaran hayat perkhidmatan. os.Signal ialah isyarat gangguan yang dihantar oleh sistem pengendalian kepada proses, seperti Ctrl+C, dsb., dengan tujuan menghendaki atur cara untuk menamatkan pelaksanaan. Dalam golang, kita boleh mendengar isyarat ini dan kemudian melaksanakan beberapa fungsi cangkuk selepas menerima isyarat untuk menutup perkhidmatan http dengan anggun.

Pelaksanaan khusus adalah seperti berikut:

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.")
}

Kami mendaftarkan dua isyarat melalui kaedah isyarat.Beritahu, iaitu Ctrl+C dan bunuh. Kemudian, tunggu ketibaan isyarat melalui gelung tak terhingga dalam fungsi utama. Apabila isyarat tiba, kami mula-mula akan mencetak satu baris log, menunjukkan bahawa kami berjaya menerima isyarat, dan kemudian kami akan memanggil kaedah Shutdown() http.Server untuk menutup perkhidmatan http seperti biasa konteksnya.

Apabila kita menghantar objek konteks.Konteks kepada kaedah Shutdown() http.Server, perkhidmatan http akan memasuki proses penutupan anggun Proses khusus kaedah Shutdown() adalah seperti berikut:

  1. Segera kembalikan ErrServerClosed untuk semua sambungan aktif.
  2. Panggilan Tutup pada semua sambungan aktif yang dikaitkan dengan pelayan untuk melengkapkan.
  3. Iaitu, selepas kaedah Shutdown() dipanggil, semua sambungan aktif akan ditutup serta-merta, dan permintaan sambungan baharu juga akan dilarang. Kemudian, kaedah Shutdown() akan memanggil kaedah Shutdown() semua sambungan aktif untuk menutup sambungan, supaya kami dapat memastikan semua sambungan ditutup seperti biasa. Akhir sekali, kaedah Shutdown() akan menutup pelayan http kami Selepas penutupan selesai, program akan keluar.
  4. Melalui kaedah penutupan yang anggun ini, kami boleh memastikan bahawa perkhidmatan http tidak akan menjejaskan permintaan yang diproses apabila ia ditutup Walaupun anda memanggil Ctrl+C semasa melengkapkan permintaan HTTP, ia tidak akan menjejaskan prestasi sambungan HTTP. Melakukannya boleh menjadikan program kami lebih teguh dan boleh dipercayai, menjadikannya sesuai untuk digunakan dalam persekitaran pengeluaran.

Sudah tentu, ini hanya contoh golang menutup perkhidmatan http dengan anggun anda boleh mengubah suai mengikut persekitaran anda yang sebenar.

Atas ialah kandungan terperinci Analisis bagaimana untuk menutup perkhidmatan http dengan anggun di golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn