有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何以编程方式查找/列出J2EE ApplicationCluster中的所有节点?

有没有办法找到属于web应用程序集群的所有节点?我知道在JBoss上我可以使用HasServiceBeanSupport来获取关于所有节点(主机名、IP地址)的信息,但是如何在Tomcat、WebPere、Glassfish、Oracle AS、Jetty和WebLogic上实现类似的功能呢? (最好是一个适合所有人的界面)


共 (2) 个答案

  1. # 1 楼答案

    对于你的要求,没有标准的滴入式解决方案
    从技术上讲,它可以通过多种方式实现——在java生态系统内部和外部,例如Jgroups集群形成、Zookeeper或simple Redis或其他K/V服务器,在这些服务器上,每个服务器实例都会在启动时注册,并订阅集群组中的更改
    然而,支持和所需的努力将有所不同。一般的方法是使用一些启动钩子,例如Servlet容器初始化或EJB @Startup @Singleton来联系拓扑发现服务(例如您的redis服务器),提供有关您实例的信息,并查询有关其他已激活实例的信息。如果你需要领导人选举,你可以使用许多算法,例如先到先得,或基于投票。然后,您需要订阅并主动侦听拓扑结构中的更改,并可能提供某种健康指标——例如,定期让其他人知道您的实例仍处于活动状态 总的来说,你能详细说明一下为什么你的应用程序需要了解相同类型的其他实例吗?您需要主选择还是HA集群范围的单例功能?构建稳定的可扩展解决方案的最佳实践是保持应用程序无状态,并且不知道扩展细节

    只需按顺序或在单个节点上执行的功能可以提取到专用服务中,例如批处理作业服务、调度器服务等

    大多数JEE服务器供应商都为此提供了一些定制解决方案,例如JBoss HASingleton服务,或HA singleton部署(应用程序始终仅在集群中的单个实例上运行),它还负责故障切换

  2. # 2 楼答案

    据我所知,这取决于应用服务器的功能

    没有“标准方式”可以做到这一点

    您可以尝试以下方法:

    ServletContextListener有两个方法。您可以在create方法中计算主机名和IP地址,并在destroy方法中删除节点

    这种方法在VM崩溃期间会出现问题,例如,不会调用destroy方法

    编辑: 你的软件需要数据库吗?如果是这样,所有ClusterNode都必须使用相同的数据库实例。如果你的应用部署时没有集群,它会使用一个“私有”数据库。你需要一个共享数据库:

    Table: NODES


    HOST | IP


    as1.cluster | < ip >

    as2.cluster | < ip2 >

    If only onne line inserted to that DB, there is no cluster.

    但是,如果某个节点崩溃,并且没有从该表中删除其条目,则该表可能已损坏