问题描述
我试图让客户端与多个服务器进程进行通信,但到目前为止,我找不到任何关于客户端如何发现和区分多个服务器进程的信息。任何有关其工作原理以及我可以去哪里了解更多信息的高级解释都将不胜感激。
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();
我不清楚如何使用它来查找多个服务器并选择其中一个来执行操作。
解决方法
您可以在特定主机/端口组合上使用 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 上运行的客户端应该倾向于在同一主机上查找,然后在同一数据中心尝试任何操作,然后从其他数据中心尝试。