本發(fā)明涉及計(jì)算機(jī)通信,具體地說(shuō)是一種基于sse的前端數(shù)據(jù)實(shí)時(shí)更新方法。
背景技術(shù):
1、在日常的開(kāi)發(fā)中,經(jīng)常能遇到服務(wù)端需要主動(dòng)推送給客戶端數(shù)據(jù)的業(yè)務(wù)場(chǎng)景,比如數(shù)據(jù)大屏的實(shí)時(shí)數(shù)據(jù),比如消息中心的未讀消息,比如聊天功能等等。
2、目前實(shí)現(xiàn)這些需求的方案主要有輪詢/長(zhǎng)輪詢、websocket。
3、輪詢是一種較為傳統(tǒng)的方式,客戶端定時(shí)地向服務(wù)端發(fā)送請(qǐng)求,詢問(wèn)是否有新數(shù)據(jù)。服務(wù)端只需要檢查數(shù)據(jù)狀態(tài),然后將結(jié)果返回給客戶端。輪詢的優(yōu)點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單,兼容性好;缺點(diǎn)是可能產(chǎn)生較大的延遲,且對(duì)服務(wù)端資源消耗較高。長(zhǎng)輪詢是輪詢的改進(jìn)版??蛻舳讼蚍?wù)器發(fā)送請(qǐng)求,服務(wù)器收到請(qǐng)求后,如果有新的數(shù)據(jù),立即返回給客戶端;如果沒(méi)有新數(shù)據(jù),服務(wù)器會(huì)等待一定時(shí)間(比如30秒超時(shí)時(shí)間),在這段時(shí)間內(nèi),如果有新數(shù)據(jù),就返回給客戶端,否則返回空數(shù)據(jù)??蛻舳颂幚硗攴?wù)器返回的響應(yīng)后,再次發(fā)起新的請(qǐng)求,如此反復(fù)。長(zhǎng)輪詢相較于傳統(tǒng)的輪詢方式減少了請(qǐng)求次數(shù),但仍然存在一定的延遲。
4、websocket是一個(gè)雙向通訊的協(xié)議,優(yōu)點(diǎn)是可以同時(shí)支持客戶端和服務(wù)端彼此相互進(jìn)行通訊。功能上很強(qiáng)大。缺點(diǎn)是websocket是一個(gè)新的協(xié)議ws/wss,支持http協(xié)議的瀏覽器不一定支持ws協(xié)議。且websocket因?yàn)楣δ芨鼜?qiáng)大,結(jié)構(gòu)也就更復(fù)雜,相對(duì)比較重。
技術(shù)實(shí)現(xiàn)思路
1、本發(fā)明的技術(shù)任務(wù)是針對(duì)以上不足之處,提供一種基于sse的前端數(shù)據(jù)實(shí)時(shí)更新方法,能夠?qū)崿F(xiàn)實(shí)時(shí)通知,增強(qiáng)用戶體驗(yàn);并能節(jié)省資源,減少服務(wù)器的負(fù)載,提高性能。
2、本發(fā)明解決其技術(shù)問(wèn)題所采用的技術(shù)方案是:
3、一種基于sse的前端數(shù)據(jù)實(shí)時(shí)更新方法,該方法的實(shí)現(xiàn)包括以下步驟:
4、1)后端定義控制器用來(lái)處理sse請(qǐng)求和發(fā)送實(shí)時(shí)數(shù)據(jù);
5、2)創(chuàng)建sseemitter對(duì)象作為事件發(fā)射器,通過(guò)接口或者查詢數(shù)據(jù)庫(kù)數(shù)據(jù)的方式獲取數(shù)據(jù),并將數(shù)據(jù)轉(zhuǎn)換為字符串形式發(fā)送給客戶端;
6、3)通過(guò)emitter.send()方法發(fā)送的數(shù)據(jù)會(huì)被封裝為sse事件流的形式,客戶端通過(guò)監(jiān)聽(tīng)該事件流來(lái)實(shí)時(shí)接收數(shù)據(jù);
7、4)前端創(chuàng)建eventsource對(duì)象,并與所述后端控制器建立sse連接;
8、5)定義接收數(shù)據(jù)的回調(diào)函數(shù),在收到新數(shù)據(jù)時(shí)更新頁(yè)面上的數(shù)據(jù)。
9、基于sse建立合適的服務(wù)端方法和前端接口替換對(duì)應(yīng)的輪詢或者websocket接口更新頁(yè)面數(shù)據(jù)和消息信息,實(shí)現(xiàn)實(shí)時(shí)通知增強(qiáng)用戶體驗(yàn),sse默認(rèn)支持?jǐn)嗑€重連,支持自定義發(fā)送的數(shù)據(jù)類(lèi)型,節(jié)省資源減少服務(wù)器的負(fù)載和提高性能。
10、進(jìn)一步的,所述步驟1),具體實(shí)現(xiàn)如下:
11、定義一個(gè)streamstockprice()方法,使用@getmapping注解將/stock-price路徑映射到該方法上,并指定produces=mediatype.text_event_stream_value以表明該方法將產(chǎn)生sse事件流;
12、在該方法內(nèi)部創(chuàng)建一個(gè)sseemitter對(duì)象作為事件發(fā)射器。
13、進(jìn)一步的,所述步驟4),前端通過(guò)new?eventsource('/stock-price')創(chuàng)建一個(gè)eventsource對(duì)象,它與/stock-price路徑建立sse連接。
14、進(jìn)一步的,所述eventsource對(duì)象接收兩個(gè)參數(shù):url和options;
15、url為http事件來(lái)源,一旦eventsource對(duì)象被創(chuàng)建后,瀏覽器立即開(kāi)始對(duì)該url地址發(fā)送過(guò)來(lái)的事件進(jìn)行監(jiān)聽(tīng);
16、options是一個(gè)可選的對(duì)象,包含withcredentials屬性,表示是否發(fā)送憑證(cookie、http認(rèn)證信息等)到服務(wù)端,默認(rèn)為false。
17、進(jìn)一步的,所述eventsource對(duì)象具有readystate屬性值:
18、0,相當(dāng)于常量eventsource.connecting,表示連接還未建立,或者連接斷線;
19、1,相當(dāng)于常量eventsource.open,表示連接已經(jīng)建立,可以接收數(shù)據(jù);
20、2,相當(dāng)于常量eventsource.closed,表示連接已斷,且不會(huì)重連。
21、進(jìn)一步的,所述步驟5),通過(guò)eventsource.onmessage定義接收數(shù)據(jù)的回調(diào)函數(shù),eventsource對(duì)象本身繼承自eventtarget接口,因此可以使用addeventlistener()方法來(lái)監(jiān)聽(tīng)事件;
22、eventsource對(duì)象觸發(fā)的事件主要包括以下三種:
23、open事件:當(dāng)成功連接到服務(wù)端時(shí)觸發(fā);
24、message事件:當(dāng)接收到服務(wù)器發(fā)送的消息時(shí)觸發(fā);該事件對(duì)象的data屬性包含了服務(wù)器發(fā)送的消息內(nèi)容;
25、error事件:當(dāng)發(fā)生錯(cuò)誤時(shí)觸發(fā);該事件對(duì)象的event屬性包含了錯(cuò)誤信息;
26、或采用屬性監(jiān)聽(tīng)(onopen、onmessage、onerror)的形式,只監(jiān)聽(tīng)預(yù)定義的事件類(lèi)型(open、message、error)。
27、進(jìn)一步的,后端通過(guò)建立sseemittermanger,統(tǒng)一管理當(dāng)前服務(wù)sse連接的創(chuàng)建、釋放以及數(shù)據(jù)推送。
28、sseemittermanger結(jié)合redis緩存可實(shí)現(xiàn)集群環(huán)境sse連接的管理,也可以與nginx等配合使用。
29、進(jìn)一步的,開(kāi)啟sse連接接口的整個(gè)鏈路都支持長(zhǎng)連接。
30、本發(fā)明還要求保護(hù)一種基于sse的前端數(shù)據(jù)實(shí)時(shí)更新實(shí)現(xiàn)裝置,包括:至少一個(gè)存儲(chǔ)器和至少一個(gè)處理器;
31、所述至少一個(gè)存儲(chǔ)器,用于存儲(chǔ)機(jī)器可讀程序;
32、所述至少一個(gè)處理器,用于調(diào)用所述機(jī)器可讀程序,實(shí)現(xiàn)上述的方法。
33、本發(fā)明還要求保護(hù)一種計(jì)算機(jī)可讀介質(zhì),所述計(jì)算機(jī)可讀介質(zhì)上存儲(chǔ)有計(jì)算機(jī)指令,所述計(jì)算機(jī)指令在被處理器執(zhí)行時(shí),實(shí)現(xiàn)上述的方法。
34、本發(fā)明的一種基于sse的前端數(shù)據(jù)實(shí)時(shí)更新方法與現(xiàn)有技術(shù)相比,具有以下有益效果:
35、本發(fā)明通過(guò)提供基于sse的前端實(shí)時(shí)數(shù)據(jù)更新和消息通知方法,通過(guò)tcp建立一次長(zhǎng)連接,減少使用websocket接口的tcp連接數(shù)量,減少服務(wù)器的負(fù)載,提高性能,使得復(fù)雜度降低、客戶端消耗減少,具有廣泛的的瀏覽器兼容性,幾乎除ie之外的瀏覽器均已支持,對(duì)于不支持eventsource的瀏覽器,可以使用polyfill實(shí)現(xiàn)。而且使用sse的方式比輪詢和長(zhǎng)輪詢的方法更高效實(shí)時(shí)。
1.一種基于sse的前端數(shù)據(jù)實(shí)時(shí)更新方法,其特征在于,該方法的實(shí)現(xiàn)包括以下步驟:
2.根據(jù)權(quán)利要求1所述的一種基于sse的前端數(shù)據(jù)實(shí)時(shí)更新方法,其特征在于,所述步驟1),具體實(shí)現(xiàn)如下:
3.根據(jù)權(quán)利要求2所述的一種基于sse的前端數(shù)據(jù)實(shí)時(shí)更新方法,其特征在于,所述步驟4),前端通過(guò)new?eventsource('/stock-price')創(chuàng)建一個(gè)eventsource對(duì)象,它與/stock-price路徑建立sse連接。
4.根據(jù)權(quán)利要求1或3所述的一種基于sse的前端數(shù)據(jù)實(shí)時(shí)更新方法,其特征在于,所述eventsource對(duì)象接收兩個(gè)參數(shù):url和options;
5.根據(jù)權(quán)利要求4所述的一種基于sse的前端數(shù)據(jù)實(shí)時(shí)更新方法,其特征在于,所述eventsource對(duì)象具有readystate屬性值:
6.根據(jù)權(quán)利要求1所述的一種基于sse的前端數(shù)據(jù)實(shí)時(shí)更新方法,其特征在于,所述步驟5),通過(guò)eventsource.onmessage定義接收數(shù)據(jù)的回調(diào)函數(shù),使用addeventlistener()方法來(lái)監(jiān)聽(tīng)事件;
7.根據(jù)權(quán)利要求1所述的一種基于sse的前端數(shù)據(jù)實(shí)時(shí)更新方法,其特征在于,后端通過(guò)建立sseemittermanger,統(tǒng)一管理當(dāng)前服務(wù)sse連接的創(chuàng)建、釋放以及數(shù)據(jù)推送。
8.根據(jù)權(quán)利要求1所述的一種基于sse的前端數(shù)據(jù)實(shí)時(shí)更新方法,其特征在于,開(kāi)啟sse連接接口的整個(gè)鏈路都支持長(zhǎng)連接。
9.一種基于sse的前端數(shù)據(jù)實(shí)時(shí)更新實(shí)現(xiàn)裝置,其特征在于,包括:至少一個(gè)存儲(chǔ)器和至少一個(gè)處理器;
10.一種計(jì)算機(jī)可讀介質(zhì),其特征在于,所述計(jì)算機(jī)可讀介質(zhì)上存儲(chǔ)有計(jì)算機(jī)指令,所述計(jì)算機(jī)指令在被處理器執(zhí)行時(shí),實(shí)現(xiàn)權(quán)利要求1至8任一項(xiàng)所述的方法。