Web 服务器正常关闭未按预期工作

Web server graceful shutdown not working as expected

我之前写过一篇关于在 Go 中创建网络服务器并正常关闭的博文。

https://marcofranssen.nl/go-webserver-with-gracefull-shutdown/#TLDR

此解决方案非常有效,但是对于更大的项目,我想进一步构建代码。

我已经按照以下要点重构了这段代码。

https://gist.github.com/marcofranssen/699c1aa97c8a33ab20b5eccada275b08

出于某种原因,带有 srv.ListenAndServe() 的行似乎没有执行,而正常关闭仍然像以前一样在 go 例程中运行。

对我来说,代码看起来完全一样,只是重构为单独的文件并添加了 Start 函数。

谁能解释为什么在我发出中断信号之前它不执行,导致 http 服务器立即启动和关闭?

在社区的 Gopher 小伙伴的帮助下,我找到了答案。

包含srv.ListenAndServe()的代码行是一个阻塞代码行,导致这行代码之后的日志不会发生。

在我之前的博客中演示的原始代码中,我在 srv.ListenAndServe() 行的前面有此日志。因此,在该示例中,相同的代码按预期记录到控制台。

毕竟这是一个愚蠢的错误,您可以轻松地多次阅读。基本上交换了 2 行代码,我忘记了 http.ListenAndServe().

的阻塞行为

关键要点:

http.ListenAndServe() is blocking by definition and therefore will not run any code after that line.