Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menutup pelayan HTTP dengan anggun di Golang

Bagaimana untuk menutup pelayan HTTP dengan anggun di Golang

PHPz
PHPzasal
2023-03-22 14:23:502201semak imbas

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

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

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

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

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!

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