dubbo註冊服務IP解析異常及IP解析原始碼分析

2021-09-25 13:43:38 字數 1760 閱讀 6995

在使用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...