摘要:服務(wù)器端的響應(yīng)的內(nèi)容類型是。類型為,表示該行用來(lái)聲明事件的類型。服務(wù)器端可以通過瀏覽器端發(fā)送的事件標(biāo)識(shí)符來(lái)確定從哪個(gè)事件開始來(lái)繼續(xù)連接??偨Y(jié)今天介紹了服務(wù)端推送。在實(shí)際開發(fā)中要根據(jù)業(yè)務(wù)對(duì)這幾種推送進(jìn)行技術(shù)選型。
1. 前言
今天項(xiàng)目經(jīng)理交給我一個(gè)開發(fā)任務(wù)。如果有人下了訂單就給后臺(tái)一個(gè)通知,也就是服務(wù)器推送功能。這個(gè)需求不是很復(fù)雜就一個(gè)通知功能,如果我用websocket來(lái)做還要搞個(gè)websocket服務(wù)器,而且還有不少配置。websocket是全雙工通信,單向通信簡(jiǎn)直是殺雞用牛刀。用輪詢吧,浪費(fèi)服務(wù)器資源不說,還不一定實(shí)時(shí),訂單處理慢了豈不是怠慢了客戶。有沒有別的選擇呢?當(dāng)然有!
2. SSE推送技術(shù)SSE全稱Server-sent Events,是HTML 5 規(guī)范的一個(gè)組成部分,具體去MDN網(wǎng)站查看相關(guān)文檔。該規(guī)范十分簡(jiǎn)單,主要由兩個(gè)部分組成:第一個(gè)部分是服務(wù)器端與瀏覽器端之間的通訊協(xié)議,第二部分則是在瀏覽器端可供 JavaScript 使用的 EventSource 對(duì)象。通訊協(xié)議是基于純文本的簡(jiǎn)單協(xié)議。服務(wù)器端的響應(yīng)的內(nèi)容類型是“text/event-stream”。響應(yīng)文本的內(nèi)容可以看成是一個(gè)事件流,由不同的事件所組成。每個(gè)事件由類型和數(shù)據(jù)兩部分組成,同時(shí)每個(gè)事件可以有一個(gè)可選的標(biāo)識(shí)符。不同事件的內(nèi)容之間通過僅包含回車符和換行符的空行(“rn”)來(lái)分隔。每個(gè)事件的數(shù)據(jù)可能由多行組成。
如上圖所示,每個(gè)事件之間通過空行來(lái)分隔。每一行都是由鍵值對(duì)組成。如果鍵為空則表示該行為注釋,會(huì)在處理時(shí)被忽略。例如第10行。
第1行表示一個(gè)只包含數(shù)據(jù)的事件。會(huì)按照默認(rèn)事件走(message事件)。第3-4代表一個(gè)附帶eventID的事件。第6-8代表一個(gè)自定義事件。第10-14代表一個(gè)多行數(shù)據(jù)事件,多行數(shù)據(jù)由換行符鏈接
key定義有以下幾種:
data,表示該行包含的是數(shù)據(jù)。以 data 開頭的行可以出現(xiàn)多次。所有這些行都是該事件的數(shù)據(jù)。
類型為 event,表示該行用來(lái)聲明事件的類型。瀏覽器在收到數(shù)據(jù)時(shí),會(huì)產(chǎn)生對(duì)應(yīng)類型的事件。默認(rèn)提供三個(gè)標(biāo)準(zhǔn)事件(當(dāng)然你可以自定義):
id,表示該行用來(lái)聲明事件的標(biāo)識(shí)符。服務(wù)器端返回的數(shù)據(jù)中包含了事件的標(biāo)識(shí)符,瀏覽器會(huì)記錄最近一次接收到的事件的標(biāo)識(shí)符。如果與服務(wù)器端的連接中斷,當(dāng)瀏覽器端再次進(jìn)行連接時(shí),會(huì)通過 HTTP 頭“Last-Event-ID”來(lái)聲明最后一次接收到的事件的標(biāo)識(shí)符。服務(wù)器端可以通過瀏覽器端發(fā)送的事件標(biāo)識(shí)符來(lái)確定從哪個(gè)事件開始來(lái)繼續(xù)連接。
retry,表示該行用來(lái)聲明瀏覽器在連接斷開之后進(jìn)行再次連接之前的等待時(shí)間。
SSE只適用于高級(jí)瀏覽器,但是注意IE不直接支持。IE上的XMLHttpRequest對(duì)象不支持獲取部分的響應(yīng)內(nèi)容,所以不支持。每次總有IE怪不得快被淘汰了。
3. SSE VS WebsocketSSE 只能Server到Client單項(xiàng),而Websocket是雙向通信。
SSE 比 Websocket 輕量。當(dāng)然功能要簡(jiǎn)單的多。開發(fā)便利,不牽涉協(xié)議升級(jí)問題。
SSE 天然支持?jǐn)嗑€重連
4. Spring Mvc中的SSESpring Mvc對(duì)SSE進(jìn)行了支持。如果你要聲明一個(gè)SSE連接。只需要在你的控制器聲明一個(gè)如下接口:
必須必須返回SseEmitter對(duì)象,SseEmitter對(duì)象是Session級(jí)別的,如果你要點(diǎn)對(duì)點(diǎn)針對(duì)每個(gè)session要獨(dú)立存儲(chǔ)。如果你是廣播可以公用一個(gè)SseEmitter對(duì)象。按照SSE規(guī)范也必須聲明produces為"text/event-stream"。當(dāng)你調(diào)用該接口的時(shí)候?qū)⒔⑵餝SE連接。
你可以在另一個(gè)線程中調(diào)用SseEmitter的send方法向客戶端發(fā)送事件。你也可以在發(fā)送事件后調(diào)用complete方法來(lái)關(guān)閉SSE連接。
5. 客戶端由于SSE 是HTML5規(guī)范。所以對(duì)于APP端必須有HTML才能支持。并且IE如果要支持需要使用一些兼容開發(fā)包,比如polyfill庫(kù)??蛻舳艘?yàn)橹唤邮苁录蚤_發(fā)比較簡(jiǎn)單:
聲明客戶端連接, 初始化EventSource對(duì)象。
編寫監(jiān)聽器來(lái)監(jiān)聽事件。
6. 總結(jié)今天介紹了SSE 服務(wù)端推送。和長(zhǎng)輪訓(xùn)、comet、websocket相比比較輕量級(jí)。在一些需要服務(wù)器實(shí)時(shí)推送規(guī)模不大的業(yè)務(wù)場(chǎng)景實(shí)現(xiàn)更簡(jiǎn)單點(diǎn)。相信看了本文后你會(huì)很快入門。在實(shí)際開發(fā)中要根據(jù)業(yè)務(wù)對(duì)這幾種推送進(jìn)行技術(shù)選型。沒有最好的只有最適合的。只不過SSE對(duì)大多數(shù)開發(fā)者來(lái)說不夠熟悉。相關(guān)的demo我已經(jīng)上傳到碼云倉(cāng)庫(kù):
https://gitee.com/felord/sse-...
關(guān)注公眾號(hào):碼農(nóng)小胖哥 獲取更多資訊
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/106875.html
摘要:本文則試著和讀者一起對(duì)這個(gè)數(shù)據(jù)推送的需求進(jìn)行技術(shù)方案的探究。數(shù)據(jù)推送有兩種替代方案無(wú)更新方案和數(shù)據(jù)拉取方案。數(shù)據(jù)拉取和數(shù)據(jù)推送的功能目標(biāo)是一致的讓用戶看到最新的數(shù)據(jù)。但數(shù)據(jù)推送有一些優(yōu)勢(shì),即更低的延遲。 前言 眾所周知,AJAX的出現(xiàn)是前端快速發(fā)展的一個(gè)標(biāo)志,同時(shí)也是前后端得以分離的重要基礎(chǔ)。作為一個(gè)C/S網(wǎng)絡(luò)的web系統(tǒng),網(wǎng)絡(luò)通信在發(fā)揮著舉足輕重的作用。大部分的場(chǎng)景下,我們是主動(dòng)觸發(fā)...
摘要:本文則試著和讀者一起對(duì)這個(gè)數(shù)據(jù)推送的需求進(jìn)行技術(shù)方案的探究。數(shù)據(jù)推送有兩種替代方案無(wú)更新方案和數(shù)據(jù)拉取方案。數(shù)據(jù)拉取和數(shù)據(jù)推送的功能目標(biāo)是一致的讓用戶看到最新的數(shù)據(jù)。但數(shù)據(jù)推送有一些優(yōu)勢(shì),即更低的延遲。 前言 眾所周知,AJAX的出現(xiàn)是前端快速發(fā)展的一個(gè)標(biāo)志,同時(shí)也是前后端得以分離的重要基礎(chǔ)。作為一個(gè)C/S網(wǎng)絡(luò)的web系統(tǒng),網(wǎng)絡(luò)通信在發(fā)揮著舉足輕重的作用。大部分的場(chǎng)景下,我們是主動(dòng)觸發(fā)...
摘要:聊一聊端的即時(shí)通訊端實(shí)現(xiàn)即時(shí)通訊的方法有哪些短輪詢長(zhǎng)輪詢流輪詢客戶端定時(shí)向服務(wù)器發(fā)送請(qǐng)求,服務(wù)器接到請(qǐng)求后馬上返回響應(yīng)信息并關(guān)閉連接。介紹是開始提供的一種在單個(gè)連接上進(jìn)行全雙工通訊的協(xié)議。 聊一聊Web端的即時(shí)通訊 Web端實(shí)現(xiàn)即時(shí)通訊的方法有哪些? - 短輪詢 長(zhǎng)輪詢 iframe流 Flash Socket 輪詢 客戶端定時(shí)向服務(wù)器發(fā)送Ajax請(qǐng)求,服務(wù)器接到請(qǐng)求后馬上返...
閱讀 2108·2021-10-08 10:05
閱讀 1948·2021-09-22 15:31
閱讀 3139·2021-09-22 15:13
閱讀 3657·2021-09-09 09:34
閱讀 2266·2021-09-03 10:46
閱讀 3221·2019-08-30 15:56
閱讀 1763·2019-08-30 15:53
閱讀 2421·2019-08-30 15:44