很高兴看到h2c得到了支持:golang/net@c4299a1
然而,没有办法启用优雅的关闭,甚至无法关闭所有h2c连接。我们应该支持这个功能。
你可以使用http2.ConfigureServer
来配置一个http2服务器的优雅关闭,当http服务器关闭时调用该方法,但http服务器的关闭方法不会等待http2连接关闭,因为它们已经被劫持了。
我认为最简单的方法是在我们现有的*http2.Server
中添加Shutdown
和Close
方法,类似于*http.Server
的方法。
7条答案
按热度按时间k5ifujac1#
是否有解决此问题的方法?就我所知,目前完全不可能实现,因为需要调用的方法(例如
serverConn.startGracefulShutdown
)未导出。cc. @bradfitzr8uurelv2#
在进行更多的操作后,看起来我可以做类似这样的事情,这是一个相当可怕的黑客行为,但似乎确实有效:
这之所以有效,是因为
http2.ConfigureServer
向http.Server
添加了一个关闭钩子,使得当其Shutdown()
方法被调用时,会调用私有的startGracefulShutdown
方法。Shutdown()
无视h1s
从未被“使用”的事实,仍然调用这个方法。qgelzfjb3#
这不起作用,因为Shutdown本身并不等待h2c连接。
请参阅
go/src/net/http/server.go
第2631行 in 86ce1cb
| | gof() |
它在新goroutine中启动了h2c连接的优雅关闭,但只等待未被劫持的连接。
apeeds0o4#
对不起,h2c在我优先级列表中非常低。我没有足够的时间来深入研究这个问题,所以在这里无法提供帮助。
vnjpjtjt5#
https://golang.org/cl/185059提到了这个问题:
http2: add Close and Shutdown functions to the Server.
nhjlsmyf6#
Go团队是否愿意接受解决此问题的CL?(我看到有一个非常旧的CL已经打开,但似乎没有被审查过。)h2c在gRPC生态系统中特别受欢迎,对于基于
net/http
构建的gRPC实现来说,支持优雅地关闭是很不错的。我们已经有几个Connect用户抱怨这个问题😢neild是否是查看
x/net/http
和net/http
问题的最佳人选?xdyibdwo7#
这不起作用,因为关闭本身不等待h2c连接。
它在新goroutine中启动优雅地关闭h2c连接,但只等待未被劫持的连接。
我想我已经想出了一个解决方法。想法是使用自定义监听器,直到连接关闭为止,参见 zalando/skipper#2480