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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:

介绍

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.                                 rowsrows
  30.                             } 
  31.                         ) 
  32.                     ) 
  33.                 }; 
  34.                 term.installKeyboard(); 
  35.             }; 
  36.             term.decorate(document.getElementById("terminal")); 
  37.         }; 

后端程序基于Gotty开发的。


本文作者:佚名

来源:51CTO

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3月前
|
存储 Kubernetes 监控
Kubernetes快速进阶与实战:构建可靠的容器化应用平台
Kubernetes快速进阶与实战:构建可靠的容器化应用平台
92 0
|
6天前
|
监控 小程序 前端开发
小程序全栈开发中的WebSocket实时通信实践
【4月更文挑战第12天】本文探讨了小程序全栈开发中WebSocket实时通信的实践,WebSocket作为实现双向实时通信的协议,其长连接特性和双向通信能力在实时聊天、推送、游戏和监控等场景中发挥关键作用。开发者需注意安全性、性能和兼容性问题,以优化用户体验并确保小程序稳定运行。通过掌握WebSocket,开发者能提升小程序的功能性和用户体验。
|
6月前
|
安全 Java 编译器
使用 gRPC 构建高效可靠的微服务
在现代分布式系统中,构建高效可靠的微服务是一项关键任务。gRPC(Google Remote Procedure Call)提供了一种强大而灵活的方式来实现跨语言和跨平台的通信。本文将介绍 gRPC 的基本概念、架构以及其在构建微服务时的优势。
371 0
|
8月前
|
消息中间件 负载均衡 监控
在Linux服务器上安装EMQX平台:构建高性能的开源物联网消息中间件
EMQX是一个开源的物联网消息中间件平台,提供高性能、高可用性的MQTT和CoAP协议支持,适用于大规模物联网应用场景。本文将详细介绍在Linux服务器上安装EMQ X平台的步骤,帮助开发者快速搭建功能强大的物联网消息中间件。
2141 1
|
10月前
|
存储 资源调度 Kubernetes
Web开发者的云原生指南(3)容器编排与管理
本节将深入介绍容器编排和管理工具 Kubernetes 的使用。我们将逐步了解 Kubernetes 的简介和架构,如何安装和配置 Kubernetes,以及在 Kubernetes 集群上部署应用程序。此外,我们还会详细讨论 Kubernetes 的核心概念,包括 Pod、Deployment、Service,以及资源调度和伸缩、监控和日志管理,以及网络和存储管理。
271 1
|
SQL 人工智能 Kubernetes
微软为容器扩展 Azure 服务组合,发展基于微服务的云原生应用程序
在Microsoft Build 2022大会上,微软宣布基于 Kubernetes 的无服务器计算框架Azure Container Apps已全面上线。
151 0
|
机器学习/深度学习 Cloud Native 安全
创建云原生应用程序,需要注意什么?
创建云原生应用程序,需要注意什么?
133 0
创建云原生应用程序,需要注意什么?
|
Kubernetes Cloud Native Devops
帮助应用程序容器化的Derrick
Derrick 是一种工具,可帮助您在几秒钟内将应用程序容器化。
帮助应用程序容器化的Derrick
|
存储 运维 Kubernetes
Rainbond 开源 5.3.1 发布,支持100+组件一键云原生交付
Rainbond是云原生且易用的应用管理平台。云原生应用交付的最佳实践。专注于以应用为中心的理念。赋能企业搭建云原生开发云、云原生交付云。 近一年,使用Rainbond 云原生应用交付流程(见下图)的开源用户成为主流,面对不同用户的业务复杂性,对Rainbond交付流程的性能提出了新的要求。从 5.3.0 版本发布以来4个月的时间,Rainbond 开发者以交付链路的性能优化为主要迭代方向。
343 0
Rainbond 开源 5.3.1 发布,支持100+组件一键云原生交付
|
移动开发 JSON 小程序
UMC面向Serverless的全栈开发架构,用后端体系开发原生移动应用
在使用serverless中的Faas,虽然有Spring Boot和net Core迁移方案,但有此迁移过于复杂,难以做到平滑无缝迁移,因此我们需要一套面对Serverless的开发架构,即能平滑无缝迁移到Faas,又能快速到本地启动,方便开发调试的架构。今天发现一个新的全栈开发架构UMC,他的特性好像为Serverless而生的,做到在本地和Serverless无缝集成。在计算机语言上也支持java和C#
UMC面向Serverless的全栈开发架构,用后端体系开发原生移动应用