websocket入門案例: 構(gòu)建微信掃小程序碼登錄系統(tǒng)

websocket入門案例: 構(gòu)建微信掃小程序碼登錄系統(tǒng)

概覽

WebSocket 想必各位前后端開發(fā)都不陌生 , 這種基于TCP的全雙工通信協(xié)議,比起 HTTP long-polling(長輪詢) 來說控制開銷少,實(shí)時性強(qiáng)闷愤。它通過 HTTP/1.1 協(xié)議的101狀態(tài)碼進(jìn)行握手随闽。所以我們使用 nginx 這類來處理它的時候,需要配置協(xié)議升級肝谭,到 HTTP/1.1版本。

而為了創(chuàng)建Websocket連接蛾扇,我們通過客戶端發(fā)出請求攘烛,之后服務(wù)器進(jìn)行回應(yīng),這個過程通常稱為 handshaking镀首。

案例

微信掃碼登錄坟漱,想必各位大家都不陌生,這個被廣泛應(yīng)用到了社會各個場景更哄。

同時還衍生出了芋齿,微信掃公眾號二維碼登錄微信掃小程序碼登錄 , 這些本質(zhì)上原理也都大差不差腥寇。

本文就借著 微信掃小程序碼登錄 ,這個場景來簡單聊聊 websocket 的應(yīng)用觅捆。

方案概括

簡單概括一下赦役,用戶訪問某個網(wǎng)站, 此時 瀏覽器(ClientA) 和 WS Server 之間建立了一個長鏈接, Server 給這個長鏈接頒發(fā)了一個 id (記為 idA) 。

ClientA 向服務(wù)端發(fā)送 idA 來請求小程序碼栅炒,服務(wù)端接收后掂摔,調(diào)用 wxacode.getUnlimited , 把小程序碼生成出來,此小程序碼的 page 參數(shù) 為 小程序內(nèi)的websocket登錄頁面 (例如 pages/index/wsLogin), 場景值參數(shù) sceneidA赢赊。 生成后返回給回ClientA乙漓。

接下來,用戶獲取小程序碼后释移,使用微信掃碼叭披,就進(jìn)入了我們小程序 (ClientB) 中的 pages/index/wsLogin 頁面,同時通過場景值(scene)玩讳,拿到了 idA涩蜘。

[圖片上傳失敗...(image-869b2f-1634381348413)]

用戶點(diǎn)擊確認(rèn)登錄,我們小程序這里锋边,就會向服務(wù)端發(fā)送一個觸發(fā)事件(可以是ws或者http觸發(fā))皱坛,這個事件用大白話描述一下就是:
小程序這里告訴服務(wù)端 用戶微信信息xxx來驗(yàn)證登錄,同時登錄成功之后豆巨,我要向 idA 那個 socket 發(fā)送一個登錄成功的事件剩辟,反之則發(fā)送未注冊事件。

瀏覽器(ClientA)往扔,檢測到這個服務(wù)端推送事件后贩猎,就能夠從服務(wù)端獲取 token,登錄并實(shí)時進(jìn)行頁面跳轉(zhuǎn)了萍膛。

是不是本質(zhì)上非常簡單 吭服?

當(dāng)然這些作為一個 demo 來說已經(jīng)夠了, 要構(gòu)建一個高可用的遠(yuǎn)遠(yuǎn)不止。

數(shù)據(jù)交互圖

客戶端單項(xiàng)通信(掃碼登錄場景)

客戶端單項(xiàng)通信

客戶端雙向通信(聊天室IM場景)

客戶端雙向通信

(eg. 這只是最簡易的場景蝗罗,真實(shí)情況要復(fù)雜許多)

代碼實(shí)現(xiàn)

demo 為了方便艇棕, ws server 為單例,所有的 socket 實(shí)例保存在內(nèi)存中串塑。

共有三個端沼琉,web , mp , server

demo

另一種思路

在上面這個示例中,我們給每個從客戶端連接的 ws 請求 頒發(fā)了一個 id, 然后把它藏入小程序碼的參數(shù)里桩匪,這樣由于發(fā) id 這個機(jī)制默認(rèn)是無序的打瘪,我們比較難做緩存,萬一依賴的第三方服務(wù) 宕機(jī),或者 運(yùn)行緩慢闺骚,勢必影響我們自身的服務(wù)彩扔。那么有沒有辦法,減小這樣的不確定性因素呢僻爽?

