golang 优雅停服

什么是优雅的关闭服务

先把正在执行的任务处理完成,再关闭服务,避免关闭服务过程中,程序中断导致数据异常。

两种思路

1,使用内置函数:监听到程序中断信号后,使用 Shutdown 函数关闭服务

2,通过阻塞实现:监听到程序中断信号后,阻塞等待所有请求处理完成再关闭服务

使用内置函数

package main

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

func main() {
	// 创建一个HTTP服务器
	server := &http.Server{
		Addr:    ":8080",
		Handler: nil, // 设置你的HTTP处理程序
	}

	// 启动HTTP服务器
	go func() {
		if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			log.Fatalf("启动HTTP服务器失败:%v", err)
		}
	}()

	// 等待中断信号(如Ctrl+C)来优雅地停止HTTP服务器
	quit := make(chan os.Signal, 1)
	signal.Notify(quit, os.Interrupt)
	<-quit

	// 创建一个超时上下文,用于控制关闭超时时间
	ctx, cancelTimeout := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancelTimeout()

	// 关闭HTTP服务器
	if err := server.Shutdown(ctx); err != nil {
		log.Fatalf("关闭HTTP服务器失败:%v", err)
	}
}

自己实现


var wg sync.WaitGroup

// httpInstance 实现了http.Server
func (i *httpInstance) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    wg.Add(1)
    defer func() {
		wg.Done()
	}()
	
	// deal request
}

func (i *httpInstance) Close() {
	wg.Wait()
	
	// close resource
}

你可能感兴趣的:(golang,开发语言)