百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 博客教程 > 正文

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

connygpt 2024-09-27 02:26 6 浏览

介绍

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

运行机制

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

如下所示:

而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协议,实时传输相关数据。相关数据方面采用的是ZMQ。云帮主要使用了ZeroMQ消息队列中的Publisher-Subscriber模型,将所有相关信息汇总到一个节点上在推送到其他节点上。即客户端(SUB)向服务器(PUB)订阅消息,然后服务器将消息推送到所有订阅了消息到客户端,类似于广播。之所以采用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

那么在云帮,我们又是如何解决这个问题的?

云帮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开发的。

相关推荐

3分钟让你的项目支持AI问答模块,完全开源!

hello,大家好,我是徐小夕。之前和大家分享了很多可视化,零代码和前端工程化的最佳实践,今天继续分享一下最近开源的Next-Admin的最新更新。最近对这个项目做了一些优化,并集成了大家比较关注...

干货|程序员的副业挂,12个平台分享

1、D2adminD2Admin是一个完全开源免费的企业中后台产品前端集成方案,使用最新的前端技术栈,小于60kb的本地首屏js加载,已经做好大部分项目前期准备工作,并且带有大量示例代码,助...

Github标星超200K,这10个可视化面板你知道几个

在Github上有很多开源免费的后台控制面板可以选择,但是哪些才是最好、最受欢迎的可视化控制面板呢?今天就和大家推荐Github上10个好看又流行的可视化面板:1.AdminLTEAdminLTE是...

开箱即用的炫酷中后台前端开源框架第二篇

#头条创作挑战赛#1、SoybeanAdmin(1)介绍:SoybeanAdmin是一个基于Vue3、Vite3、TypeScript、NaiveUI、Pinia和UnoCSS的清新优...

搭建React+AntDeign的开发环境和框架

搭建React+AntDeign的开发环境和框架随着前端技术的不断发展,React和AntDesign已经成为越来越多Web应用程序的首选开发框架。React是一个用于构建用户界面的JavaScrip...

基于.NET 5实现的开源通用权限管理平台

??大家好,我是为广大程序员兄弟操碎了心的小编,每天推荐一个小工具/源码,装满你的收藏夹,每天分享一个小技巧,让你轻松节省开发效率,实现不加班不熬夜不掉头发,是我的目标!??今天小编推荐一款基于.NE...

StreamPark - 大数据流计算引擎

使用Docker完成StreamPark的部署??1.基于h2和docker-compose进行StreamPark部署wgethttps://raw.githubusercontent.com/a...

教你使用UmiJS框架开发React

1、什么是Umi.js?umi,中文可发音为乌米,是一个可插拔的企业级react应用框架。你可以将它简单地理解为一个专注性能的类next.js前端框架,并通过约定、自动生成和解析代码等方式来辅助...

简单在线流程图工具在用例设计中的运用

敏捷模式下,测试团队的用例逐渐简化以适应快速的发版节奏,大家很早就开始运用思维导图工具比如xmind来编写测试方法、测试点。如今不少已经不少利用开源的思维导图组件(如百度脑图...)来构建测试测试...

【开源分享】神奇的大数据实时平台框架,让Flink&Spark开发更简单

这是一个神奇的框架,让Flink|Spark开发更简单,一站式大数据实时平台!他就是StreamX!什么是StreamX大数据技术如今发展的如火如荼,已经呈现百花齐放欣欣向荣的景象,实时处理流域...

聊聊规则引擎的调研及实现全过程

摘要本期主要以规则引擎业务实现为例,陈述在陌生业务前如何进行业务深入、调研、技术选型、设计及实现全过程分析,如果你对规则引擎不感冒、也可以从中了解一些抽象实现过程。诉求从硬件采集到的数据提供的形式多种...

【开源推荐】Diboot 2.0.5 发布,自动化开发助理

一、前言Diboot2.0.5版本已于近日发布,在此次发布中,我们新增了file-starter组件,完善了iam-starter组件,对core核心进行了相关优化,让devtools也支持对IAM...

微软推出Copilot Actions,使用人工智能自动执行重复性任务

IT之家11月19日消息,微软在今天举办的Ignite大会上宣布了一系列新功能,旨在进一步提升Microsoft365Copilot的智能化水平。其中最引人注目的是Copilot...

Electron 使用Selenium和WebDriver

本节我们来学习如何在Electron下使用Selenium和WebDriver。SeleniumSelenium是ThoughtWorks提供的一个强大的基于浏览器的开源自动化测试工具...

Quick 'n Easy Web Builder 11.1.0设计和构建功能齐全的网页的工具

一个实用而有效的应用程序,能够让您轻松构建、创建和设计个人的HTML网站。Quick'nEasyWebBuilder是一款全面且轻巧的软件,为用户提供了一种简单的方式来创建、编辑...