61 lines
1.4 KiB
Go
61 lines
1.4 KiB
Go
package core
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"net/http"
|
||
"os"
|
||
"os/signal"
|
||
"syscall"
|
||
"time"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
"go.uber.org/zap"
|
||
)
|
||
|
||
type server interface {
|
||
ListenAndServe() error
|
||
Shutdown(context.Context) error
|
||
}
|
||
|
||
// initServer 启动服务并实现优雅关闭
|
||
func initServer(address string, router *gin.Engine, readTimeout, writeTimeout time.Duration) {
|
||
// 创建服务
|
||
srv := &http.Server{
|
||
Addr: address,
|
||
Handler: router,
|
||
ReadTimeout: readTimeout,
|
||
WriteTimeout: writeTimeout,
|
||
MaxHeaderBytes: 1 << 20,
|
||
}
|
||
|
||
// 在goroutine中启动服务
|
||
go func() {
|
||
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
|
||
fmt.Printf("listen: %s\n", err)
|
||
zap.L().Error("server启动失败", zap.Error(err))
|
||
os.Exit(1)
|
||
}
|
||
}()
|
||
|
||
// 等待中断信号以优雅地关闭服务器
|
||
quit := make(chan os.Signal, 1)
|
||
// kill (无参数) 默认发送 syscall.SIGTERM
|
||
// kill -2 发送 syscall.SIGINT
|
||
// kill -9 发送 syscall.SIGKILL,但是无法被捕获,所以不需要添加
|
||
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
|
||
<-quit
|
||
zap.L().Info("关闭WEB服务...")
|
||
|
||
// 设置5秒的超时时间
|
||
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||
|
||
defer cancel()
|
||
|
||
if err := srv.Shutdown(ctx); err != nil {
|
||
zap.L().Fatal("WEB服务关闭异常", zap.Error(err))
|
||
}
|
||
|
||
zap.L().Info("WEB服务已关闭")
|
||
}
|