go x/net/http2/h2c: 支持关闭所有连接并优雅地关闭

9nvpjoqh  于 8个月前  发布在  Go
关注(0)|答案(7)|浏览(76)

很高兴看到h2c得到了支持:golang/net@c4299a1
然而,没有办法启用优雅的关闭,甚至无法关闭所有h2c连接。我们应该支持这个功能。
你可以使用http2.ConfigureServer来配置一个http2服务器的优雅关闭,当http服务器关闭时调用该方法,但http服务器的关闭方法不会等待http2连接关闭,因为它们已经被劫持了。
我认为最简单的方法是在我们现有的*http2.Server中添加ShutdownClose方法,类似于*http.Server的方法。

k5ifujac

k5ifujac1#

是否有解决此问题的方法?就我所知,目前完全不可能实现,因为需要调用的方法(例如serverConn.startGracefulShutdown)未导出。cc. @bradfitz

r8uurelv

r8uurelv2#

在进行更多的操作后,看起来我可以做类似这样的事情,这是一个相当可怕的黑客行为,但似乎确实有效:

  1. h2s := &http2.Server{}
  2. h1s := &http.Server{}
  3. http2.ConfigureServer(h1s, h2s)
  4. // Make use of h2s in a h2c handler…
  5. h1s.Shutdown(ctx)

这之所以有效,是因为 http2.ConfigureServerhttp.Server 添加了一个关闭钩子,使得当其 Shutdown() 方法被调用时,会调用私有的 startGracefulShutdown 方法。 Shutdown() 无视 h1s 从未被“使用”的事实,仍然调用这个方法。

qgelzfjb

qgelzfjb3#

这不起作用,因为Shutdown本身并不等待h2c连接。
请参阅
go/src/net/http/server.go
第2631行 in 86ce1cb
| | gof() |
它在新goroutine中启动了h2c连接的优雅关闭,但只等待未被劫持的连接。

apeeds0o

apeeds0o4#

对不起,h2c在我优先级列表中非常低。我没有足够的时间来深入研究这个问题,所以在这里无法提供帮助。

vnjpjtjt

vnjpjtjt5#

https://golang.org/cl/185059提到了这个问题:http2: add Close and Shutdown functions to the Server.

nhjlsmyf

nhjlsmyf6#

Go团队是否愿意接受解决此问题的CL?(我看到有一个非常旧的CL已经打开,但似乎没有被审查过。)h2c在gRPC生态系统中特别受欢迎,对于基于net/http构建的gRPC实现来说,支持优雅地关闭是很不错的。我们已经有几个Connect用户抱怨这个问题😢
neild是否是查看x/net/httpnet/http问题的最佳人选?

xdyibdwo

xdyibdwo7#

这不起作用,因为关闭本身不等待h2c连接。
它在新goroutine中启动优雅地关闭h2c连接,但只等待未被劫持的连接。
我想我已经想出了一个解决方法。想法是使用自定义监听器,直到连接关闭为止,参见 zalando/skipper#2480

相关问题