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 流水线支持的主要内容,如果未能解决你的问题,请参考以下文章