先简述一下最近出的一个问题。
公司内部的发布系统,发布我们最新的应用之后,应用启动成功,用ps或者jps命令都能看到,然后dubbo-monitor里面也查询到服务已经注册成功。但是发现应用无法访问。
1、先排除代码问题。因为本期配置文件没有做任何修改,只是添加了一个接口,而且服务启动成功,所以大概率不是代码的问题。
2、查询提供服务的接口,先访问我们的api网关,然后去dubbo调用接口。这时候发现服务注册在zk上的ip不对,不是我们之前发布机器的ip(地址简称为A),,而是另外一台(IP简称为B)。问题应该就出在这里。
再去在改服务器下输入hostname指令,发现hostname被修改,修改后的hostname是我们另外一个服务的机器名,另外一个服务的IP正是B。
解决方案就是把hostname先改回我们自己原先的hostname,然后重启服务,让服务重新注册到zk上,问题解决。
深入源码解决问题:
从serviceBean开始,一直往下看,直到serviceConfig类的doExportUrlsFor1Protocol方法。具体相关的代码分析不做了,网上有很多。
总结就是java原生取ip地址就是会用hostname,所以hostname改了,ip就会出错。