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

6 篇文章 0 订阅

项目

描述

问题描述

多台主机部署,服务均正常运行,调用时报错“服务未注册”,日志中发现异常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)。

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值