Go1.12, 轻松实现动态 HTTPS & WSS 反向代理
前言
2019年上半年google推出的golang1.12为我们带来了很多新特性,具体请见官方 Go 1.12 Release Notes
其中有一项:
net/http/httputil
The ReverseProxy now automatically proxies WebSocket requests.
从该版本开始,httputil库中的 ReverseProxy能够自动转发 websocket请求,参见 reverseproxy.go源码。
从此,无论 http(s) 或者 ws(s) 都能够通过 httputil 官方库实现,而在这之前,我们需要自己实现,或者借用一些第三方库实现,例如:https://github.com/gorilla/websocket 、https://github.com/yhat/wsutil。
本文将从产品实际需求出发,对该功能予以介绍。
需求提出
公司研发的产品是一个集群产品,在集群的管理节点(头节点)中部署有我们开发的WEB服务,集群中的其它节点中部署有类VNC的远程桌面服务,用户想访问这些节点中的类VNC服务时都要通过管理节点访问。此服务使用的协议是 https 和 websocket+ssl 即 wss。
管理节点中的转发服务需要支持如下功能:
- 因为后端是多个节点,所以管理节点要能够根据参数动态转发请求到指定的后端节点
- 要同时运行 https 转发和 wss转发
- 要支持把该远程桌面服务以iframe的方式嵌入到管理节点的WEB页面中
简单的示意图