WebSocket在容器化管理平台的應用

2021-09-23 09:10:42 字數 3949 閱讀 9316

介紹

websocket是乙個持久化協議,相對於http這種非持久協議而言。它實現了瀏覽器與伺服器全雙工通訊,能更好的節省伺服器資源和頻寬並達到實時通訊的目的,與http一樣基於已建立的tcp連線來傳輸資料。但是與http協議不同的地方就是:websocket是一種雙向通訊協議,在建立連線後,websocket伺服器端和客戶端都能主動向對方傳送或接收資料,就像socket一樣;websocket需要像tcp一樣,先建立連線,連線成功後才能相互通訊。

執行機制

傳統的http客戶端與伺服器請求響應模式,乙個生命週期裡只有乙個或多個請求和乙個或多個與之對應的響應。 如下所示:

而websocket模式下客戶端與伺服器響應模式,一旦websocket連線建立,在客戶端或者服務端中斷連線前,資料都以幀序列傳輸,不需要重啟客戶端或者服務端重新發起連線請求。

1.客戶端發起請求

request method:get 

status code:101 switching protocols #101之後的資料傳輸採用websocket協議 

connection

:upgrade 

sec-websocket-extensions:permessage-deflate; 

sec-websocket-key

:dfqay9mlq0ejd5mmvvszaq== #驗證 

sec-websocket-version:13 

upgrade:websocket #客戶端支援websocket協議,如果伺服器也支援就使用websocket協議 

2.伺服器解析,並返回握手資訊,建立連線

connection

:upgrade 

sec-websocket-accept:+mkc4huknifmgjfozclp9fo058g= #驗證 

upgrade:websocket 

3.傳輸資料(雙向)

4.斷開連線

應用場景

websocket屬於web領域的實時推送技術,目的讓使用者不重新整理瀏覽器就可以實時更新。其在容器化管理平台裡主要有兩個應用場景型別,乙個是實時訊息類,將實時日誌、業務監控等相關資訊推送給客戶端。如:在容器化管理平台裡部署了乙個應用,那麼應用部署的日誌、執行日誌以及監控資訊如何及時推送到前端呢,另外乙個就是互動訊息類,在web介面操作容器,節省手動登入伺服器進入容器內的時間,提高效率。

例項1:實時訊息

就拿雲幫而言,需要實時推送的是每個應用的日誌資訊和業務監控資料。那麼我們在處理實時訊息時就採用了websocket與zmq相結合的方式,快速實現將應用日誌資訊推送到web端。其簡化模型如下所示:

客戶端與伺服器採用websocket協議,實時傳輸相關資料。相關資料方面採用的是zmq。雲幫主要使用了zeromq訊息佇列中的publisher-subscriber模型,將所有相關資訊彙總到乙個節點上在推送到其他節點上。即客戶端(sub)向伺服器(pub)訂閱訊息,然後伺服器將訊息推送到所有訂閱了訊息到客戶端,類似於廣播。之所以採用zmq,而不是socket的原因,前者支援n:m的連線,後者只能1:1的連線。其訊息佇列模型示意圖:

具體的應用場景相關設定引數:

#config.py 定義實時訊息url 

websocket_url =  

#dalaran_docker 

zmq_bind_sub=tcp: 

zmq_bind_pub=tcp: 

zmq_bind_pub2=tcp: 

#setting 

'docker_sub'

: , 

例項2:互動訊息

gotty是乙個用go語言開發的工具,可以將作業系統的命令字元終端共享成普通的網頁應用展示出來。 在mac安裝根據情況選擇一種

使用:

gotty -a 0.0.0.0 -p 

那麼在雲幫,我們又是如何解決這個問題的? 雲幫web端操作容器就是基於gotty定製開發的websocket共享字元終端。 建立乙個websocket例項,連線伺服器進行前後臺互動及相關事件處理

#前端實現部分** 

var openws = function

()  

var url = tmp_url.replace

("}"

,host_name) 

console.log(url) 

var ws = new websocket(url); 

var term; 

var pingtimer; 

ws.onopen = function

(event) )); 

pingtimer = setinterval(sendping, 30 * 1000, ws); 

hterm.defaultstorage = new lib.storage.local

(); 

hterm.defaultstorage.clear(); 

term = new hterm.terminal(); 

term.getprefs().set

("send-encoding"

, "raw"

); term.onterminalready = function

() ; 

io.sendstring = io.onvtkeystroke; 

io.onterminalresize = function

(columns, 

rows

)  ) 

) }; 

term.installkeyboard(); 

}; term.decorate(document.getelementbyid("terminal"

)); 

}; 後端程式基於gotty開發的。

WebSocket在容器化管理平台的應用

介紹 websocket是乙個持久化協議,相對於http這種非持久協議而言。它實現了瀏覽器與伺服器全雙工通訊,能更好的節省伺服器資源和頻寬並達到實時通訊的目的,與http一樣基於已建立的tcp連線來傳輸資料。但是與http協議不同的地方就是 websocket是一種雙向通訊協議,在建立連線後,web...

在python中使用websocket

介紹一款很帥的外掛程式autobahnpython,通過它可以在python中很方便的使用websocket進行通訊 基於twisted框架 這個外掛程式真正強大的地方是它提供了乙個 發布 訂閱模式,具體內容有空再寫,先簡單介紹一下如何建立傳統的連線。建立伺服器 必須的模組 from twisted...

在WCF中使用websocket

今天在網上閒逛的時候,發現wcf4.5中新增了乙個nethttpbinding協議,它是支援websocket的。在網上找了一下教程,附上codeproject上的兩篇文章 其中第一篇文章是使用soap協議來封裝訊息的,實現了乙個基於websocket的雙工通訊程式。第二篇文章則是直接使用文本來通訊...