我目前参与的项目中,我们/应用程序需要能够发现在LAN上运行相同应用程序名称的应用程序的其他实例(以下称为Node)。
先决条件: 所有节点都知道自己的IP地址和TCP端口号 所有节点都有一个名称 所有节点都可以访问LAN
我需要什么:
所有节点都需要知道每个其他节点的IP地址和TCP端口。 如果节点出现故障,我将不得不以编程方式通知此情况。 如果出现新节点,我将不得不以编程方式通知此情况。 它的基本原理是不需要主服务器或其他应用程序,它必须是我可以集成到当前应用程序中的API。 此外,它必须是开源的,最好是MIT或ApacheV2许可。
这就是全部!
该应用程序是基于JVM的,因此任何API都可以。我一直在关注ZooKeeper,但它似乎对我们需要的小功能非常依赖。
而且,如果您不知道任何API,但有一些很好的链接可以分享,如何通过自己编写(白皮书,博客,书籍等等)来实现这一点,我非常乐意接受像那还是。
所以问题是, 我该怎么做?
答案 0 :(得分:5)
我肯定会推荐JGroups非常好,并且非常积极参与并支持任何类型的发现(IP多播,固定列表,外部查找服务等) 。
另一个选项是Apache MINA,但JGroups更适合发现IMO(因为它支持任何类型的发现)。
答案 1 :(得分:2)
如果你们都在同一个子网上,一个简单的解决方案就是使用multicast sockets。选择一个地址(好吧,使其可配置),然后当一个新实例启动时,它发送一个多播“ping”。这会通知其他服务器。
当然,这不会告诉你何时实例出现故障。你有两个选择:
您需要1-2个线程来监控此事并触发相应的事件。
答案 2 :(得分:1)
答案 3 :(得分:1)
绝对最简单的方法 - 在我看来最简单 - 这样做是使用ZeroConf!
每个节点宣布自己,并在别人出现和消失时听取。没有中央注册表,只是多播DNS。效果非常好 - 只需看看OS X.
便携式方法是使用jmdns - http://jmdns.sourceforge.net/ - OS X的方式是使用Apple Java外观。