簡介
由于最近接觸了socket.io方面的知識宝磨,了解到作為基于websocket進行封裝的socket.io疮绷,但是又不是完全基于websocket翰舌。在消息接受發(fā)送方面有很強的實時性,這個特性對于消息推送場景是很契合的冬骚,于是打算從這方面入手椅贱。
方案一
為了實現(xiàn)相互之間的解耦,以下分為幾個角色只冻,分別為主業(yè)務服務器(Server)庇麦、Socket.io通道管理服務器(Socket.io)、用戶(client)喜德。
首先山橄,是通過客戶端,就是client住诸,發(fā)送HTTP請求到Server上驾胆,比如說用戶輸入了用戶名和密碼,發(fā)送到服務端(Server)去進行驗證贱呐,驗證通過之后丧诺,Server發(fā)送成功的消息到socket.io處,將與client端的通信打開奄薇,實現(xiàn)消息的實時推送功能驳阎。但是在實現(xiàn)過程中的問題在于,由于要經(jīng)過http請求才能打開通信通道,在http方法里定義socket呵晚,此時消息從client到達Server速度很快蜘腌,但是在從sokcet.io到client的時候,速度變得很慢饵隙,原因目前未知撮珠,方案在原理上是說得通的,只是具體實現(xiàn)有困難金矛。
首先需要說明的是芯急,這個方案利用JWT(Json Web Token),客戶端先通過Server進行用戶名與密碼的驗證驶俊,通過之后娶耍,會給客戶端返回一個經(jīng)過加密的token,也就是jwt饼酿。之后榕酒,用戶訪問Server的一個url,其中需要bearToken才能進行訪問故俐,訪問之后想鹰,在其路由里定義相關動作,將成功訪問的消息發(fā)送至Socket.io處购披,將連接建立起來杖挣,此時的連接指的是socket.io和client之間的websocket連接
方案二
這個方案具體是通過socket.io中的命名空間來實現(xiàn)對于各個用戶的指定連接肩榕,利用第三方包socketio-auth來進行相關賬戶連接的認證刚陡,如果認證通過,則連接成功株汉,否則筐乳,失敗。但是由于這個方案socketio這部分和主業(yè)務服務器耦合度太高,無法實現(xiàn)socketio的重復利用。
具體情況是弧烤,在socket.io和client之間的連接已經(jīng)建立窘俺,但是沒有emit任何信息。socketio-auth里面具體的配置情況如下
socketioAuth(socket,{
authenticate: authenticate,
postAuthenticate: postAuthenticate,
timeout: 1500
})
首先先經(jīng)過authenticate磨确,如果驗證成功之后,再進入下一步,即postAuthenticate身隐,之后將驗證成功的用戶添加到socket.client.user中去,建立相關連接唯灵。如果驗證不成功贾铝,直接執(zhí)行disconnect來終止連接。
總而言之,整個流程走下來垢揩,先是在client和socketio處建立連接玖绿,但是這個連接沒有保障性,沒有發(fā)送任何信息叁巨。之后驗證成功之后斑匪,再通過用戶名建立一個更加私密的連接,也就是通過用戶名來創(chuàng)建namespace來建立連接锋勺,之后的消息發(fā)送以及監(jiān)聽走的均是這個私密的連接秤标。
方案三
為了達到解耦目的,以及免除方案一的繁瑣方案宙刘,目前的方案三的大致圖如下
首先苍姜,這里假設用戶是已經(jīng)經(jīng)過驗證過的用戶,用戶首先與Socket.io建立連接悬包,這個連接是客戶端連接到Socket.io的主域名上衙猪,連接之后,Client發(fā)送一個登陸消息布近,將自身的信息發(fā)送給Socket.io去保存垫释,目前只是簡單的在socket.io建立一個空的數(shù)組來保存這些信息,實際工程上應該保存在數(shù)據(jù)庫上撑瞧。連接成功之后棵譬。再進行下一步,即比如用戶觸發(fā)一個按鈕预伺,比如說點擊了購買的按鈕订咸,然后Server端通過這個按鈕綁定的事件,獲取點擊按鈕的用戶(Client)信息酬诀,將獲取到的tokenId以及點擊之后需要向用戶推送的信息脏嚷,經(jīng)過包裝之后,通過POST方式將信息發(fā)送至Socket.io服務端瞒御。之后父叙,Socket.io通過獲取到的具體tokenId。然后和保存的tokenId進行對比肴裙,如果有存在與之匹配的趾唱,就建立一對一映射關系的連接,將信息推送到客戶端(Client)蜻懦。
這樣一來甜癞,就能很好的將主要業(yè)務服務器Server和Socket.io分離開來,Socket.io就可以給不同的服務器之間共用阻肩。