![零配置 HTTP 中继服务器](https://linux22.com/image/1605406/%E9%9B%B6%E9%85%8D%E7%BD%AE%20HTTP%20%E4%B8%AD%E7%BB%A7%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
我开发了一个桌面产品 (C#),它有一个内置的 Web 服务器 (ServiceStack),可用于远程管理数据库 - 我将其称为内部服务器。许多用户希望在其网络之外访问内部服务器,但我这边让他们配置防火墙和端口转发的支持负担太重。此外,动态 IP 地址也可能是一个问题。
我正在尝试想出一种方法来创建零配置服务,用户可以连接到我托管的外部服务器,该服务器能够将请求中继到内部服务器,而无需在内部服务上进行任何配置。从用户的角度来看,它应该“正常工作”。
这类似于 TeamViewer/AnyDesk/etc 的工作方式,用户只需登录并“连接”到他们的计算机,而无需配置防火墙。
我已经根据下面的序列图开发了一个概念验证。它可以工作,但与直接连接相比,性能非常慢。
如何才能更好地实现这一点,是否有任何解决方案可以立即解决这个问题?
下图所示的关键挑战是公共中继服务器不应发起与内部服务器的直接连接。
答案1
可能的改进想法:
- 如果可能,请在中继和内部服务器之间使用 HTTP/2(但最好是在所有地方都使用)。这样您就可以利用 HTTP/2 服务器推送功能,而不必轮询或让内部服务器的请求挂起以等待新的外部请求,同时还可以提供许多其他潜在的性能改进。
- 使客户端系统与中继/内部服务器之间的通信异步化。因此,客户端向中继/内部服务器发送常规请求,收到已接受的响应,然后等待服务器的二次响应(通过 HTTP/2 服务器推送功能或其他推送通知机制)。这可以让您更好地向用户反馈请求确实正在处理,即使它实际上并没有提高性能,也会让事情感觉更快。
- 当您通知内部服务器有关请求时,先将请求从中继发送到内部服务器。这将消除中继和内部服务器之间的完整往返,从而显著加快速度。
- 如果要实现上述要点,请在中继和内部服务器之间使用我上面提到的相同异步通信模型。
- 研究使用的可能性冰(或类似方法)尽可能在客户端和内部服务器之间建立直接连接。这里最大的性能瓶颈实际上是中继服务器本身,如果您可以进行设置,使部分(或可能所有)用户无需在连接设置期间之外与其通信,您应该会看到相当大的性能改进。