Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk memulakan semula dengan lancar di golang

Bagaimana untuk memulakan semula dengan lancar di golang

WBOY
WBOYasal
2023-05-12 20:37:061049semak imbas

Smooth restart ialah teknologi yang sangat penting dalam bidang pembangunan front-end, back-end development dan DevOps. Apabila aplikasi perlu dikemas kini tanpa mengganggu permintaan sedia ada, mulakan semula yang anggun menjadikan proses kemas kini lebih lancar. Mulakan semula anggun ialah teknologi yang agak baharu di Golang, tetapi apabila Golang mendapat lebih perhatian, ia telah menjadi ciri yang mesti ada. Artikel ini akan memperkenalkan cara melaksanakan mula semula lancar di Golang.

Apakah itu permulaan semula yang lancar?

Mula semula anggun ialah teknik kemas kini aplikasi di mana proses kemas kini berlaku tanpa mengganggu permintaan sedia ada. Mula semula tradisional bermakna menghentikan aplikasi dan memulakan contoh baharu. Melakukannya akan menyebabkan permintaan masuk menjadi tidak bertindak balas sehingga kejadian baharu selesai dimulakan dan mengambil alih permintaan. Mula semula dengan anggun menyelesaikan masalah ini, membenarkan proses kemas kini aplikasi berlaku dalam contoh sedia ada.

Mengapa anda memerlukan permulaan semula yang lancar?

Tanpa permulaan semula yang anggun, setiap kali aplikasi perlu dikemas kini, ia mengakibatkan tempoh tidak tersedia. Ini menyebabkan ketidakselesaan kepada pelanggan/pengguna. Mulakan semula yang anggun boleh mengelakkan masalah ini dan menjadikan aplikasi lebih menyenangkan dan berdaya tahan, yang amat berguna semasa trafik tinggi.

Pengoptimuman http terbina dalam Golang

Di Golang, http.Server ialah rangka kerja Web kami yang biasa digunakan. Ia memberi kita banyak pilihan, termasuk mulakan semula dengan anggun. http.Server mempunyai kaedah Shutdown yang menghentikan pelayan tanpa mengganggu operasi sehingga semua sambungan klien telah ditutup.

Apabila kami mengendalikan sambungan sedia ada dengan mendengar sistem SIGINT (Ctrl+C/kill), SIGTERM (kill) dan isyarat lain serta memanggil http.Server.Shutdown(), kami boleh menghentikan pelayan. Semasa berhenti, kita boleh menunggu semua pengendali menyelesaikan atau menutup operasi selepas tamat masa.

Berikut ialah contoh ringkas.

package main

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

func main() {
    // 创建我们的HTTP Server,参数为 Mux/Router 实例
    srv := &http.Server{
        Addr: ":8080",
        // 服务器转发请求给自己,重写了请求的url(必填)
        Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            w.Write([]byte("Welcome to my website!"))
        }),
    }

    // 新开 goroutine 监听用户信号(操作系统可以选择向进程发送的信号)
    go func() {
        sigs := make(chan os.Signal, 1)
        // 常见用户信号 ctrl+c, kill ,sigterm 等
        signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

        <-sigs

        // 创建新的 context 用于调用 shutdown 方法
        ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
        defer cancel()

        if err := srv.Shutdown(ctx); err != nil {
            log.Fatal("Server forced to shutdown:", err)
        }

        log.Println("Server gracefully stopped")
    }()

    log.Println("Server started at", srv.Addr)

    // 最终函数会阻塞在这里,等待用户信号
    if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
        log.Fatal("Server exited:", err)
    }
}

Apabila menggunakan pelayan sebenar dalam contoh ini, kita perlu memastikan untuk tidak mengatasi ralat yang dikembalikan oleh http.Server.Serve(), seperti http.ErrServerClosed. Ini boleh digunakan untuk mengendalikan operasi dengan betul (seperti ralat segera) untuk mengelakkan penutupan pelayan yang tidak dijangka atau mulakan semula pelayan

Anda perlu memastikan bahawa konteks yang diluluskan tidak ditutup sebelum mengendalikan penantian (bergantung pada pelaksanaan kod anda. ), Supaya operasi menunggu mempunyai masa yang mencukupi untuk menyelesaikan tugas.

Ringkasan

Mula semula yang lancar boleh membantu kami mengelakkan ketidaktersediaan sementara yang disebabkan oleh permulaan semula aplikasi dan penting untuk sebarang aplikasi yang memerlukan ketersediaan tinggi. Sebagai bahasa berprestasi tinggi, mudah dibangunkan dan dikembangkan, Golang sepatutnya menyokong mula semula yang lancar. Di Golang, anda hanya boleh menggunakan kaedah http.Server.Shutdown() untuk mencapai permulaan semula yang lancar, dan kemudian melaksanakan logik perniagaan anda atas dasar ini.

Atas ialah kandungan terperinci Bagaimana untuk memulakan semula dengan lancar 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
Artikel sebelumnya:watak golang ke arrayArtikel seterusnya:watak golang ke array