| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- 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服务已关闭")
- }
|