实现和架构
Guacamole不是一个独立的web应用程序,它由许多部分组成。Web应用程序实际上意在简单和最小化,大部分繁重的工作都由底层组件执行。
用户通过web浏览器连接到Guacamole服务端。JavaScript
编写的Guacamole客户端通过Guacamole服务端的Web服务向用户提供服务。加载后,该客户端通过HTTP方式使用Guacamole协议连接回服务端。
部署在Guacamole服务上的Web应用程序读取Guacamole协议,并将其转发给guacd
和本地的Guacamole代理。该代理实际解释Guacamole协议的内容,并代表用户连接任意数量的远程桌面服务。
Guacamole协议与guacd
的结合提供了协议不可知性:Guacamole客户端和Web应用程序都不需要知道实际使用的是什么远程桌面协议。
Guacamole协议
Web应用程序完全不理解任何的远程桌面协议。它不包含支持VNC、RDP或任何其他Guacamole协议栈支持的协议。它实际上只能理解Guacamole协议,这是一种用于远程显示渲染和事件传输的协议。虽然具有这些属性的协议自然具有与远程桌面协议相同的功能,但远程桌面协议和Guacamole协议背后的设计原则是不同的:Guacamole协议并不旨在实现特定桌面环境特性。
作为一种远程显示和交互协议,Guacamole实现了现有远程桌面协议的超集。因此,在Guacamole中添加对特定远程桌面协议(如RDP)的支持需要编写一个中间层,用以在远程桌面协议和Guacamole协议之间进行“转换”。实现这种转换与实现任何本地客户端没有什么区别,只是这个特定的实现是呈现给远程显示的,而不是本地显示。
处理这个转换的中间层是guacd
guacd
guacd
是Guacamole的核心,它动态加载对远程桌面协议(即“客户端插件”)的支持,并根据从Web应用程序接收到的指令将它们连接到远程桌面。
guacd
是一个随着Guacamole一起安装的后台运行的守护进程,监听来自Web应用程序的TCP连接。guacd
同样不理解任何特定的远程桌面协议,而是实现了足够多的Guacamole协议,以确定需要加载哪些协议支持,以及必须向其传递哪些参数。一旦加载了客户端插件,它将独立于guacd
运行,并完全控制自己与Web应用程序之间的通信,直到客户端插件终止。
guacd
和所有客户端插件都依赖于一个公共库,libguac
,使得通过Guacamole协议进行通信更容易,更抽象一点。
Web应用程序
用户实际与Guacamole交互的部分是web应用程序。
如前所述,Web应用程序不实现任何远程桌面协议。它依赖于guacd
,只实现了一个漂亮的Web界面和身份验证层。
我们选择用Java
实现Web应用程序的服务器端,但也可以用其他语言编写。事实上,因为Guacamole是一种API,我们鼓励这样做。
RealMint
虽然Guacamole现在是一种通用的远程桌面网关,但情况并非总是如此。Guacamole最初是一个纯基于文本的Telnet客户端,用JavaScript
编写,名为RealMint
(RealMint
是terminal
的一个字谜)。主要是作为一个演示而写,虽然它的目的是有用的,但它出圈主要是因为它是纯JavaScript
实现的。
RealMint
使用的隧道是用PHP编写的。与Guacamole的HTTP隧道不同,RealMint
的隧道只使用简单的长轮询且效率低下。RealMint
有一个不错的键盘实现,现存于Guacamole的部分键盘代码中,但实际上是RealMint
的功能和可用性范围。
考虑到它只是一个遗留协议的实现,并且存在其他一些JavaScript
终端模拟器,其中大多数都是成熟且稳定的,因此该项目被放弃。
VNC客户端
当开发者了解到HTML5画布标记,并看到它已经在Firefox和Chrome中实现的时候,就开始了JavaScript VNC
客户端的概念验证工作。
该客户端纯粹是带有Java服务器组件的JavaScript
代码,并通过将VNC转换为基于XML版本来工作。它的开发自然是出于VNC的功能,其用处仅限于将单个连接转发给一组用户。虽然相对较慢,但概念验证工作得很好,因此需要一个在线场地继续维持项目,所以在SourceForge上作为一个HTML5 VNC
客户端注册了“Guacamole”。
随着Guacamole的成长,变得不再只是一种概念验证,对速度的需求也在增加,旧的RealMint
风格的长轮询被放弃,XML的使用也被放弃。
由于WebSocket当时无得到信任支持,而且Java
没有针对servlet的WebSocket标准,因此开发了一个等效的基于HTTP的隧道。如果WebSocket因任何原因无法使用,该隧道至今仍可以使用。
远程桌面网关
一种更快的基于文本的协议被开发出来,它可以呈现多种远程桌面协议的功能,而不仅仅是VNC。整个系统被重新构建成一个标准的守护进程guacd
和一个公共库libguac
,前者驱动了守护进程和协议支持,后者变得可扩展。
该项目的能力从一个合适的VNC客户端扩展到了一个高性能的HTML5远程桌面网关和通用API。在当前状态下,Guacamole可以用作中央网关,以访问运行不同远程桌面服务器的任意数量的机器。它提供了可扩展的身份验证,如果你需要更专业的东西,还提供了一个用于基于HTML5的远程访问的通用API。