【问题标题】:High level method for java RMI client communication to multiple serversjava RMI客户端与多个服务器通信的高级方法
【发布时间】:2021-06-18 17:26:24
【问题描述】:

我正在尝试让客户端与多个服务器进程进行通信,但到目前为止,我找不到任何关于客户端如何发现和区分多个服务器进程的信息。任何有关其工作原理以及我可以去哪里了解更多信息的高级解释都将不胜感激。

目前我的做法是找一个单独的服务器并与之交互如下:

ServerInterface server;
try {
Server = (ServerInterface) Naming.lookup(String.format("//%s:%d/Server", hostName, serverPort));
}
catch (Exception e) {
System.out.println("Unable to lookup server");
return;
}
server.operation();

我不清楚如何使用它来查找多台服务器并选择其中一台执行操作。

【问题讨论】:

  • 呃,Registry?不清楚你在问什么。
  • 您能否向我解释一下注册表如何使客户端能够发现服务器以外的内容并选择其中一个进行交互?一个例子会很有用。
  • Registry 将名称映射到远程对象。您可以拥有任意数量的名称和任意数量的远程对象,仅受系统限制。
  • 客户端在不知道服务器名称的情况下有没有办法连接到服务器?这样,可以部署非预定义数量的服务器,并且客户端可以选择其中一个来使用。抱歉,这似乎不知情,因为我最近才开始使用 Java RMI

标签: java distributed-computing rmi


【解决方案1】:

您可以使用Naming.list(name) 在特定主机/端口组合上检查哪些服务可用。假设我已经启动了 4 个名为 myname1..4 的 RMI 服务器,在端口 1099 上注册了 myname1/2,在端口 1100 上注册了 myname3/4,那么以下查询将返回这些结果:

Naming.list("//:1099")
==> String[2] { "//:1099/myname1", "//:1099/myname2" }
Naming.list("//:1100")
==> String[2] { "//:1100/myname3", "//:1100/myname4" }
Naming.list("//MY_MACHINE:1100")
==> String[2] { "//MY_MACHINE:1100/myname3", "//MY_MACHINE:1100/myname4" }

您可以控制使用哪些名称以及它们在哪些机器上运行,因此您可以设计一个简单的命名策略,这意味着您可以搜索最合适的服务器,并实现自己的服务器查找层,以便您的所有客户端以同样的方式连接。

请注意,此策略不考虑当前服务器负载,在决定如何解析要使用的最佳服务器时,您可能会考虑其他策略。假设您有 2 个数据中心(可能是不同的国家!),每个数据中心都有成对的机器(DCA1/DCA2/DCB1/DCB2)。在 DCA1 上运行的客户端应该优先在同一主机上查找,然后再尝试在同一数据中心中查找,然后再从其他数据中心查找。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多