开发案例——服务提供方设置了虚拟IP,调用时无法找到服务

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/abcyyjjkk/article/details/81901998

项目

描述

问题描述

多台主机部署,服务均正常运行,调用时报错“服务未注册”,日志中发现异常IP地址

   

定位方法

  1. 服务提供端(Provider)正常启动,并已经在注册中心正常注册。
  2. 调用端(Consumer)在调用服务时抛出异常(查看日志文件):
      (从日志中可以看出,服务提供者的IP地址异常,无法访问;另,在程序启动时也有无法建立连接的日志输出;)

Failed to invoke the method login in the service cn.com.scooper.core.dsapi.service.system.IAuthService. Tried 1 times of the providers [173.173.173.173:20880] (1/1) from the registry 192.168.101.9:6379 on the consumer 192.168.105.129 using the dubbo version 2.5.7. Last error is: Failed to invoke remote method: login, provider: dubbo://173.173.173.173:20880/cn.com.scooper.core.dsapi.service.system.IAuthService?anyhost=true&application=common-gis-web&cache=lru&check=false&default.accesslog=true&default.check=false&default.retries=0&default.timeout=30000&default.token=true&dubbo=2.8.4&generic=false&interface=cn.com.scooper.core.dsapi.service.system.IAuthService&logger=slf4j&methods=getPmPermByProKey,logout,loginTo,heartbeat,getAccountStatus,login&pid=6776®ister.ip=192.168.105.129&remote.timestamp=1512474168503&revision=1.4.2.0&side=consumer×tamp=1512474231192&token=false, cause: message can not send, because channel is closed . url:dubbo://173.173.173.173:20880/cn.com.scooper.core.dsapi.service.contacts.IOrgMemberService?anyhost=true&application=common-gis-web&cache=lru&check=false&codec=dubbo&default.accesslog=true&default.check=false&default.retries=0&default.timeout=30000&default.token=true&dubbo=2.8.4&generic=false&heartbeat=60000&interface=cn.com.scooper.core.dsapi.service.contacts.IOrgMemberService&logger=slf4j&methods=updateOrgMember,deleteOrgMember,insertOrgMember,queryOrgMember,listOrgMemberByOrgCode,findOrgMemberPath,findAccountByOrgMemberId,queryOrgMemberByDispArgs,getOrgMemberByParams,listOrgMember,changeOrgMemberSortIndex,listOrgMemberByFax,findOrgMemberByTel,listOrgMemTypeList&pid=6776®ister.ip=192.168.105.129&remote.timestamp=1512474169196&revision=1.4.2.0&side=consumer×tamp=1512474206259&token=false

com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method login in the service cn.com.scooper.core.dsapi.service.system.IAuthService. Tried 1 times of the providers [173.173.173.173:20880] (1/1) from the registry 192.168.101.9:6379 on the consumer 192.168.105.129 using the dubbo version 2.5.7. Last error is: Failed to invoke remote method: login, provider: dubbo://173.173.173.173:20880/cn.com.scooper.core.dsapi.service.system.IAuthService?anyhost=true&application=common-gis-web&cache=lru&check=false&default.accesslog=true&default.check=false&default.retries=0&default.timeout=30000&default.token=true&dubbo=2.8.4&generic=false&interface=cn.com.scooper.core.dsapi.service.system.IAuthService&logger=slf4j&methods=getPmPermByProKey,logout,loginTo,heartbeat,getAccountStatus,login&pid=6776®ister.ip=192.168.105.129&remote.timestamp=1512474168503&revision=1.4.2.0&side=consumer×tamp=1512474231192&token=false, cause: message can not send, because channel is closed . url:dubbo://173.173.173.173:20880/cn.com.scooper.core.dsapi.service.contacts.IOrgMemberService?anyhost=true&application=common-gis-web&cache=lru&check=false&codec=dubbo&default.accesslog=true&default.check=false&default.retries=0&default.timeout=30000&default.token=true&dubbo=2.8.4&generic=false&heartbeat=60000&interface=cn.com.scooper.core.dsapi.service.contacts.IOrgMemberService&logger=slf4j&methods=updateOrgMember,deleteOrgMember,insertOrgMember,queryOrgMember,listOrgMemberByOrgCode,findOrgMemberPath,findAccountByOrgMemberId,queryOrgMemberByDispArgs,getOrgMemberByParams,listOrgMember,changeOrgMemberSortIndex,listOrgMemberByFax,findOrgMemberByTel,listOrgMemTypeList&pid=6776®ister.ip=192.168.105.129&remote.timestamp=1512474169196&revision=1.4.2.0&side=consumer×tamp=1512474206259&token=false

at com.alibaba.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:101)

at com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:229)

at com.alibaba.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:72)

at com.alibaba.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:52)

at com.alibaba.dubbo.common.bytecode.proxy1.login(proxy1.java)

at cn.com.scooper.cmgis.web.service.auth.LoginServiceImpl.login(LoginServiceImpl.java:76)

...

3.并且发现注册中心中注册的IP地址也是个无法访问的IP地址:

4.查看服务提供方IP配置,发现有虚拟网卡地址:

5.处理方法(两种方法):
(1)删除服务提供方虚拟网卡地址
(2)设定服务提供方主机名确定的IP地址
(2.1)修改 /etc/sysconfig/hostname 的 HOSTNAME 为一个确定的名称
(如:test009)
(2.2)修改 /etc/hosts 添加正确的IP地址和(2.1)中设置的名称
(如:192.168.101.9 test009)
(2.3)重启网络服务(service network restart)

  1. 清空注册中心(清空Redis Key值)
  2. 重启两台主机tomcat,问题解决。

问题解决

该问题可能在如下情况出现:

  1. 设置了虚拟网卡
  2. 有多块网卡
  3. 进行了VPN拨号
  4. 程序员在Dubbo配置项中写死了Provider/Consumer的绑定地址。

 

思路是:Dubbo在注册中心注册时会填充当前主机的IP地址(调用方根据该地址来与服务提供方进行通信);当有多个地址时,Dubbo只能选其中的一个(通常是第一个非loopback IP);所以,只要能够让 Dubbo 能够找到正确的IP就可以了。

 

Dubbo对本机IP的搜索逻辑是:

  • 是否在Dubbo的配置里指定了确切的绑定地址,如果指定了,则使用该地址;
  • InetAddress.getLocalHost().getHostAddress() 获取 hostname 对应的 IP 地址(/etc/sysconfig/hostname 和 /etc/hosts 中结合配置);
  • 与注册中心创建Socket连接,从连接中获取IP(若有多网卡、虚拟IP、VPN 可能导致获取错误);
  • 遍历本地网卡,返回第一个合理的IP(非 loopback,非 0.0.0.0)。

 

猜你喜欢

转载自blog.csdn.net/abcyyjjkk/article/details/81901998
今日推荐