gpt4 book ai didi

java - Netty 将 HTTP/1.1 管道转换为双 HTTP/2 HTTP/1.1

转载 作者:行者123 更新时间:2023-12-04 03:38:58 26 4
gpt4 key购买 nike

我构建了一个简单的管道来使用 Netty 提供 HTTP/1.1 内容,我正在寻找如何将其转换为 HTTP/2。我看到了各种用于在帧之间进行转换和协商的类,但我不知道如何将它们组装到管道中。以下代码在 Kotlin 中。我遇到的主要问题是 ALPN 协商,以及双向正确转换帧。

val bootstrap = ServerBootstrap()
bootstrap.group(transport.bossGroup, transport.workerGroup)
.channelFactory(transport.factory)
.childHandler(object : ChannelInitializer<SocketChannel>() {
public override fun initChannel(ch: SocketChannel) {
ch.pipeline().addLast("ssl", sslContext.newHandler(ch.alloc()))

ch.pipeline().addLast("codec", HttpServerCodec())
ch.pipeline().addLast("keepAlive", HttpServerKeepAliveHandler())
ch.pipeline().addLast("aggregator", HttpObjectAggregator(65536))

ch.pipeline().addLast("burstLimiter", burstLimiter)

ch.pipeline().addLast(
"readTimeoutHandler",
ReadTimeoutHandler(60)
)
ch.pipeline().addLast(
"writeTimeoutHandler",
WriteTimeoutHandler(60)
)

ch.pipeline().addLast("streamer", ChunkedWriteHandler())
ch.pipeline().addLast("handler", CustomHandler(httpHandler))
}
})

最佳答案

我认为最简单的解决方案是同时使用 Http2MultiplexHandlerHttp2StreamFrameToHttpObjectCodec。这将允许您使用 HTTP2,同时仍然在您的处理程序中为您提供与 HTTP1 相同的“对象”。

所以它会是这样的:

ch.pipeline().addLast(Http2FrameCodecBuilder.forServer().build());
ch.pipeline().addLast(new Http2MultiplexHandler(new ChannelInitializer<Channel>() {
@Override
protected void initChannel(Channel ch) {
ch.pipeline().addLast(new Http2StreamFrameToHttpObjectCodec(true));
// Add all your other handlers that act on HTTP1 objects
}
});

如果您还需要为 SSL 等添加处理程序,则取决于您的用例。

有关更详细的示例,您还可以引用作为 netty 本身一部分的 http2 多路复用示例。它们根据客户的要求同时处理 H1/H2。

关于java - Netty 将 HTTP/1.1 管道转换为双 HTTP/2 HTTP/1.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66405367/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com