关于WebSocket在容器化管理平台的使用

    作者:课课家教育更新于: 2017-05-23 17:37:08

      欢迎各位阅读本篇文章,本篇文章讲述了关于WebSocket在容器化管理平台使用应用,web(World Wide Web)即全球广域网,也称为万维网,它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。

      介绍:

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

    关于WebSocket在容器化管理平台的使用_Docker_WebSocket_课课家教育

      运行机制:

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

    传统的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端。其简化模型如下所示:

    快速实现将应用日志信息推送到web端。其简化模型如下所示:

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

    之所以采用ZMQ,而不是Socket的原因,前者支持N:M的连接,后者只能1:1的连接。其消息队列模型示意图:

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

    #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 
    gotty -a 0.0.0.0 -p '8080' -w tmux
    那么在云帮,我们又是如何解决这个问题的?

      那么在云帮,我们又是如何解决这个问题的? 云帮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开发的。

      课外知识分享:web特点

      一、Web是图形化的和易于导航的(navigate):

      Web 非常流行的一个很重要的原因就在于它可以在一页上同时显示色彩丰富的图形和文本的性能。在Web之前Internet上的信息只有文本形式。Web可以提供将图形、音频、视频信息集合于一体的特性。同时,Web是非常易于导航的,只需要从一个连接跳到另一个连接,就可以在各页各站点之间进行浏览了。

      二、Web与平台无关:

      无论你的系统平台是什么,你都可以通过Internet访问WWW。浏览WWW对你的系统平台没有什么限制。无论从Windows平台、UNIX平台、Macintosh还是别的什么平台我们都可以访问WWW。对WWW的访问是通过一种叫做浏览器(browser)的软件实现的。如Netscape 的Navigator、NCSA的Mosaic、Microsoft的Explorer等。

      三、Web是分布式的:

      大量的图形、音频和视频信息会占用相当大的磁盘空间,我们甚至无法预知信息的多少。对于Web没有必要把所有信息都放在一起,信息可以放在不同的站点上。只需要在浏览器中指明这个站点就可以了。使在物理上并不一定在一个站点的信息在逻辑上一体化,从用户来看这些信息是一体的。

      四、Web 是动态的:

      最后,由于各Web站点的信息包含站点本身的信息,信息的提供者可以经常对站上的信息进行更新。如某个协议的发展状况,公司的广告等等。一般各信息站点都尽量保证信息的时间性。所以Web站点上的信息是动态的。经常更新的。这一点是由信息的提供者保证的。

      五、Web是交互的:

      Web的交互性首先表现在它的超连接上,用户的浏览顺序和所到站点完全由他自己决定。另外通过FORM的形式可以从服务器方获得动态的信息。用户通过填写FORM可以向服务器提交请求,服务器可以根据用户的请求返回相应信息。

      小结:相信最后大家阅读完毕本篇文章后,学到了不少知识吧?其实关于相关方面的内容,大家私下还得多多自学,当然如果大家还想了解更多相关方面内容的话呢,课课家教育平台欢迎大家咨询哦~

课课家教育

未登录