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

栏目: 后端 · 发布时间: 7年前

内容简介:WebSocket在容器化管理平台的应用

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

介绍

Websocket是一个持久化协议,相对于HTTP这种非持久协议而言。它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的,与HTTP一样基于已建立的TCP连接来传输数据。但是与HTTP协议不同的地方就是:WebSocket是一种双向通信协议,在建立连接后,WebSocket服务器端和客户端都能主动向对方发送或接收数据,就像Socket一样;WebSocket需要像TCP一样,先建立连接,连接成功后才能相互通信。

运行机制

传统的HTTP客户端与服务器请求响应模式,一个生命周期里只有一个或多个请求和一个或多个与之对应的响应。 如下所示:

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

而WebSocket模式下客户端与服务器响应模式,一旦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在容器化管理平台的应用

客户端与服务器采用WebSocket协议,实时传输相关数据。相关数据方面采用的是ZMQ。云帮主要使用了ZeroMQ消息队列中的Publisher-Subscriber模型,将所有相关信息汇总到一个节点上在推送到其他节点上。即客户端(SUB)向服务器(PUB)订阅消息,然后服务器将消息推送到所有订阅了消息到客户端,类似于广播。之所以采用ZMQ,而不是Socket的原因,前者支持N:M的连接,后者只能1:1的连接。其消息队列模型示意图:

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

具体的应用场景相关设定参数:

#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' 
    }, 

实例2:交互消息

GoTTY是一个用 Go 语言开发的工具,可以将操作系统的命令字符终端共享成普通的网页应用展示出来。 在mac安装根据情况选择一种

#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 

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

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

那么在云帮,我们又是如何解决这个问题的? 云帮web端操作容器就是基于gotty定制开发的WebSocket共享字符终端。 创建一个websocket实例,连接服务器进行前后台交互及相关事件处理

#前端实现部分代码 
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开发的。


以上所述就是小编给大家介绍的《WebSocket在容器化管理平台的应用》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

网络共和国

网络共和国

[美] 凯斯·桑斯坦 / 黄维明 / 上海人民出版社 / 2003-6-1 / 15.00元

本书主要讨论网络中的民主问题。网络技术已经深刻地影响了我们的生活,我们随时可以获得我们需要的信息,我们也随时可以与别人联系,那么网络技术是不是就是民主的福音呢?作者回答说不,他认为通过网络人们更容易获得的是自己喜欢的信息,而拒绝接受自己不喜欢的信息,事实上人们得到的是窄化的信息,很多的网站也不和与自己立场相反的网站链接。而在一个真正的民主的环境中,信息应是多元的并且不是我们事先选择的,在其中我们还......一起来看看 《网络共和国》 这本书的介绍吧!

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具