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

介绍

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

运行机制

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

而WebSocket模式下客户端与服务器响应模式,一旦WebSocket连接建立,在客户端或者服务端中断连接前,数据都以帧序列传输,不需要重启客户端或者服务端重新发起连接请求。

1.客户端发起请求


  1. Request Method:GET 
  2. Status Code:101 Switching Protocols #101之后的数据传输采用Websocket协议 
  3. Connection:Upgrade 
  4. Sec-WebSocket-Extensions:permessage-deflate; 
  5. Sec-WebSocket-Key:dfQAy9mlQ0EjD5MmvvsZaQ== #验证 
  6. Sec-WebSocket-Version:13 
  7. Upgrade:websocket #客户端支持websocket协议,如果服务器也支持就使用WebSocket协议 

2.服务器解析,并返回握手信息,建立连接


  1. Connection:upgrade 
  2. sec-websocket-accept:+mKC4huknIfMGJFOzclP9fO058g= #验证 
  3. upgrade:websocket 

3.传输数据(双向)

4.断开连接

应用场景

WebSocket属于Web领域的实时推送技术,目的让用户不刷新浏览器就可以实时更新。其在容器化管理平台里主要有两个应用场景类型,一个是实时消息类,将实时日志、业务监控等相关信息推送给客户端。如:在容器化管理平台里部署了一个应用,那么应用部署的日志、运行日志以及监控信息如何及时推送到前端呢,另外一个就是交互消息类,在Web界面操作容器,节省手动登录服务器进入容器内的时间,提高效率。

实例1:实时消息

就拿云帮而言,需要实时推送的是每个应用的日志信息和业务监控数据。那么我们在处理实时消息时就采用了WebSocket与ZMQ相结合的方式,快速实现将应用日志信息推送到web端。其简化模型如下所示:

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

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


  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.  
  14. #config.py 定义实时消息URL 
  15. WEBSOCKET_URL = { 
  16.     'cloudbang': 'ws://ip:6060/websocket', 
  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.     }, 

实例2:交互消息

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


  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定制开发的WebSocket共享字符终端。 创建一个websocket实例,连接服务器进行前后台交互及相关事件处理


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

本文作者:佚名

来源:51CTO

时间: 2024-07-28 12:59:26

WebSocket在容器化管理平台的应用的相关文章

DockOne微信分享(九十九):海航生态科技舆情大数据平台容器化改造

本文讲的是DockOne微信分享(九十九):海航生态科技舆情大数据平台容器化改造[编者的话]海航舆情监控系统能够为海航集团内部提供监控网络舆情信息,对负面信息.重大舆情及时预警,研判具体舆情或者某一舆情专题事件的发展变化趋势,生成图标报告和各种统计数据,提高舆情工作效率和辅助领导决策.然而,随着项目的持续运行,许多问题逐渐暴露出来,为了解决这些难题,对整个项目重新规划设计,迁移到Hadoop.Spark大数据平台,引进持续化Docker容器部署和发布,开发和运营效率得到显著提升. 一. 舆情平台

使用 Kubernetes 管理容器化的有状态应用

  编者按:本文转载自"才云 Caicloud",作者 Josh Berkus. 目前,几乎所有关于容器和微服务的谈论都跟"无状态"的应用挂钩.这完全可以理解,因为无状态应用程序更简单.而且容器和编排技术已经成熟到能够承工作负载的程度:即有状态的应用. Kubernetes 是一个用于自动部署.扩展和管理容器化应用程序的开源系统,我之前做过两次关于 Kubernetes.数据库以及容器的演讲. 什么是"无状态"应用? 无状态服务,即 Web 服务

DC/OS 1.10:一个面向容器化未来的平台

