登录
首页 >  Golang >  Go问答

如何在单次运行中反复停止和启动gin服务器

来源:stackoverflow

时间:2024-02-09 17:09:23 487浏览 收藏

珍惜时间,勤奋学习!今天给大家带来《如何在单次运行中反复停止和启动gin服务器》,正文内容主要涉及到等等,如果你正在学习Golang,或者是对Golang有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望都能帮到正在学习的大家!

问题内容

我正在编写一个程序,当我的程序运行时,我需要多次启动和停止我的服务器(在本例中使用 gin 框架),

停止杜松子酒服务器本身需要一个我在这个问题中发现的技巧: gin 服务器正常停止

但是这种方法会阻止我的程序将来启动gin服务器,根据http.server.shutdown()方法的文档说:

一旦在服务器上调用 shutdown,就不能重复使用;以后调用 serve 等方法将返回 errserverclosed。

我确实需要未来的电话。

其他信息

fiber 可以轻松处理这种情况,但我想用杜松子酒来实现。

我想要这样的纤维代码:

  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()

它按我的预期工作。


正确答案


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

无法再次使用关闭的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 {}
}


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

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>