Bagaimana untuk menutup pelayan HTTP dengan anggun di Golang

PHPz
Lepaskan: 2023-03-22 14:53:43
asal
2202 orang telah melayarinya

Golang (juga dikenali sebagai Go) ialah bahasa pengaturcaraan yang agak muda yang digunakan secara meluas dalam pembangunan perkhidmatan back-end dan API. HTTP ialah protokol yang biasa digunakan, dan ramai pembangun Golang memilih untuk menggunakan pakej HTTP yang disertakan dengan Golang untuk membangunkan pelayan HTTP. Walau bagaimanapun, kami menghadapi beberapa masalah apabila kami perlu menutup pelayan HTTP. Dalam artikel ini, kami akan menerangkan cara menutup pelayan HTTP di Golang dengan anggun.

  1. Cara menutup pelayan HTTP

Di Golang, kami biasanya menggunakan fungsi http.ListenAndServe() untuk memulakan pelayan HTTP. Fungsi ini akan berjalan sehingga program dimatikan atau pelayan ditutup. Jika kita hanya menutup program, pelayan HTTP akan berhenti berjalan serta-merta. Walau bagaimanapun, kaedah ini bukanlah penutupan yang anggun kerana pelanggan yang sedang diproses akan dipaksa untuk memutuskan sambungan, yang mungkin mengakibatkan kehilangan data atau pengecualian.

Cara lain untuk menutup adalah menggunakan kaedah Done() bagi konteks pelayan. Apabila kami memanggil kaedah Done(), pelayan HTTP dimatikan dengan betul dan berhenti menerima sambungan pelanggan baharu, tetapi masih akan mengendalikan beberapa sambungan yang telah diterima. Walaupun ini tidak akan memaksa sambungan pelanggan diproses, ia masih boleh menyebabkan beberapa permintaan menjadi tidak bertindak balas.

Akhir sekali, kami mempunyai kaedah penutupan yang elegan, iaitu menggunakan kaedah Shutdown() dalam struktur http.Server. Kaedah ini menutup pelayan HTTP dengan anggun dengan menunggu permintaan diproses selesai sebelum menutup pelayan.

  1. Mencapai penutupan pelayan HTTP yang anggun

Andaikan kami telah menulis kod berikut untuk memulakan pelayan 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)
    }
}
Salin selepas log masuk

Sekarang kita perlu menutup pelayan HTTP dengan betul apabila program keluar. Kita boleh mengambil langkah berikut:

1) Cipta contoh http.Server dan tetapkan sifat Pengendali kejadian itu kepada fungsi Pengendali sedia ada kami.

server := http.Server{
    Addr:    ":8080",
    Handler: http.DefaultServeMux,
}
Salin selepas log masuk

2) Gunakan goroutine untuk memulakan kaedah ListenAndServe() http.Server untuk mengendalikan permintaan sambungan klien.

go func() {
    if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
        log.Fatal(err)
    }
}()
Salin selepas log masuk

3) Gunakan kaedah Shutdown() http.Server untuk mematikan pelayan dengan selamat apabila program kami keluar.

// 用于停止 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.")
Salin selepas log masuk

Dalam kod ini kita mula-mula mencipta saluran untuk mendengar isyarat gangguan atau penamatan yang dihantar oleh sistem pengendalian (seperti Ctrl + C). Kemudian kita tunggu isyarat diterima dan laksanakan kaedah Shutdown(). Sebelum memanggil kaedah Shutdown(), kami menggunakan context.WithTimeout() untuk mencipta konteks (Context) untuk menunggu permintaan diproses selesai dalam tempoh tamat masa yang ditentukan. Kaedah Shutdown() mematikan pelayan HTTP dengan selamat selepas semua permintaan telah diproses.

  1. Ringkasan

Artikel ini memperkenalkan cara menutup pelayan HTTP di Golang dengan anggun. Gunakan kaedah Shutdown() http.Server untuk menutup pelayan HTTP dengan anggun dan mengelakkan kehilangan data atau pengecualian yang disebabkan oleh pemotongan sambungan secara paksa.

Perlu diambil perhatian bahawa jika sudah ada sambungan sedang diproses oleh klien dan pelayan, penutupan pelayan perlu menunggu sambungan ini diproses sebelum ia boleh ditutup seperti biasa. Oleh itu, untuk lebih pasti tentang penutupan lengkap, kita boleh menggunakan context.WithTimeout() untuk menetapkan tamat masa menunggu permintaan diproses selesai sebelum memanggil kaedah Shutdown().

Saya harap artikel ini dapat membantu pembangun Golang apabila membangunkan pelayan HTTP.

Atas ialah kandungan terperinci Bagaimana untuk menutup pelayan HTTP dengan anggun di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan