【譯者注:本文需要有一定的HTTP協(xié)議知識和瀏覽器解析頁面過程知識】
原文 :https://blog.golang.org/h2push
前言
HTTP/2被設(shè)計為解決HTTP/1.x的許多缺陷锣尉。當(dāng)代網(wǎng)頁使用了許多資源:HTML威兜、樣式表、腳本、圖片等等礁阁。在HTTP/1.x中這些資源每一個都必須明確地請求薪铜。這可能是一個很慢的過程桃纯。瀏覽器從獲取HTML開始,然后在它解析和評估頁面的時候造锅,增量地獲取更多的資源。因為服務(wù)器必須等待瀏覽器做每一個請求廉邑,網(wǎng)絡(luò)經(jīng)常是空閑的和未充分使用的哥蔚。
為了改善延遲倒谷,HTTP/2引入了server push,它允許服務(wù)端推送資源給瀏覽器糙箍,在瀏覽器明確地請求之前渤愁。一個服務(wù)器經(jīng)常知道一個頁面需要很多附加資源,在它響應(yīng)瀏覽器第一個請求的時候深夯,可以開始推送這些資源抖格。這允許服務(wù)端去完全充分地利用一個可能空閑的網(wǎng)絡(luò),改善頁面加載時間咕晋。
在協(xié)議層雹拄,HTTP/2 server push被push_promise 幀所驅(qū)動,一個PUSH_PROMISE描述了一個請求掌呜,即服務(wù)端預(yù)測瀏覽器將馬上要發(fā)出的請求滓玖。瀏覽器一收到PUSH_PROMISE,它馬上知道服務(wù)端將要傳輸這個資源站辉。如果瀏覽器后續(xù)發(fā)現(xiàn)它需要這個資源呢撞,它會等待這個推送完成,而不是發(fā)送一個新的請求饰剥。這減少了瀏覽器花費在網(wǎng)絡(luò)等待上的時間 殊霞。
net/http包中的服務(wù)端推送
go1.8引入了來自http.Server對推送響應(yīng)的支持。如果運行的server是一個HTTP/2的服務(wù)汰蓉,并且進(jìn)來的連接是使用HTTP/2的時候绷蹲,這個特性是可用的。在任意一個HTTP handler中顾孽,你可以判斷http.ResponseWriter是否支持服務(wù)端推送祝钢,通過檢查它是否實現(xiàn)了新的http.Pusher接口。
例如若厚,如果server知道app.js將要被請求來渲染頁面拦英,如果http.Pusher可用,handler可以初始化一個push测秸。
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)
}
}
// ...
})
因時間關(guān)系疤估,今天晚上先譯到這……