为了账号安全,请及时绑定邮箱和手机立即绑定

如何在一次运行中多次停止和启动 gin 服务器

如何在一次运行中多次停止和启动 gin 服务器

Go
开心每一天1111 2023-02-06 18:36:53
我正在编写一个程序,当我的程序运行时,我需要多次启动和停止我的服务器(在这种情况下使用 Gin 框架),停止 gin 服务器本身需要一个技巧,我在这个问题中发现了一个技巧: Graceful stop of gin server但是这种方法会阻止我的程序在未来启动 gin 服务器,根据http.Server.Shutdown()方法的文档说:一旦在服务器上调用了 Shutdown,就不能再使用它;以后对 Serve 等方法的调用将返回 ErrServerClosed。我确实需要将来的电话。附加信息纤维可以很容易地处理这种情况,但我想用杜松子酒来做。我想要这样的纤维代码:  fiber := NewFiberApp()  fiber.RegisterRoutes()  fiber.Start() // Calls fiber.Listen() Under the hood  fiber.Stop() // Calls fiber.Shutdown() Under the hood  fiber.Start()  fiber.Stop()  fiber.Start()它按我的预期工作。
查看完整描述

2 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

您需要从头开始创建服务器结构!


不能再使用关闭http.Server。



func serve() *http.Server {

    router := gin.Default()

    router.GET("/", func(c *gin.Context) {

        time.Sleep(5 * time.Second)

        c.String(http.StatusOK, "Welcome Gin Server\n")

    })


    srv := &http.Server{

        Addr:    ":8080",

        Handler: router,

    }


    go func() {

        // service connections

        if err := srv.ListenAndServe(); err != nil {

            log.Printf("listen: %s\n", err)

        }

    }()


    return srv

}


func main() {

    {

        srv := serve()


        time.Sleep(time.Second * 3)


        fmt.Println("down", srv.Shutdown(context.Background()))

    }

    {

        time.Sleep(time.Second * 3)


        fmt.Println("up", serve())

    }


    select {}

}


查看完整回答
反对 回复 2023-02-06
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

我尝试了很多方法,最后写了一篇文章,这将帮助您解决问题: https ://dev.to/arshamalh/trying-to-shutdown-a-gin-server-goroutines-and-channels-提示-gf3


查看完整回答
反对 回复 2023-02-06
  • 2 回答
  • 0 关注
  • 134 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信