您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何進行WebSocket在容器化管理平臺的應(yīng)用,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
Websocket是一個持久化協(xié)議,相對于HTTP這種非持久協(xié)議而言。它實現(xiàn)了瀏覽器與服務(wù)器全雙工通信,能更好的節(jié)省服務(wù)器資源和帶寬并達到實時通訊的目的,與HTTP一樣基于已建立的TCP連接來傳輸數(shù)據(jù)。但是與HTTP協(xié)議不同的地方就是:WebSocket是一種雙向通信協(xié)議,在建立連接后,WebSocket服務(wù)器端和客戶端都能主動向?qū)Ψ桨l(fā)送或接收數(shù)據(jù),就像Socket一樣;WebSocket需要像TCP一樣,先建立連接,連接成功后才能相互通信。
傳統(tǒng)的HTTP客戶端與服務(wù)器請求響應(yīng)模式,一個生命周期里只有一個或多個請求和一個或多個與之對應(yīng)的響應(yīng)。 如下所示:
而WebSocket模式下客戶端與服務(wù)器響應(yīng)模式,一旦WebSocket連接建立,在客戶端或者服務(wù)端中斷連接前,數(shù)據(jù)都以幀序列傳輸,不需要重啟客戶端或者服務(wù)端重新發(fā)起連接請求。
客戶端發(fā)起請求
Request Method:GET Status Code:101 Switching Protocols #101之后的數(shù)據(jù)傳輸采用Websocket協(xié)議 Connection:Upgrade Sec-WebSocket-Extensions:permessage-deflate; Sec-WebSocket-Key:dfQAy9mlQ0EjD5MmvvsZaQ== #驗證 Sec-WebSocket-Version:13 Upgrade:websocket #客戶端支持websocket協(xié)議,如果服務(wù)器也支持就使用WebSocket協(xié)議
服務(wù)器解析,并返回握手信息,建立連接
Connection:upgrade sec-websocket-accept:+mKC4huknIfMGJFOzclP9fO058g= #驗證 upgrade:websocket
傳輸數(shù)據(jù)(雙向)
斷開連接
WebSocket屬于Web領(lǐng)域的實時推送技術(shù),目的讓用戶不刷新瀏覽器就可以實時更新。其在容器化管理平臺里主要有兩個應(yīng)用場景類型,一個是實時消息類,將實時日志、業(yè)務(wù)監(jiān)控等相關(guān)信息推送給客戶端。如:在容器化管理平臺里部署了一個應(yīng)用,那么應(yīng)用部署的日志、運行日志以及監(jiān)控信息如何及時推送到前端呢,另外一個就是交互消息類,在Web界面操作容器,節(jié)省手動登錄服務(wù)器進入容器內(nèi)的時間,提高效率。
就拿云幫而言,需要實時推送的是每個應(yīng)用的日志信息和業(yè)務(wù)監(jiān)控數(shù)據(jù)。那么我們在處理實時消息時就采用了WebSocket與ZMQ相結(jié)合的方式,快速實現(xiàn)將應(yīng)用日志信息推送到web端。其簡化模型如下所示: 客戶端與服務(wù)器采用WebSocket協(xié)議,實時傳輸相關(guān)數(shù)據(jù)。相關(guān)數(shù)據(jù)方面采用的是ZMQ。云幫主要使用了ZeroMQ消息隊列中的Publisher-Subscriber模型,將所有相關(guān)信息匯總到一個節(jié)點上在推送到其他節(jié)點上。即客戶端(SUB)向服務(wù)器(PUB)訂閱消息,然后服務(wù)器將消息推送到所有訂閱了消息到客戶端,類似于廣播。之所以采用ZMQ,而不是Socket的原因,前者支持N:M的連接,后者只能1:1的連接。
具體的應(yīng)用場景相關(guān)設(shè)定參數(shù):
#docker-compose.yml mpush: container_name: mpush environment: - ZMQ_SUB_FROM=tcp://ip:9242 image: hub.goodrain.com/dc-deploy/mpush log_driver: json-file log_opt: max-size: 50m ports: - 0.0.0.0:6060:6060 restart: always #config.py 定義實時消息URL WEBSOCKET_URL = { 'cloudbang': 'ws://ip:6060/websocket', } #dalaran_docker ZMQ_BIND_SUB=tcp://0.0.0.0:9241 ZMQ_BIND_PUB=tcp://0.0.0.0:9242 ZMQ_BIND_PUB2=tcp://0.0.0.0:9243 #setting 'docker_sub': { 'address': [ 'tcp://ip:9242' ], 'storage': '/data/docker_logs' },
GoTTY是一個用Go語言開發(fā)的工具,可以將操作系統(tǒng)的命令字符終端共享成普通的網(wǎng)頁應(yīng)用展示出來。 在mac安裝根據(jù)情況選擇一種
#brew brew tap yudai/gotty brew install gotty #go go get github.com/yudai/gotty
使用:
gotty -a 0.0.0.0 -p '8080' -w tmux
那么在云幫,我們又是如何解決這個問題的? 云幫web端操作容器就是基于gotty定制開發(fā)的WebSocket共享字符終端。 創(chuàng)建一個websocket實例,連接服務(wù)器進行前后臺交互及相關(guān)事件處理
#前端實現(xiàn)部分代碼 var openWs = function() { if(is_community == "True"){ host_name = window.location.hostname+":8188"; } var url = tmp_url.replace("{{DOCKER_WSS_URL}}",host_name) console.log(url) var ws = new WebSocket(url); var term; var pingTimer; ws.onopen = function(event) { ws.send(JSON.stringify({ T_id: t_id, S_id: s_id, C_id: c_id, Md5: md5,})); 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() { var io = term.io.push(); io.onVTKeystroke = function(str) { ws.send("0" + str); }; io.sendString = io.onVTKeystroke; io.onTerminalResize = function(columns, rows) { ws.send( "2" + JSON.stringify( { columns: columns, rows: rows, } ) ) }; term.installKeyboard(); }; term.decorate(document.getElementById("terminal")); };
后端程序基于Gotty開發(fā)的。
關(guān)于如何進行WebSocket在容器化管理平臺的應(yīng)用就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。