代码之家  ›  专栏  ›  技术社区  ›  Viktor Klang

基于Java的应用程序发现机制API

  •  7
  • Viktor Klang  · 技术社区  · 16 年前

    我目前参与了一个项目,在这个项目中,我们/应用程序需要能够发现在局域网上运行的具有相同应用程序名称的应用程序的其他实例(从此称为节点)。

    先决条件: 所有节点都知道自己的IP地址和TCP端口号 所有节点都有一个名称 所有节点都可以访问LAN

    我需要什么:

    所有节点都需要知道彼此节点的IP地址和TCP端口。 如果一个节点发生故障,我必须通过编程的方式得到通知。 如果出现一个新的节点,就必须通过编程方式通知我。 不需要主服务器或其他应用程序是很重要的,它必须是一个可以集成到当前应用程序中的API。 此外,它必须是开放源码的,最好是MIT或Apachev2许可证。

    这就是全部!

    应用程序是基于JVM的,所以任何API都可以。我一直在关注ZooKeeper,但它似乎很大程度上依赖于我们需要的小功能。

    如果你不知道任何API,但是有一些好的链接可以分享,比如如何通过自己写来实现这个目标(白皮书、博客、书籍等等),我也非常乐意接受这样的事情。

    所以问题是, 我该怎么做?

    4 回复  |  直到 13 年前
        1
  •  5
  •   Pascal Thivent    16 年前

    我绝对会推荐 JGroups 很好,而且 非常 主动处理并支持任何传输上的任何类型的发现(IP多播、固定列表、外部查找服务等)。

    另一个选择是 Apache MINA 但是jgroups更适合于发现(因为它支持任何类型的发现)。

        2
  •  2
  •   cletus    16 年前

    如果你们都在同一个子网上,一个简单的解决方案就是 multicast sockets . 选择一个地址(好吧,使其可配置),然后当一个新实例启动时,它会发送一个多播“ping”。这会通知其他服务器。

    当然,这不会告诉您实例何时崩溃。您有两种选择:

    1. Ping经常发生,当您在一定时间内未能接收到Ping时,您会假定实例已关闭;或者
    2. 当您收到新实例的通知时,您将打开与该实例的TCP连接。为了保持该套接字打开,您必须更不频繁地对其执行ping操作(不活动最终仍会导致其死亡),并且您可以收到另一方关闭该套接字或套接字超时的TCP语义的通知。

    您将需要1-2个线程来监视这一情况并触发适当的事件。

        3
  •  1
  •   Gareth Davis    16 年前

    这类事情有很多选择,我最喜欢的是 hazelcast 它是Apache许可的,没有依赖关系,配置最少。

    一个更成熟的选择是 jgroups 这是根据LGPL授权的。

        4
  •  1
  •   Thorbjørn Ravn Andersen    16 年前

    做这件事的最简单的方法是用zeroconf!

    每个节点都会宣布自己,并在其他节点出现和消失时倾听。没有中央注册表,只是多播DNS。工作非常好-看看OSX。

    可移植的方法是使用JMDNS- http://jmdns.sourceforge.net/ OSX方式是使用Apple Java外观。