language-agnostic - 如何自动检测服务器?

标签 language-agnostic client-server service-discovery

我们开发了一个客户端应用程序和一个服务器应用程序。客户端使用http协议(protocol)与服务器通信,并发送一些数据供服务器处理。

我们的结构允许我们将服务器安装在任何地方。我可以在同一个客户端网络上,甚至在云上。

当服务器托管在云上时,向用户询问服务器地址是有意义的(因为如果用户愿意,它可以更改),但当服务器与客户端位于同一网络上时则没有意义。除此之外,我们目前要求用户配置服务器 ip/name 以连接到服务器。

为了避免这种情况(向用户询问地址),我开发了一个基于 UDP 的发现服务。客户端广播一条消息,服务器用它的地址来回答。它在某些情况下确实有效,但当用户有某种防火墙、代理甚至防病毒时,它就不起作用了。

我已经阅读了很多关于发现服务的内容,其中最喜欢的是 Bonjour .

所以,问题是:当服务器与客户端位于同一网络上而不会被防火墙、代理等阻止时,发现服务器 IP 的最佳方法是什么?

最佳答案

您可以通过实现 hole punching 将您的服务完全保持在本地(在 Intranet 中)并构建在您现在使用的服务之上。 .您可以通过防火墙,但我真的不确定 AV 软件策略。

或者您可以在 Internet 上建立一个著名的基于 http 的发现服务。

  • 服务器启动,将其(本地)IP 地址发送到发现服务(继续发送保持事件状态)
  • 启动时,客户端查询该发现服务,识别他所在的本地子网,并取回服务器的本地 IP 地址。

  • 这当然会在您的系统中产生单点故障,因为如果发现服务踢了桶,您的客户端将无法找到服务器。您可以通过复制服务和/或引入后备机制(例如您拥有的纯本地发现)来解决此问题,无论如何您都可能想要这样做。您可能遇到的唯一问题是子网标识,如果本地子网中的计算机不共享外部 IP 地址(那么这取决于您的本地子网是什么)。

    关于language-agnostic - 如何自动检测服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10901250/

    相关文章:

    algorithm - 我如何找到阶乘?

    java - 获取网络上可用计算机的 IP 地址? -java

    azure-service-fabric - 在服务启动时获取所有事件服务实例

    docker - 如何使用 consul 和 gliderlabs/registrator 防止僵尸服务?

    math - float 学有问题吗?

    language-agnostic - 什么是可微分编程?

    design-patterns - 单态与单态

    java - 如何让grpc客户端调用多个服务器?

    swift - 从 Vapor 3 中的作业访问服务

    embedded - SSDP用于设备发现