筆者曾經(jīng)做過一個方案:

更改指定一個 socket.to namespace 里的發(fā)號規(guī)則虫碉,改為 0-999 , 然后先預(yù)制 參數(shù)為 0-999 的小程序碼共 1000 張, 把他們上傳同步到 CDN 去,并且在數(shù)據(jù)庫中記錄下他們的 id, CDN url , 這樣用戶訪問 web 端登錄頁面時进泼,發(fā)現(xiàn)是這個 namespace 的規(guī)則蔗衡,就按照順序,給一個沒有被占用的 id乳绕。 假設(shè)為 10 (之前9位還在保持連接)绞惦。

那么它對應(yīng)的小程序碼,就可以通過 getMpQrcodeById 這樣的方式洋措,從自己數(shù)據(jù)庫中取出鏈接济蝉,把二維碼展示在頁面上,同時 用戶通過微信掃碼后登錄菠发,也可以進(jìn)行 client 之間 點(diǎn)對點(diǎn) 的通訊王滤。

不過在用戶量大的時候,有可能會遇到 碼不夠用的情況滓鸠,這種建議可以先預(yù)先估計(jì)用戶數(shù)量生碼雁乡,或者構(gòu)建一個 job 檢測發(fā)碼數(shù)量,實(shí)時生碼糜俗,插入數(shù)據(jù)庫踱稍,上傳CDN,并刷新 ws 發(fā)號規(guī)則悠抹。

擴(kuò)展后如圖所示:

qrcode-ws-with-less-third

擴(kuò)展閱讀

多實(shí)例模式

在多進(jìn)程或者集群下如何處理呢珠月? 比如 ClientAServerA, ClientBServer B ,他們這 2Client 之間要如何進(jìn)行通信呢?

  1. 一種還是以單例網(wǎng)關(guān)的形式楔敌,構(gòu)建一個注冊中心負(fù)責(zé)統(tǒng)一的收發(fā)調(diào)度啤挎,然后把邏輯運(yùn)算交給其他的運(yùn)算服務(wù)去做。
  2. 另一種是構(gòu)建一套 發(fā)布/訂閱機(jī)制 (比如 redisPub/Sub mechanism) , 來保證多個 ws 服務(wù)卵凑,可以進(jìn)行相互通信庆聘。

協(xié)議對應(yīng):

http -> ws
https -> wss

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市勺卢,隨后出現(xiàn)的幾起案子掏觉,更是在濱河造成了極大的恐慌,老刑警劉巖值漫,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異织盼,居然都是意外死亡杨何,警方通過查閱死者的電腦和手機(jī)酱塔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來危虱,“玉大人羊娃,你說我怎么就攤上這事“u危” “怎么了蕊玷?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長弥雹。 經(jīng)常有香客問我垃帅,道長,這世上最難降的妖魔是什么剪勿? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任贸诚,我火速辦了婚禮,結(jié)果婚禮上厕吉,老公的妹妹穿的比我還像新娘酱固。我一直安慰自己,他們只是感情好头朱,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布运悲。 她就那樣靜靜地躺著,像睡著了一般项钮。 火紅的嫁衣襯著肌膚如雪班眯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天寄纵,我揣著相機(jī)與錄音鳖敷,去河邊找鬼。 笑死程拭,一個胖子當(dāng)著我的面吹牛定踱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播恃鞋,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼崖媚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了恤浪?” 一聲冷哼從身側(cè)響起畅哑,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎水由,沒想到半個月后荠呐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年泥张,在試婚紗的時候發(fā)現(xiàn)自己被綠了呵恢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡媚创,死狀恐怖渗钉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钞钙,我是刑警寧澤鳄橘,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站芒炼,受9級特大地震影響瘫怜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜焕议,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一宝磨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盅安,春花似錦唤锉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蝙寨,卻和暖如春晒衩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背墙歪。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工听系, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人虹菲。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓靠胜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親毕源。 傳聞我的和親對象是個殘疾皇子浪漠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345