Netty HTTP 1.1 流水线支持

Posted

技术标签:

【中文标题】Netty HTTP 1.1 流水线支持【英文标题】:Netty HTTP 1.1 Pipelining Support 【发布时间】:2018-11-25 20:14:38 【问题描述】:

我需要通过同一个连接向一个休息服务器发送多个异步请求,并让它们以先进先出的顺序执行,我认为 HTTP 1.1 流水线非常适合这个。

我在Netty 上发现了一些相关问题,但我在他们的用户指南上找不到太多内容,在他们的测试用例上也没有。

Netty 是否支持 HTTP 1.1 管道?这将如何实施?

一个例子将不胜感激。

相关的未回答问题:HTTP 1.1 pipelining vs HTTP 2 multiplexing

【问题讨论】:

【参考方案1】:

由于Netty更接近TCP层,而不是HTTP层,发送多个请求很容易,建立管道后,编写它们。

HttpRequest request1 = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/");
request1.headers().set(HttpHeaderNames.HOST, host);
request1.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE);
request1.headers().set(HttpHeaderNames.ACCEPT_ENCODING, HttpHeaderValues.GZIP);

channel.writeAndFlush(request1);

HttpRequest request2 = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/");
request2.headers().set(HttpHeaderNames.HOST, host);
request2.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE);
request2.headers().set(HttpHeaderNames.ACCEPT_ENCODING, HttpHeaderValues.GZIP);

channel.writeAndFlush(request2);

然后在您的channelRead 方法中,按照您发送它们的相同顺序读取它们。

要正确管理数据包的队列,您可以使用this 之类的解决方案,您基本上保留一个队列,这样您就知道在请求完成后要调用的正确回调。

【讨论】:

创建请求不是问题,发送它们是因为我不想自己编写http客户端。您是否知道我可以用来完成您的示例的任何 Netty http 客户端(支持 ssl)?我目前正在查看 [1] 和 [2],不确定我是否能够对它们执行此操作。 [1] github.com/AsyncHttpClient/async-http-client [2] github.com/timboudreau/netty-http-client 我不知道有任何外部客户。如果您打算直接使用 Netty,您实际上需要编写自己的实现。请注意,对于新的 *** 问题,要求库/程序推荐是题外话。 看起来使用第三方 http 客户端执行此操作并非易事,它们旨在避免这种情况。我已经尝试在其中一些中设置 max-connection-per-host 1 并且它们有效地以同步模式发送请求(即,在发送另一个之前等待一个响应)。这是有道理的,但问题是它们没有提供改变这种行为的方法。 据我所知 Vert.x 至少支持流水线。

以上是关于Netty HTTP 1.1 流水线支持的主要内容,如果未能解决你的问题,请参考以下文章

HTTP1.0 HTTP 1.1 HTTP 2.0主要区别

Alamofire 是不是支持 HTTP 流水线?

服务器发送的事件是不是使用 HTTP/2 流水线

你该用HTTP2了

1.1渲染流水线

Netty中的ChannelHandler的基础知识