【问题标题】:get notified when http.Server starts listening当 http.Server 开始监听时得到通知
【发布时间】:2017-11-19 16:52:53
【问题描述】:

当我查看 net/http 服务器界面时,我看不到在 http.Server 启动并开始侦听时获得通知和做出反应的明显方式:

ListenAndServe(":8080", nil)

在服务器真正关闭之前,该函数不会返回。我还查看了服务器类型,但似乎没有任何东西可以让我利用那个时间。某些功能或频道会很棒,但我没有看到。

有什么方法可以让我检测到该事件,还是让我睡“足够”来伪造它?

【问题讨论】:

  • 你是指log之类的东西吗?
  • 你想知道监听器是什么时候创建的吗?你想解决什么问题?如果您愿意,可以使用Server.Serve 将侦听器直接传递给服务器。
  • 我希望能够采取某些操作,例如“此 http 服务器已开放营业”。例如,可以想象这样一种场景,您希望将此服务器注册到注册表,以便一旦服务器启动并实际接受连接,它就会成为某些服务发现的一部分。然后客户端可以发现这个实例并开始发送流量。我怀疑监听器的创建是一个答案,因为它只是创建监听器实例,但实际上并没有接受连接,对吧?
  • @sjlee:好吧,一旦创建了监听器,操作系统就会接受连接到同步队列中,所以它们不会被拒绝。服务发现通常依赖于其他系统,例如运行状况/端口检查,因此在服务出现时注册它不是问题。
  • 好吧,这很公平。感谢那。一般来说,我仍然很感兴趣,没有可以提供在服务器启动时通知的通道或函数。我觉得它是一个非常有用的功能。

标签: go


【解决方案1】:

ListenAndServe 是一个辅助函数,它打开一个监听套接字,然后在该套接字上提供连接。直接在您的应用程序中编写代码以在套接字打开时发出信号:

l, err := net.Listen("tcp", ":8080")
if err != nil {
    // handle error
}

// Signal that server is open for business. 

if err := http.Serve(l, rootHandler); err != nil {
    // handle error
}

如果信号步骤没有阻塞,那么 http.Serve 将很容易消耗监听套接字上的任何积压。

相关问题:https://stackoverflow.com/a/32742904/5728991

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 2017-06-14
  • 1970-01-01
相关资源
最近更新 更多