今天項目經理交給我一個開發任務。若是有人下了訂單就給後臺一個通知,也就是服務器推送功能。這個需求不是很複雜就一個通知功能,若是我用websocket來作還要搞個websocket服務器,並且還有很多配置。websocket是全雙工通訊,單向通訊簡直是殺雞用牛刀。用輪詢吧,浪費服務器資源不說,還不必定實時,訂單處理慢了豈不是怠慢了客戶。有沒有別的選擇呢?固然有!git
SSE全稱Server-sent Events,是HTML 5 規範的一個組成部分,具體去MDN網站查看相關文檔。該規範十分簡單,主要由兩個部分組成:第一個部分是服務器端與瀏覽器端之間的通信協議,第二部分則是在瀏覽器端可供 JavaScript 使用的 EventSource 對象。通信協議是基於純文本的簡單協議。服務器端的響應的內容類型是「text/event-stream」。響應文本的內容能夠當作是一個事件流,由不一樣的事件所組成。每一個事件由類型和數據兩部分組成,同時每一個事件能夠有一個可選的標識符。不一樣事件的內容之間經過僅包含回車符和換行符的空行(「\r\n」)來分隔。每一個事件的數據可能由多行組成。web
如上圖所示,每一個事件之間經過空行來分隔。每一行都是由鍵值對組成。若是鍵爲空則表示該行爲註釋,會在處理時被忽略。例如第10行。
第1行表示一個只包含數據的事件。會按照默認事件走(message事件)。第3-4表明一個附帶eventID的事件。第6-8表明一個自定義事件。第10-14表明一個多行數據事件,多行數據由換行符連接segmentfault
key定義有如下幾種:瀏覽器
SSE只適用於高級瀏覽器,可是注意IE不直接支持。IE上的XMLHttpRequest對象不支持獲取部分的響應內容,因此不支持。每次總有IE怪不得快被淘汰了。服務器
Spring Mvc對SSE進行了支持。若是你要聲明一個SSE鏈接。只須要在你的控制器聲明一個以下接口:websocket
必須必須返回SseEmitter對象,SseEmitter對象是Session級別的,若是你要點對點針對每一個session要獨立存儲。若是你是廣播能夠公用一個SseEmitter對象。按照SSE規範也必須聲明produces爲"text/event-stream"。當你調用該接口的時候將創建起SSE鏈接。session
你能夠在另外一個線程中調用SseEmitter的send方法向客戶端發送事件。你也能夠在發送事件後調用complete方法來關閉SSE鏈接。socket
因爲SSE 是HTML5規範。因此對於APP端必須有HTML才能支持。而且IE若是要支持須要使用一些兼容開發包,好比polyfill庫。客戶端由於只接受事件因此開發比較簡單:網站
今天介紹了SSE 服務端推送。和長輪訓、comet、websocket相比比較輕量級。在一些須要服務器實時推送規模不大的業務場景實現更簡單點。相信看了本文後你會很快入門。在實際開發中要根據業務對這幾種推送進行技術選型。沒有最好的只有最適合的。只不過SSE對大多數開發者來講不夠熟悉。相關的demo我已經上傳到碼雲倉庫:spa
https://gitee.com/felord/sse-...關注公衆號:碼農小胖哥 獲取更多資訊