dubbo provider 暴露错误的IP
最近运维童鞋在部署服务的时候发现dubbo consumer调用服务的时候总是失败,根据异常看,大致是dubbo consum 调用服务的时候,访问一个生产环境不存在IP。
表现的异常信息如下:
|
|
排错过程
开始以为是系统被攻击或者中病毒了导致,各种PS、 各种分析日志、各种查看机器负载情况后,排除了这个问题。
找到provider注册到Zookeeper所在的节点,发现注册在Zookeeper里面IP就是这个有问题的IP。也就是说provider机器启动的时候获取的本地IP是有问题。
一个同事提出尝试ping provider机器hostname,出现了这个问题IP。这时联想到dubbo 启动的时候 会不会有类似根据hostname获取IP的机制呢?
翻看dubbo,确实是有。
[ServiceConfig.java]
|
|
- 代码地址参见: ServiceConfig.java
分析问题出现的原因
出现问题的代码就是InetAddress.getLocalHost().getHostAddress();,此代码的执行的结果和ping hostname的结果是一样的。
翻看JDK中对应的代码,确认了它有使用sun.net.spi.nameservice.dns.DNSNameService;
解决办法
配置hostname的回环地址,使ping hostname得到的结果是127.0.0.1。
附注
以下为运维童鞋整理的:
这两台有问题的主机,是我们后期加的,gateway-client需要和很多外部交互,所以有很多解析上的配置,新加的机器直接复制之前主机的hosts文件,导致hosts文件中主机名和自身主机名不一致,当时并不曾想得到,hostname这里还有这种坑,所以就没管hostname。
另一方面,hostname解析过程中云析还会将xx.cmbcloud.com 加在hostname后面去解析,这是更没有想到,然后就得到了这个116.251.209.183 IP地址。
|
|