dubbo提供者出现不明外网ip注册的问题

之前碰到过这样的问题,在dubbo admin里会看到有不明的外网IP,服务虽然是注册成功了,但是提供者确实来自不明的IP。

输入图片说明 今天做新项目上线,又碰到了这种情况。灵机一动会不会是因为dubbo在获取ip时有问题呢?于是就debug了下

– (a) 在服务器JVM参数中加入:-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=7001,server=y,suspend=y 因注册是启动时行为,启动时必需挂起suspend=y – (b) 在dubbo源码的ServiceConfig的export()方法中设置断点;在jdk InetAddress.getLocalHost()方法中设置断点。 – (c) 在Eclipse的Debug按钮下拉菜单Debug Configurations中的Remote Java Applications中新增远程调试,并设置IP和端口,以及增加dubbo的源码,进行远程Debug调试。

经调试发现,dubbo使用InetAddress.getLocalHost()获取ip地址,而InetAddress.getLocalHost()返回了一个错误的ip地址

dubbo获取ip的方式为先用InetAddress.getLocalHost获取,如果不符合,再用socket连接获取 host = InetAddress.getLocalHost().getHostAddress(); 校验方式为:

public static boolean isInvalidLocalHost(String host) {
        return host == null 
        			|| host.length() == 0
                    || host.equalsIgnoreCase("localhost")
                    || host.equals("0.0.0.0")
                    || (LOCAL_IP_PATTERN.matcher(host).matches());
    }

如果校验失败,则继续获取

Socket socket = new Socket();
SocketAddress addr = new InetSocketAddress(registryURL.getHost(), registryURL.getPort());
socket.connect(addr, 1000);
host = socket.getLocalAddress().getHostAddress();

如果还是不行,最后调用NetUtils.getLocalHost()获取。在NetUtils.getLocalHost()内部会调用网卡类NetworkInterface,遍历所有网卡,获取第一个合理的ip。如果还是获取不到,最终会返回127.0.0.1。

public static String getLocalHost(){
    InetAddress address = getLocalAddress();
    return address == null ? LOCALHOST : address.getHostAddress();
}

具体代码可参考com.alibaba.dubbo.config.ServiceConfig和com.alibaba.dubbo.common.utils.NetUtils 另可以参考这片文章,显然作者也是深受其害。 原因查询清楚,改起来也很容易,可以在/etc/hosts中增加 127.0.0.1 hostname 这样就会通过socket的方式获取到真实的ip。当然修改的方式也很多,比如也可以修改dns等,一般都不会到遍历网卡那一步。 对于那个不明IP是怎么来的,不外乎是hosts配置、dns配置有问题,当然也有可能是更深层次的问题,如有了解,欢迎探讨。 修改完成,测试成功,写完收工。

===========补充==========

今天又遇到了这个问题,有个ip 202.106.199.36 一直在dubbo admin里出现,运维同事怀疑是联通的dns服务器。我在局域网里根据端口 nmap -pXXXX 192.168.3.1/24 后找到了疑似的机器,确实hostname没有在hosts配置,停掉了事。

转载于:https://my.oschina.net/bfleeee/blog/516544

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值