在使用dubbo註冊服務時會遇到ip解析錯誤導致無法正常訪問.
比如: 本機設定的ip為172.16.11.111, 但實際解析出來的是180.20.174.11
這樣就導致這個service永遠也無法被訪問到, 而呼叫方一直報錯.
當然若發現服務無法訪問, 最好先通過dubbo-admin後台排查下註冊的服務是否正常.
1. 先檢視機器的hostname
2. 修改hosts檔案, 增加hostname 172.16.11.111
排查機器上配置的nameserver是否有問題, 若存在無用的nameserver則直接刪掉
或者在每個provider中繫結host
最好不要用第三種方式, 限制太多. 而且如果這樣做了就不支援集群了.
dubbo的官網也不建議使用這種方式. 請慎用.
/**
* 判斷host是否為不可用的本地host
*/public static boolean isinvalidlocalhost(string host)
/*** 獲取本地host.
* 若address == null ? "127.0.0.1" : inetaddress.gethostaddress();
*/public static string getlocalhost()
private void doexporturlsfor1protocol(protocolconfig protocolconfig, listregistryurls)
boolean anyhost = false;
//3. 若取出的是本地host, 則繼續取host
if (netutils.isinvalidlocalhost(host)) catch (unknownhostexception e)
if (netutils.isinvalidlocalhost(host)) finally catch (throwable e) {}
}} catch (exception e) }}
//6. 遍歷本地網絡卡, 返回第乙個合理的host
//最後乙個大招. 當上述都解析不到時, 則會遍歷本地網絡卡.
//逐個獲取ip, 直到有乙個合理的ip為止.
if (netutils.isinvalidlocalhost(host)) }}
...}
/**
* 遍歷本地網絡卡,返回第乙個合理的ip。
* @return 本地網絡卡ip
*/public static inetaddress getlocaladdress()
/*** 遍歷本地網絡卡,返回第乙個合理的ip。
* @return 本地網絡卡ip
*/private static inetaddress getlocaladdress0()
} catch (throwable e)
try
} catch (throwable e) }}
} catch (throwable e) }}
} catch (throwable e)
logger.error("could not get local host ip address, will use 127.0.0.1 instead.");
return localaddress;
}
dubbo使用zookeeper註冊服務並負載均衡
dubbo建議使用zookeeper作為服務的註冊中心。1.zookeeper的作用 zookeeper用來註冊服務和進行負載均衡,哪乙個服務由哪乙個機器來提供必需讓呼叫者知道,簡單來說就是ip位址和服務名稱的對應關係。當然也可以通過硬編碼的方式把這種對應關係在呼叫方業務 中實現,但是如果提供服務的...
Dubbo原始碼解析 註冊中心
dubbo註冊中心的 定義在dubbo registry模組中,可以看到dubbo可以使用consul,redis,zookeeper來實現註冊中心。default是基於記憶體實現的註冊中心,multicast是基於廣播實現的註冊中心。registry繼承了registryservice介面,reg...
Dubbo原始碼閱讀 三 Dubbo 服務註冊
通過註解來註冊dubbo服務的時候,在服務端和消費端都需要用到乙個元件dubbocomponentscanregistrar,先看下registerbeandefinitions 方法 public void registerbeandefinitions annotationmetadata im...