? 大家好,猫头虎博主今天要和大家探讨的是HTTP/2中一个激动人心的新特性——服务器推送(Server Push)。Go 1.8版本对这一功能提供了原生支持。让我们深入了解它是如何优化我们的Web应用的!?
? 在现代Web开发中,性能优化是一个永恒的话题。HTTP/2通过服务器推送技术,为解决HTTP/1.x中的一些限制提供了新的解决方案。在Go 1.8中,我们可以轻松地在应用中实现这一特性。
HTTP/2旨在解决HTTP/1.x的一些不足,尤其是在处理现代Web页面时,需要加载多种资源(HTML、CSS、脚本、图片等)。在HTTP/1.x中,这些资源需要逐一请求,这个过程可能会很慢。
HTTP/2引入了服务器推送,允许服务器在浏览器显式请求之前推送资源。这意味着服务器可以在响应初始请求时开始推送它知道页面将需要的其他资源,从而充分利用空闲网络,提高页面加载速度。
net/http
中实现服务器推送Go 1.8在http.Server
中引入了推送响应的支持。如果运行的服务器是HTTP/2服务器,并且入站连接使用HTTP/2,这个功能就可用。在任何HTTP处理程序中,可以通过检查http.ResponseWriter
是否实现了新的http.Pusher
接口,来断言服务器推送是否受支持。
例如,如果服务器知道渲染页面需要app.js
,处理程序可以在http.Pusher
可用时发起推送:
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
if pusher, ok := w.(http.Pusher); ok {
// Push is supported.
if err := pusher.Push("/app.js", nil); err != nil {
log.Printf("Failed to push: %v", err)
}
}
// ...
})
Push
调用为/app.js
创建一个合成请求,将该请求合成为一个PUSH_PROMISE
帧,然后将合成请求转发给服务器的请求处理程序,生成推送响应。Push
的第二个参数指定在PUSH_PROMISE
中包含的额外头信息。
完整的示例可以在这里找到。
考虑在网络链路空闲时使用服务器推送。刚刚发送了Web应用的HTML吗?不要浪费时间等待,开始推送客户端将需要的资源。是否在HTML文件中内联资源以减少延迟?尝试推送而不是内联。重定向也是使用推送的好时机,因为在客户端跟随重定向时,几乎总会有一个往返的时间浪费。
需要注意的是,仅能推送服务器有权威的资源,这意味着不能推送托管在第三方服务器或CDN上的资源。其次,不要推送客户端可能不需要的资源,否则会浪费带宽。
特性 | 描述 |
---|---|
HTTP/2服务器推送 | 允许服务器在浏览器明确请求前推送资源 |
实现方式 | Go 1.8通过http.Pusher接口支持HTTP/2服务器推送 |
使用场景 | 网络空闲时,如页面加载后或重定向期间 |
注意事项 | 仅推送服务器有权威的资源,避免浪费带宽 |
? Go 1.8为HTTP/2服务器推送提供了原生支持,为优化Web应用提供了新的工具。作为猫头虎的Go生态洞察专栏的一部分,我们期待看到更多创新的使用案例。