目录
概述
远程执行pod命令的基本方法
后端websocket的实现
前端
总结
上一章通过http chunked 长连接实现了pod的日志读取和展现;
本章将通过前端的xterm.js库以及websocket来实现pod终端在浏览器页面上的实现。
首先构建一个请求
如果是一次性执行命令,我们会将command以
[]string{“你要执行的命令”}
的值传入;
以这个请求获取到url地址来创建远程命令执行对象
值得一提的是SPDY是谷歌开发的通信协议,在TCP层之上,HTTP/2的关键功能主要来自SPDY技术,换言之,SPDY的成果被采纳而最终演变为HTTP/2。
通过前步获得到的远程命令执行对象,我们可以开启流式传输,并制定标准输入/输出的方向
执行,即可在Terminal控制台观察到相应的结果返回。
我们知道,当我们在前端键入指令,传送到后端时。这个指令不可能是写死的,这就要求前后有一定的交互,并且后端执行后的结果需要通知到前端,来对页面进行渲染。所以我们需要使用到websocket。在上一节中我们将远程执行命令对象的返回结果定向到了os标准输出,也就是控制台,这一节我们来尝试将它通过 websocket 客户端返回给前端。
本文以gin框架来演示;
从*gin.Context中获取我们必要的参数,即交互的容器
老套路,把http连接升级成websocket连接

接下来很关键,我们需要把这个ws客户端取代os标准输出,作为远程命令对象的输出。
查看StreamOptions的成员变量
type StreamOptions struct { Stdin io.Reader Stdout io.Writer Stderr io.Writer Tty bool TerminalSizeQueue TerminalSizeQueue }
因此,我们需要通过ws客户端构建对象,并且实现Reader/Writer接口,其实就是往ws客户端里面灌数据/取数据
至此,后端部分就完成了;通过对应接口访问进来,远程命令执行对象会将通过ws收到的消息作为命令去执行,并通过ws连接把命令执行结果返回回去。
完整代码:
附前端部分完整代码
当我们在终端输入框键入命令并回车结束时,会触发终端组件的onData事件,onData事件会通过ws客户端将这部分数据发送给后端。后端将处理完成的结果通过ws连接返回给前端,触发了ws客户端的onmessage事件,然后调用终端组建的write方法,将结果再打印出来。
至此,我们就完成了pod shell的实现。
在下一章中,我们将在此基础上进一步实现node shell。其实原理是类似的,基本思路就是通过ssh开启一个会话,并同样以其构造实现io.Reader和io.Writer接口的结构体。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/170778.html