WebHooks
定義
? Webhook一個web自定義回調(diào)函數(shù),當(dāng)程序發(fā)生警報行為時,會自動回調(diào)調(diào)用指定的url。webhook的回調(diào)url可以是第三方應(yīng)用,可以是webhook內(nèi)應(yīng)用。
? 在Webhook范式下,服務(wù)器更新所需提供的資源,然后自動將其作為更新發(fā)送到客戶端(服務(wù)器是在推數(shù)據(jù)),客戶端不是請求者,而是被動接收方。這種控制關(guān)系的反轉(zhuǎn)可以用來促進(jìn)許多原本需要在遠(yuǎn)程服務(wù)器上進(jìn)行更復(fù)雜的請求和不斷的輪詢的通信請求。
使用
? 消費一個webhook是為webhook準(zhǔn)備一個URL,用于webhook發(fā)送請求。這些通常由后臺頁面和或者API完成。這就意味你的應(yīng)用要設(shè)置一個通過公網(wǎng)可以訪問的URL。
? 多數(shù)webhook以兩種數(shù)據(jù)格式發(fā)布數(shù)據(jù):JSON或者XML,這需要解釋。另一種數(shù)據(jù)格式是application/x-www-form-urlencoded or multipart/form-data。這兩種方式都很容易解析,并且多數(shù)的Web應(yīng)用架構(gòu)都可以做這部分工作。
適用場景
? 高安全的支付、微信登錄(OAuth)、資源同步、資源創(chuàng)建與更新、耗時較長。
? 例A:
? 你需要向視頻處理服務(wù)器上傳一個視頻、你需要獲得視頻處理后的結(jié)果,然而視頻處理服務(wù)器上視頻很多,在排隊進(jìn)行處理,你不能立刻獲取到視頻的處理結(jié)果,此時你可以設(shè)計一個hook url,當(dāng)視頻處理完成后,視頻處理服務(wù)器自動向你的hook url發(fā)送請求,告訴你視頻已經(jīng)處理完畢。
? 例B:
? 你的好友發(fā)了一條朋友圈,后端將這條消息推送給所有其他好友的客戶端,就是 Webhooks 的典型場景。
安全性
? 由于webhook會向公網(wǎng)上的hook url發(fā)送數(shù)據(jù),這就意味著某些不好心的人可能會找到這個url,從而進(jìn)行發(fā)送錯誤的數(shù)據(jù),但是我們可以通過以下一些技術(shù)手段來解決這個問題:
增加token機制
增加auth認(rèn)證
只接收對應(yīng)服務(wù)端domain或IP請求
數(shù)據(jù)簽名
需要注意問題
當(dāng)服務(wù)提供者通過web hook將數(shù)據(jù)發(fā)送你的服務(wù)端后,就不會再去關(guān)注這些數(shù)據(jù)。假設(shè)你的服務(wù)端此時出現(xiàn)了崩潰,或者無法請求成功等原因,就需要主動去嘗試請求數(shù)據(jù)。
webhook會發(fā)出大量的請求,可能會造成你的應(yīng)用阻塞,在此需要確保你的應(yīng)用能夠處理好這些請求
WebSocket
定義
? WebSocket是一種在單個TCP連接上進(jìn)行全雙工通信的協(xié)議。WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡單,允許服務(wù)端主動向客戶端推送數(shù)據(jù)。在WebSocket API中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進(jìn)行雙向數(shù)據(jù)傳輸。
使用
? 安全的WebSocket連接機制和HTTPS類似。首先,瀏覽器用wss://xxx創(chuàng)建WebSocket連接時,會先通過HTTPS創(chuàng)建安全的連接,然后,該HTTPS連接升級為WebSocket連接,底層通信走的仍然是安全的SSL/TLS協(xié)議。
瀏覽器: 很顯然,要支持WebSocket通信,瀏覽器得支持這個協(xié)議,這樣才能發(fā)出ws://xxx的請求。目前,支持WebSocket的主流瀏覽器如下:
- Chrome
- Firefox
- IE >= 10
- Sarafi >= 6
- Android >= 4.4
- iOS >= 8
服務(wù)器: 由于WebSocket是一個協(xié)議,服務(wù)器具體怎么實現(xiàn),取決于所用編程語言和框架本身。Node.js本身支持的協(xié)議包括TCP協(xié)議和HTTP協(xié)議,要支持WebSocket協(xié)議,需要對Node.js提供的HTTPServer做額外的開發(fā)。已經(jīng)有若干基于Node.js的穩(wěn)定可靠的WebSocket實現(xiàn),我們直接用npm安裝使用即可。
適用場景
? 社交聊天、多玩家游戲、協(xié)同編輯/編程、股票基金實時報價、體育實況更新、視頻會議/聊天、基于位置的應(yīng)用、在線教育、智能家居
安全性
其他
從零理解WebSocket的通信原理、協(xié)議格式、安全性
SSE(Server-sent Events)]
定義
所謂SSE(Sever-Sent Event),就是瀏覽器向服務(wù)器發(fā)送一個HTTP請求,保持長連接,服務(wù)器不斷單向地向瀏覽器推送“信息”(message),這么做是為了節(jié)約網(wǎng)絡(luò)資源,不用一直發(fā)請求,建立新連接。sse是單向的,只能由服務(wù)端往客戶端發(fā)。
它和WebSocket的區(qū)別:
- 便利,不需要添加任何新組件,用任何習(xí)慣的后端語言和框架就能繼續(xù)使用,不用為新建虛擬機弄一個新的IP或新的端口號而勞神。
- 服務(wù)器端的簡潔。因為SSE能在現(xiàn)有的HTTP/HTTPS協(xié)議上運作,所以它能夠直接運行于現(xiàn)有的代理服務(wù)器和認(rèn)證技術(shù)。
- 單向連接。只能單工通信,建立連接后,只能由服務(wù)端發(fā)往客戶端,且占用一個連接,如需客戶端向服務(wù)端通信,需額外打開一個連接。
WebSocket相較SSE最大的優(yōu)勢在于它是雙向交流的,這意味著服務(wù)器發(fā)送數(shù)據(jù)就像從服務(wù)器接受數(shù)據(jù)一樣簡單,而SSE一般通過一個獨立的Ajax請求從客戶端向服務(wù)端傳送數(shù)據(jù),因此相對于WebSocket使用Ajax會增加開銷。因此,如果需要以每秒一次或者更快的頻率向服務(wù)端傳輸數(shù)據(jù),就應(yīng)該用WebSocket。
使用
SSE并沒有在微軟的IE和Edge瀏覽器上實現(xiàn),但可引入第三方庫實現(xiàn)。
瀏覽器兼容性:Firefox 6.0+、Chrome 6.0+、Safari 5.0+、Opera 11.0+、iOS Safari 4.0+、Opera Mobile 11.1+、Chrome for Android 25.0+、Firefox for Android 19.0+ 以及 Blackberry Browser 7.0+ 等。
適用場景
簡單來說,SSE適用于更新頻繁、低延遲并且數(shù)據(jù)都是從服務(wù)端到客戶端。
實時更新數(shù)據(jù):比如網(wǎng)頁上股票價格的更新,假設(shè)每秒鐘要更新一次,如果用輪詢的方法那我們每秒鐘就要發(fā)送一次http請求,而用SSE,客戶端發(fā)了一次請求以后,服務(wù)器就不斷推送消息,客戶端只需接收就可以了。
新消息推送:比如有新的通知、新的訂單就能第一時間推送給客戶端。