服务发布时,需要将自身的IP地址上报到注册中心,供服务消费者去发现.
获取ip地址逻辑获取网卡逻辑
ServiceConfig#findConfigedHosts()方法
获取DUBBO_IP_TO_BIND配置
getValueFromConfig()方法:
从env,property里获取配置
若有配置,则校验是否是非法本地地址,若是则抛异常
isInvalidLocalHost()
是localhost 或 "0.0.0.0" 或 127开头的本地地址
若没有配置,再获取host配置,校验若配置了非法地址抛异常
上面没找到,再获取localhost地址
再尝试获取注册中心host+port,看看能不能连上,并校验该地址
最后再尝试调用getLocalHost()获取ip
getLocalHost()方法:
从LOCAL_ADDRESS缓存中获取
获取ip地址ngetLocalAddress0()
NetUtils#getLocalAddress0()
尝试获取 hostname 对应的 IP 地址 n InetAddress.getLocalHost()
判断是否是有效的IP地址
toValidAddress()方法
1.依次校验IP地址是否符合IPv6或IPv4规范
1.1.检验IPv6地址
isValidV6Address()方法
1.判断`java.net.preferIPv6Addresses` 参数,n默认false,表示是否使用Ipv6 地址作为理想的注册 IP.n所以一般ipv6地址会直接跳过
2.通过 isReachable 判断网卡的连通性.n 例如一些网卡可能是 VPN/ 虚拟网卡的地址,如果没有配置路由表,往往无法连通,可以将之过滤.
1.2.校验IPv4地址
isValidV4Address()
1.本地环回地址校验n isLoopbackAddress()
2.Ipv4 格式的正则校验,非 ANYHOST 校验,非 LOCALHOST校验.
若上述未获取到地址,轮询网卡n 例如 hosts 未指定 hostname 的映射或者 hostname,n 配置成了 127.0.0.1 之类的地址便会导致获取到空的网卡地址
轮询网卡n NetworkInterface.getNetworkInterfaces()
若是本地环回地址 或 是虚拟网卡 或是 未启用的网卡,则continue
校验ip地址合法性
校验ip地址连通性
若校验通过则返回该网卡ip
缓存ip地址
参考
研究网卡地址注册时的一点思考



