主要原因是dubbo升级后,注册到zk的ip地址发生了变化,导致调用方无法调用。
版本描述:2.7.8升级到2.7.22
可以看到获取register的方法发生了变化,导致获取到的本地IP可能产生了变化。
/**
* Get the suitable {@link NetworkInterface}
*
* @return If no {@link NetworkInterface} is available , return <code>null</code>
* @since 2.7.6
*/
public static NetworkInterface findNetworkInterface() {
List<NetworkInterface> validNetworkInterfaces = emptyList();
try {
validNetworkInterfaces = getValidNetworkInterfaces();
} catch (Throwable e) {
logger.warn(e);
}
NetworkInterface result = null;
// Try to find the preferred one
for (NetworkInterface networkInterface : validNetworkInterfaces) {
if (isPreferredNetworkInterface(networkInterface)) {
result = networkInterface;
break;
}
}
#进入isPreferredNetworkInterface方法中来,使用到了一个系统属性DUBBO_PREFERRED_NETWORK_INTERFACE。
public static boolean isPreferredNetworkInterface(NetworkInterface networkInterface) {
String preferredNetworkInterface = System.getProperty(DUBBO_PREFERRED_NETWORK_INTERFACE);
return Objects.equals(networkInterface.getDisplayName(), preferredNetworkInterface);
}
dubbo在代码中提供了,两个可以处理registerIP的属性,“dubbo.network.interface.preferred”、“dubbo.network.interface.ignored”
#服务启动命令中增加参数 就能设置预期的网卡ip了
-Ddubbo.network.interface.preferred=ethXXX
"ensXXX"是网卡的displayName显示名称,显示名称默认是网卡的name,dubbo取的是displayName显示名称,如果未手动设置过网卡显示名称。
直接在linux上使用ip addr或者ipconfig即可获得网卡名称。一般是ethX,例如:eth1 eth2
还有一种解决方案是,如果是xml,可以在dubbo:protocol或者dubbo:provider 进行设置host属性。
#
<dubbo:protocol host="主机名称或者主机ip" />
<dubbo:provider host="主机名称或者主机ip" />
那么注册到zk的dubbo服务地址的ip就会变成
dubbo://主机名称或者主机ip/com.aa.bb
如果你写的主机名称是bai123,那么url="dubbo://bai123/com.aa.bb"
如果你写的主机名称是"158.54.48.1",那么url="dubbo://158.54.48.1/com.aa.bb"
Register dubbo service com.aaa.bbb.api.XXXService url dubbo://2.5.1.9:22221/com.aa.bb