记一次处理Dubbo多网卡注册IP错误问题( 二 )


知道了Dubbo是如何选择网卡的了,但是好像对我们没有太大帮助,我总不能限制网卡的网速去吧?
最好的办法还是,我是否可以设置?再看一遍源码是不是遗漏了什么 。看下是如何选择网卡的:
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 onefor (NetworkInterface networkInterface : validNetworkInterfaces) {// 是否为优选的网卡if (isPreferredNetworkInterface(networkInterface)) {result = networkInterface;break;}}if (result == null) { // If not found, try to get the first onefor (NetworkInterface networkInterface : validNetworkInterfaces) {Enumeration<InetAddress> addresses = networkInterface.getInetAddresses();while (addresses.hasMoreElements()) {Optional<InetAddress> addressOp = toValidAddress(addresses.nextElement());if (addressOp.isPresent()) {try {if (addressOp.get().isReachable(100)) {return networkInterface;}} catch (IOException e) {// ignore}}}}}if (result == null) {result = first(validNetworkInterfaces);}return result;}复制代码这方法也分为几步,也是很好理解的:

  1. 查找所有合适的网卡
  2. 在查找的网卡里遍历一遍,看是否有优先设置的
  3. 如果没有,选择一个网速100毫秒响应的
  4. 如果还没有,则返回第一个网卡
第一步,查找所有合适的网卡,怎么算合适的呢?getValidNetworkInterfaces方法里判断只要不是被忽略的网卡就是合适的,里面的代码就不细看了,大致逻辑是,通过参数
dubbo.network.interface.ignored可以设置哪些网卡被忽略,如果忽略多个可以用逗号拼接 。例如dubbo.network.interface.ignored=eth0,eth1 。这个参数好像可以满足我们的需求 。
第二步,查找网卡是否有被我们优先设置的 。
isPreferredNetworkInterface方法我们看下:
public static boolean isPreferredNetworkInterface(NetworkInterface networkInterface) {// dubbo.network.interface.preferredString preferredNetworkInterface = System.getProperty(DUBBO_PREFERRED_NETWORK_INTERFACE);return Objects.equals(networkInterface.getDisplayName(), preferredNetworkInterface);}复制代码可以看到,我们可以通过
DUBBO_PREFERRED_NETWORK_INTERFACE这个参数,也就dubbo.network.interface.preferred来指定网卡 。例如:dubbo.network.interface.preferred=eth0 。
看到这里,我们就明白了,至少我们可以通过排除网卡或者设置网卡来让Dubbo选择合适的ip去注册 。因为docker容器里,不一定有多少个确定的网卡,还是指定网卡比较保险 。
问题解决好了,知道如何让Dubbo来选择网卡了,我们只要找到各个容器里在同一网段的网卡就好了 。
于是,登录到各个docker容器里,查看ip信息 。对比了一下,发现eth1这个ip的网段都是10.10.x.x网段的 。
配置环境变量信息
dubbo.network.interface.preferred=eth1,重启服务,然后访问接口,果然通了 。
大功告成!
后记其实,还有其他办法来解决问题,比如:protocol配置host信息、设置 DUBBO_IP_TO_REGISTRY和DUBBO_IP_TO_BIND等 。这里就不展开说明了,有兴趣的小伙伴可以自己试一试 。

【记一次处理Dubbo多网卡注册IP错误问题】


推荐阅读