介绍项目需求需要在浏览器端访问远程桌面,如图:实现远程桌面需要依赖VNC协议:VNC(VirtualNetworkComputing),是一款使用RFB协议的屏幕共享和远程操作软件。本软件可以通过网络发送键盘鼠标操作和实时屏幕图像。相关参考文献相对较少。谷歌搜索的文章大多是如何使用客户端搭建和接入VNC。他们中很少有人将其嵌入到网络中。腾讯云有相关功能,但是因为业务安全,我们看不到别人是怎么实现的。再见,百度。百度了一下,才知道VNC就是口红。所以VNC的实践之路是这样的过程:根据自己已有的知识和技能,设计一个VNC方案。尝试并分析可行性。根据可行性修改方案的细节,或推翻方案重新设计。从整体的初步设计到最终的落地方案,经历了以下七次方案迭代:SpringBoot调用REALVNC的C++类库,前后台数据交互。失败是因为REALVNC太贵了,客户买不起。SpringBoot中仿TightVNC实现JavaViewer获取数据,前后台数据交互。失败,因为TightVNCJavaViewer的源码没有注释,所以看不懂。SpringBoot手写VNC客户端,前后台数据交互。失败了,因为从0实现一个协议太复杂,时间成本太高。浏览器只连接VNC,使用nativeclient直接访问host。失败,需要安装软件,只能访问局域网内的主机。原生客户端+nginx数据转发。失败,需要安装软件,不能实现动态转发(不能动态更改nginx配置文件)。no-vnc+nginx数据转发。失败,无法实现动态转发(无法动态更改nginx配置文件)。no-vnc+node.js数据转发。成功,完美实现。实现思路的整体思路如下图所示:nginx在前台转发websocket连接。为实现外网转发,添加开发节点。.为什么是nginx?仔细想想,其实发现不用nginx也能实现功能。这里使用nginx主要是为了降低前台与后台架构的耦合度。增加一个网关转发所有的请求,只暴露一个端口给前台。无论后台使用什么技术、架构、微服务,从前台的角度来看,都好像是在访问一个单体应用。就像现在的华软项目一样,后台使用了spring-boot、.net、node.js。每种语言和框架发挥自己的优势,通过nginx的转发将模块连接起来。无论后台结构如何变化,对前台都没有影响,这应该是微服务架构的最佳实践。这是spring官方推荐的微服务架构图。我们学习并实践了api网关。Spring推荐netflixzuul。我们使用nginx。在请求转发方面,两者性能不相上下。随着业务需求的增长,我们肯定还会拆分服务,服务注册,服务发现,消息队列,RPC调用。然后使用eureka、zookeeper、hystrix、feign等优秀的开源组件,一起探索spring-cloud的最佳实践。之前不知道websocket,只是知道名字,并没有深入了解。http协议:请求响应,客户端请求,服务器响应,一次请求结束。服务器不能主动向客户端推送数据。为了解决这个问题,websocket应运而生。如果显示,请不要重复。no-vnc官网链接:noVNC安装依赖:npminstall@novnc/novnc前端组件一个空的div,在组件中引用。
