日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
WebSocket在容器化管理平臺的應(yīng)用

WebSocket在容器化管理平臺的應(yīng)用

作者:佚名 2017-05-16 08:24:37

云計(jì)算 Websocket是一個持久化協(xié)議,相對于HTTP這種非持久協(xié)議而言。它實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工通信,能更好的節(jié)省服務(wù)器資源和帶寬并達(dá)到實(shí)時通訊的目的,與HTTP一樣基于已建立的TCP連接來傳輸數(shù)據(jù)。

介紹

Websocket是一個持久化協(xié)議,相對于HTTP這種非持久協(xié)議而言。它實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工通信,能更好的節(jié)省服務(wù)器資源和帶寬并達(dá)到實(shí)時通訊的目的,與HTTP一樣基于已建立的TCP連接來傳輸數(shù)據(jù)。但是與HTTP協(xié)議不同的地方就是:WebSocket是一種雙向通信協(xié)議,在建立連接后,WebSocket服務(wù)器端和客戶端都能主動向?qū)Ψ桨l(fā)送或接收數(shù)據(jù),就像Socket一樣;WebSocket需要像TCP一樣,先建立連接,連接成功后才能相互通信。

運(yùn)行機(jī)制

傳統(tǒng)的HTTP客戶端與服務(wù)器請求響應(yīng)模式,一個生命周期里只有一個或多個請求和一個或多個與之對應(yīng)的響應(yīng)。 如下所示:

而WebSocket模式下客戶端與服務(wù)器響應(yīng)模式,一旦WebSocket連接建立,在客戶端或者服務(wù)端中斷連接前,數(shù)據(jù)都以幀序列傳輸,不需要重啟客戶端或者服務(wù)端重新發(fā)起連接請求。

1.客戶端發(fā)起請求

  
 
 
 
  1. Request Method:GET
  2. Status Code:101 Switching Protocols #101之后的數(shù)據(jù)傳輸采用Websocket協(xié)議
  3. Connection:Upgrade
  4. Sec-WebSocket-Extensions:permessage-deflate;
  5. Sec-WebSocket-Key:dfQAy9mlQ0EjD5MmvvsZaQ== #驗(yàn)證
  6. Sec-WebSocket-Version:13
  7. Upgrade:websocket #客戶端支持websocket協(xié)議,如果服務(wù)器也支持就使用WebSocket協(xié)議

2.服務(wù)器解析,并返回握手信息,建立連接

  
 
 
 
  1. Connection:upgrade
  2. sec-websocket-accept:+mKC4huknIfMGJFOzclP9fO058g= #驗(yàn)證
  3. upgrade:websocket

3.傳輸數(shù)據(jù)(雙向)

4.斷開連接

應(yīng)用場景

WebSocket屬于Web領(lǐng)域的實(shí)時推送技術(shù),目的讓用戶不刷新瀏覽器就可以實(shí)時更新。其在容器化管理平臺里主要有兩個應(yīng)用場景類型,一個是實(shí)時消息類,將實(shí)時日志、業(yè)務(wù)監(jiān)控等相關(guān)信息推送給客戶端。如:在容器化管理平臺里部署了一個應(yīng)用,那么應(yīng)用部署的日志、運(yùn)行日志以及監(jiān)控信息如何及時推送到前端呢,另外一個就是交互消息類,在Web界面操作容器,節(jié)省手動登錄服務(wù)器進(jìn)入容器內(nèi)的時間,提高效率。

實(shí)例1:實(shí)時消息

就拿云幫而言,需要實(shí)時推送的是每個應(yīng)用的日志信息和業(yè)務(wù)監(jiān)控?cái)?shù)據(jù)。那么我們在處理實(shí)時消息時就采用了WebSocket與ZMQ相結(jié)合的方式,快速實(shí)現(xiàn)將應(yīng)用日志信息推送到web端。其簡化模型如下所示:

客戶端與服務(wù)器采用WebSocket協(xié)議,實(shí)時傳輸相關(guān)數(shù)據(jù)。相關(guān)數(shù)據(jù)方面采用的是ZMQ。云幫主要使用了ZeroMQ消息隊(duì)列中的Publisher-Subscriber模型,將所有相關(guān)信息匯總到一個節(jié)點(diǎn)上在推送到其他節(jié)點(diǎn)上。即客戶端(SUB)向服務(wù)器(PUB)訂閱消息,然后服務(wù)器將消息推送到所有訂閱了消息到客戶端,類似于廣播。之所以采用ZMQ,而不是Socket的原因,前者支持N:M的連接,后者只能1:1的連接。其消息隊(duì)列模型示意圖:

具體的應(yīng)用場景相關(guān)設(shè)定參數(shù):

  
 
 
 
  1. #docker-compose.yml
  2. mpush:
  3.   container_name: mpush
  4.   environment:
  5.   - ZMQ_SUB_FROM=tcp://ip:9242
  6.   image: hub.goodrain.com/dc-deploy/mpush
  7.   log_driver: json-file
  8.   log_opt:
  9.     max-size: 50m
  10.   ports:
  11.   - 0.0.0.0:6060:6060
  12.   restart: always
  13. #config.py 定義實(shí)時消息URL
  14. WEBSOCKET_URL = {
  15.     'cloudbang': 'ws://ip:6060/websocket',
  16. }
  17. #dalaran_docker
  18. ZMQ_BIND_SUB=tcp://0.0.0.0:9241
  19. ZMQ_BIND_PUB=tcp://0.0.0.0:9242
  20. ZMQ_BIND_PUB2=tcp://0.0.0.0:9243
  21. #setting
  22. 'docker_sub': {
  23.         'address': [
  24.             'tcp://ip:9242'
  25.         ],
  26.         'storage': '/data/docker_logs'
  27.     },

實(shí)例2:交互消息

GoTTY是一個用Go語言開發(fā)的工具,可以將操作系統(tǒng)的命令字符終端共享成普通的網(wǎng)頁應(yīng)用展示出來。 在mac安裝根據(jù)情況選擇一種

  
 
 
 
  1. #brew
  2. brew tap yudai/gotty
  3. brew install gotty
  4. #go
  5. go get github.com/yudai/gotty

使用:

  
 
 
 
  1. gotty -a 0.0.0.0 -p '8080' -w tmux

那么在云幫,我們又是如何解決這個問題的? 云幫web端操作容器就是基于gotty定制開發(fā)的WebSocket共享字符終端。 創(chuàng)建一個websocket實(shí)例,連接服務(wù)器進(jìn)行前后臺交互及相關(guān)事件處理

  
 
 
 
  1. #前端實(shí)現(xiàn)部分代碼
  2. var openWs = function() {
  3.         if(is_community == "True"){
  4.             host_name = window.location.hostname+":8188";
  5.         }
  6.         var url = tmp_url.replace("{{DOCKER_WSS_URL}}",host_name)
  7.         console.log(url)
  8.         var ws = new WebSocket(url);
  9.         var term;
  10.         var pingTimer;
  11.         ws.onopen = function(event) {
  12.             ws.send(JSON.stringify({ T_id: t_id, S_id: s_id, C_id: c_id, Md5: md5,}));
  13.             pingTimer = setInterval(sendPing, 30 * 1000, ws);
  14.             hterm.defaultStorage = new lib.Storage.Local();
  15.             hterm.defaultStorage.clear();
  16.             term = new hterm.Terminal();
  17.             term.getPrefs().set("send-encoding", "raw");
  18.             term.onTerminalReady = function() {
  19.                 var io = term.io.push();
  20.                 io.onVTKeystroke = function(str) {
  21.                     ws.send("0" + str);
  22.                 };
  23.                 io.sendString = io.onVTKeystroke;
  24.                 io.onTerminalResize = function(columns, rows) {
  25.                     ws.send(
  26.                         "2" + JSON.stringify(
  27.                             {
  28.                                 columns: columns,
  29.                                 rows: rows,
  30.                             }
  31.                         )
  32.                     )
  33.                 };
  34.                 term.installKeyboard();
  35.             };
  36.             term.decorate(document.getElementById("terminal"));
  37.         };

后端程序基于Gotty開發(fā)的。


當(dāng)前標(biāo)題:WebSocket在容器化管理平臺的應(yīng)用
文章出自:http://www.dlmjj.cn/article/dhdpcpg.html