Jetty HTTP2 服务器推送支持

Posted

技术标签:

【中文标题】Jetty HTTP2 服务器推送支持【英文标题】:Jetty HTTP2 server push support 【发布时间】:2015-06-03 05:25:48 【问题描述】:

对于SPDY,我们需要实现一个PushStrategy并注册它来推送资源。

HTTP2 支持怎么样?

我喜欢 nginx 的想法,它包括读取 HTTP 响应中的链接头:https://nghttp2.org/blog/2015/02/10/nghttp2-dot-org-enabled-http2-server-push/

谢谢!

【问题讨论】:

【参考方案1】:

Jetty HTTP/2 完全支持 HTTP/2 Push,实际上有不同的风格。 Webtide's website 已经启用了 Jetty 的 HTTP/2 Push。

有一个PushCacheFilter,它基于Referer 标头实现了在Jetty SPDY 的PushStrategy 中实现的相同算法。

有一个PushSessionCacheFilter,它使用构建器来实现更复杂的方法来实际推送资源。

目前两者都使用 Jetty 特定的 API,试图将它们作为 Servlet 4.0 规范的标准,并在实际示例中对其进行测试。

这种方法的好处是完全自动化,并且不需要应用程序支持:开箱即用,适用于任何旧的/遗留的 web 应用程序。

Jetty 团队当然可以探索使用 Link 标头的可能性,但这似乎需要应用程序的支持(应用程序必须添加具有正确格式的 Link 标头),以及一个代理层影响表演。 这是由https://bugs.eclipse.org/bugs/show_bug.cgi?id=463457 跟踪的,欢迎任何贡献。

为了实现自己的资源推送策略,你可以编写一个简单的 Servlet 过滤器,并在其中使用 Jetty 特定的 API(即 Dispatcher.push(...)PushBuilder API)来推送你自己的资源,类似于上面提到的过滤器是做什么的。

【讨论】:

好的,您能否确认即使这些过滤器真的很有效,在第一次发送请求时也不会推送任何资源?如果应用程序有任何机制有助于在构建时检测引用的资源,那么即使是第一个请求也会利用推送?此外,当我检查 PushBuilder 时,似乎能够避免使用 last-modified/Etag 标头进行推送操作。但是,这些标头是从初始请求中检索的。例如,如果我过滤 html 页面,则将推送有关 HTML 页面请求标头的关联 JS 文件。对吗? 当前过滤器确实会在第一个请求时创建缓存,因此它们只会从第二个请求开始推送。目前没有“预填充”缓存的机制,以便它会在第一个请求时推送,但这是一个有趣的特性。请在bugs.eclipse.org/bugs/enter_bug.cgi?product=Jetty 提交功能请求。查看 last modified / etag 标头的目的是避免在浏览器提示其缓存中已有资源时推送。如果主资源自带,JS不应该被推送。我建议我们将其移至 Jetty 邮件列表。

以上是关于Jetty HTTP2 服务器推送支持的主要内容,如果未能解决你的问题,请参考以下文章

golang http2 服务器推送的高级客户端

启用 HTTP2 服务器推送 Nginx

小米推送服务端JAVA HTTP2 SDK/iOS客户端SDK版本发布

极客漫画:HTTP2 服务器推送

IOS推送http2使用netty服务启动异常

当我进行 http2 推送时,我向服务器发出请求?