本文讲的是DC/OS 1.10:一个面向容器化未来的平台[译者的话]本文介绍了Mesosphere平台即将推出的最新版本的特性,创造性地引入了Kubernetes作为容器编排引擎,作为面向容器化的未来的一个平台,值得期待. [烧脑式Kubernetes实战训练营]本次培训理论结合实践,主要包括:Kubernetes架构和资源调度原理.Kubernetes DNS与服务发现.基于Kubernetes和Jenkins的持续部署方案 .Kubernetes网络部署实践.监控.日志.Kubernetes

web界面管理平台shipyard管理docker容器

用shipyard来管理docker docker多了之后就得需要个管理工具来整合和管理,shipyard是个不错的选择docker的管理工具用docker运行起来就行,简单步骤如下:起一个RethinkDB的data volume实例: docker run -it -d --name shipyard-rethinkdb-data \    --entrypoint /bin/bash shipyard/rethinkdb -l 用刚才创建的data volume再起一个rethinkdb实

海航生态科技舆情大数据平台容器化改造

文章介绍了海航生态科技舆情大数据平台的容器化改造经验,包括初期技术架构.应用容器化.架构迁移.持续发布与部署. 海航舆情监控系统能够为海航集团内部提供监控网络舆情信息,对负面信息.重大舆情及时预警,研判具体舆情或者某一舆情专题事件的发展变化趋势,生成图标报告和各种统计数据,提高舆情工作效率和辅助领导决策.然而,随着项目的持续运行,许多问题逐渐暴露出来,为了解决这些难题,对整个项目重新规划设计,迁移到Hadoop.Spark大数据平台,引进持续化Docker容器部署和发布,开发和运营效率得到显著提

linux下安装Rancher Docker容器管理平台

Rancher Labs 公司目前有2个产品. Rancher Docker容器管理平台 RancherOS 一种适合Docker运行的Linux发行版,类似于CoreOS Rancher Docker容器管理平台 如果说原生的Docker是一个一个集装箱,Rancher可以比喻成集装箱船,平台化管控,带着应用航行. rancher 承载 docker Docker环境安装 以下是在CentOS7的环境下安装Rancher Docker官方安装方式 curl -sSL https://get.d

2009平台化管理软件实施之道圆桌论坛 11月19号

问题描述 不少企业的CIO在部署信息化管理软件的时候,一开始都是兴致勃勃,但是到信息化项目进展到一定程度的时候,却发现信息化管理软件没有取得像他们预期那样的效果,于是处于无法向CEO交待的尴尬处境.那么为什么会造成这种情况呢?这里面的因素有很多,其中技术因素是最根本的一点. 2009平台化管理软件实施之道圆桌论坛与您共同分析企业管理软件实施高失败率的技术因素是什么?带您走进应用软件开发平台的世界,让您了解配置化.平台化是如何化解管理软件开发困境的,并与您交流企业管理软件应用开发平台的实施落地之道

DockOne微信分享(一一七):沪江容器化运维实践

本文讲的是DockOne微信分享(一一七):沪江容器化运维实践[编者的话]沪江目前容器技术主要应用场景:OCS课件业务无状态应用:基于Apache Mesos+Marathon实现沪江容器系统调度管理:Consul + Consul Template + Nginx实现服务自动发现和注册:Prometheus + Grafana + Alertmanager报警实现容器监控报警.本次分享将从以下几方面来讲解: 选择容器技术缘由 容器技术选型 容器存储 容器网络 监控报警 镜像管理 调度管理 服务

Pinterest的容器化实践经验

本文讲的是Pinterest的容器化实践经验[编者的话]本文介绍了Pinterest向容器化平台转型的实践和经验. Pinterest堪称图片版的Twitter,网民可以将感兴趣的图片在Pinterest保存,其他网友可以关注,也可以转发图片. 过去的一年里,Pinterest云管理平台和站点可靠性工程团队关注于将工作负载从EC2实例迁移到Docker容器上.到目前为止,我们已经迁移了超过一半的无状态服务,包括所有的API fleet.该博文给大家分享整个过程中我们的经历和收获. 最近这些年里,