项目背景:
最近接手公司一个老项目,项目RPC调用采用的是zookeeper+dubbo,在部署的时候出现了消费者无法调用生产者问题,其中消费者和生产者部署在一台云服务器,zookeeper部署在另外一台云服务器,两台云服务器是一个局域网。
在部署项目之前,本机就已经连接到了云服务器的地址进行联调过,是没有任何问题的。但是把war包传到云服务器部署后,就出现了消费者无法调用生产者问题,具体错误如下:
com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method S01050503 in the service cn.mobo.outsideInterface.user.doctor.IOrganizationService. Tried 1 times of the providers [10.163.164.12:20880] (1/1) from the registry 114.215.68.161:2181 on the consumer 10.163.164.12 using the dubbo version 2.5.3. Last error is: Failed to invoke remote method: S01050503, provider: dubbo://10.163.164.12:20880/cn.mobo.outsideInterface.user.doctor.IOrganizationService
Caused by: com.alibaba.dubbo.remoting.RemotingException: message can not send, because channel is closed . url:dubbo://10.163.164.12:20880/cn.mobo.outsideInterface.user.doctor.IOrganizationService?anyhost=true&application=consumer&check=false&codec=dubbo&default.check=false&default.retries=0&default.timeout=200000&dubbo=2.5.3&heartbeat=60000&interface=cn.mobo.outsideInterface.user.doctor.IOrganizationService&methods=S01050505,S01050504,S01050503,S01050502,S01050509,S01050508,S01050507,S01050506,S01050501&pid=5865&revision=0.0.1-SNAPSHOT&side=consumer×tamp=1595515240546
这里我发现消费者调用了了一个莫名其妙的的IP地址疑似内网IP,但是这也不是生产者部署的这台云服务器的内网IP。
所以查到这里首先看看为什么消费者会去调用一个内网IP,后来查看zookeeper注册列表,发现生产者是注册的内网IP,同时也了解到zookeeper默认注册的时候是使用内网IP的,这样服务注册和服务发现响应速度会特别快。
但是即使是默认使用内网IP注册,为什么没有注册自己云服务器的内网IP,反而注册了一个错误的内网IP,后来通过查询CentOS系统下的/etc/hosts文件,终于发现了问题所在,在域名解析的时候指向了这个错误的内网IP,后来把解析指向的地址修改为正确的内网IP,消费者就能正常调用生产者的服务了。
后来询问同事得知,阿里云的云服务器在很久之前进行过迁移,更换过内网IP地址,所以导致hosts里面残留了旧的内网IP地址。
127.0.0.1 localhost
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.163.164.12 iZ28h78kqvuZ
总结:
1.生产者在zookeeper上进行服务注册时,对外提供的访问地址,默认使用内网IP地址;
2.生产者在zookeeper上进行服务注册时,会把hosts文件中的内网IP注册到zookeeper,以供消费者调用。