Java 高效地找到我的机器所在的数据中心及其完整节点?
在我们公司,我们可以将机器主机名设置为-Java 高效地找到我的机器所在的数据中心及其完整节点?,java,enums,hostname,Java,Enums,Hostname,在我们公司,我们可以将机器主机名设置为- dbx111.dc1.host.com dbx112.dc2.host.com dcx113.dc3.host.com 这里的dc1,dc2,dc3是我们的数据中心,目前我们只有三个数据中心。而且,将来机器主机名之间可能会有更多的点被另一个域分隔开 现在我需要找出我当前的机器在哪个数据中心,因为我将在实际机器上运行低于代码的代码。如果我的机器在DC1中,那么我需要返回/zk/DC1,但是如果我的机器在DC2中,那么我需要返回/zk/DC2,如果我的机器
dbx111.dc1.host.com
dbx112.dc2.host.com
dcx113.dc3.host.com
这里的dc1
,dc2
,dc3
是我们的数据中心,目前我们只有三个数据中心。而且,将来机器主机名之间可能会有更多的点被另一个域分隔开
现在我需要找出我当前的机器在哪个数据中心,因为我将在实际机器上运行低于代码的代码。如果我的机器在DC1
中,那么我需要返回/zk/DC1
,但是如果我的机器在DC2
中,那么我需要返回/zk/DC2
,如果我的机器在DC3
中,那么我将返回/zk/DC3
但是如果我的机器数据中心位于DEV
,那么我将随机返回/zk/dc1
或/zk/dc2
目前,我下面的代码只写入我所在的数据中心,例如它是DC1还是DC2或DC3还是DEV
。但我不知道如何在这个枚举中添加上述逻辑,以便它也可以根据我所在的数据中心返回我/zk/dc1
或/zk/dc2
或/zk/dc3
而且,如果我只需要得到我所在的数据中心,那么它也应该能够以这种方式工作
public static void main(String[] args) {
System.out.println(DatacenterEnum.getCurrentDatacenter());
}
public enum DatacenterEnum {
DEV, DC1, DC2, DC3;
public static String forCode(int code) {
return (code >= 0 && code < values().length) ? values()[code].name() : null;
}
private static final DatacenterEnum ourlocation = compareLocation();
private static DatacenterEnum compareLocation() {
String ourhost = getHostName();
for (DatacenterEnum dc : values()) {
String namepart = "." + dc.name().toLowerCase() + ".";
if (ourhost.indexOf(namepart) >= 0) {
return dc;
}
}
return null;
}
private static final String getHostName() {
try {
return InetAddress.getLocalHost().getCanonicalHostName().toLowerCase();
} catch (UnknownHostException e) {
//log error
}
return null;
}
public static DatacenterEnum getCurrentDatacenter() {
return ourlocation;
}
}
publicstaticvoidmain(字符串[]args){
System.out.println(DatacenterEnum.getCurrentDatacenter());
}
公共枚举数据中心枚举{
DEV,DC1,DC2,DC3;
公共静态字符串forCode(整型代码){
返回(代码>=0&&code=0){
返回dc;
}
}
返回null;
}
私有静态最终字符串getHostName(){
试一试{
返回InetAddress.getLocalHost().getCanonicalHostName().toLowerCase();
}捕获(未知后异常e){
//日志错误
}
返回null;
}
公共静态数据中心枚举getCurrentDatacenter(){
返回我们的位置;
}
}
你知道如何有效地完成吗?谢谢你的建议。在这种情况下,这里的名称是什么?抱歉,当前弄错了?name()是枚举的名称,即“DC1”、“DC2”、“DC3”或“DEV”。每个枚举都有一个:是的,但这个名称将是我所在的当前数据中心的名称,对吗?你至少试过理解我发布的6行代码吗?方法是在我们的位置调用的,对吗?我们的位置就是我们的位置,对吗?@JaceRhea:同意。但是我没有看到任何需要解释的东西,对于已经使用Enum、已经使用toLowercase()的人来说,应该知道我们的位置是什么,因为他已经定义了它,并且应该理解Random.nextBoolean()在没有任何解释的情况下做了什么。我喜欢你想要一些包括DNS查找在内的高效的东西!还要考虑如果你的网络管理员改变DNS或者移动你的程序,你是否会默默地接受你的程序。将配置置于代码之外。属性文件的读取成本很低。这只是一个坏主意——整个命名过程。
private void toZkString() {
if (this == DEV) {
return new Random().nextBoolean() ? "/zk/dc1" : "/zk/dc2";
}
return "/zk/" + name().toLowercase();
}
private static final String OUR_LOCATION_AS_ZK_STRING = ourlocation.toZkString();