环境:Cent OS 7.0

背景:
这篇文章的标题可以设置为如下几个,因为他都是同一个解决方法:
(1)Dubbo注册zookepper时为什么会自动使用内网IP?
(2)Dubbo消费者无法连接到生产者提供的服务
(3)。。。

场景还原
1、项目部署架构

最近在开发一个项目,使用到Dubbo服务,以下是项目部署的情况,

详细说明如下(IP地址不具有可连通性,为了具体情况假设,大家不要试了!):

1、服务器A上部署Dubbo服务的生产者,公网IP:139.229.17.226,内网IP:10.12.11.3;

2、服务器B上部署了Dubbo注册中心服务Zookeeper和Dubbo后台管理界面程序dubbo-admin,公网IP:139.229.17.227,内网IP:10.12.11.4;

3、开发机C是我自己的PC,用于开发Dubbo服务的消费者项目,远端请求发送的IP地址为:169.254.45.169;

服务器A与B是位于公网IP的服务器(阿里云服务器)。

2、所遇到的问题

1、生产者成功部署到服务器A;
2、生产者可以成功注册到Zookeeper中心且Zookeeper服务正常;
3、所有需要的端口都已经打开(通过防火墙进行设置);
4、生产者项目、消费者项目使用的Dubbo的IP地址均为公网IP,且均正确;

在上述的情况下,出现开发机C上的Dubbo消费者无法找到服务器A上运行的Dubbo生产者,并且出现错误:

Caused by: java.lang.IllegalStateException: Failed to check the status of the service com.ufind.server.facade.JointModuleFacade. No provider available for the service com.ufind.server.facade.JointModuleFacade:1.0.0 from the url zookeeper://139.229.17.226:2181/com.alibaba.dubbo.registry.RegistryService?anyhost=true&application=UFind_Security&check=false&cluster=failfast&dubbo=2.8.4&executes=10&generic=false&interface=com.ufind.server.facade.JointModuleFacade&methods=pageAllIllegalRequirements,evaluateIdentify,focusOn,listAllRequirementMainPage,findProBaseInfoByProId,firstPartyEvaluate,viewProjectList,getProStatus,firstPartyAcceptance,secondPartyAcceptance,viewThisProject,getEvaluateFirstToSecond,deleteSignUp,secondPartyEvaluate,updateJointIndex,acceptanceIdentity,find,adminAcceptance,getEvaluateSecondToFirst,signUp,getProJointWithSPId,returnFocusOrSignUp,checkIn,listAllAcptRqr,signUpCheck,viewThisProjectSimple,getProJointWithFPId,findWhoSignMyRequire,getProJointWithFPIdShowUserName&organization=MyUFind&owner=liugen.xu&pid=15924&revision=1.0.0-SNAPSHOT&side=consumer&timeout=500000&timestamp=1475137563583&version=1.0.0 to the consumer 169.254.45.169 use dubbo version 2.8.4

可以看出服务名为:com.ufind.server.facade.JointModuleFacade:1.0.0;
注册中心:zookeeper://139.229.17.226:2181;

意思就是在这和注册中心中没有找到这个服务的提供者,但是在dubbo-admin中确实存在这个服务的:

值得注意的是,这个地方的IP地址是我服务器A的内网IP地址,于是又找了一个错误的地方如下:

15:18:30 [WARN ] AbstractClient.:112-[]- [DUBBO] Failed to start NettyClient DESKTOP-NT000EP/169.254.45.169 connect to the server /10.12.11.3:20880 (check == false, ignore and retry later!), cause: client(省略具体的服务全称) failed to connect to server /10.47.184.14:20880 client-side timeout 3000ms (elapsed: 3040ms) from netty client 169.254.45.169 using dubbo version 2.8.4, dubbo version: 2.8.4, current host: 169.254.45.169

com.alibaba.dubbo.remoting.RemotingException: client(省略具体的服务全称) failed to connect to server /10.47.184.14:20880 client-side timeout 3000ms (elapsed: 3040ms) from netty client 169.254.45.169 using dubbo version 2.8.4

意思就是从:server /10.12.11.3:20880中获取服务的,很明显的这是一个内网IP地址,但是却出现在我的开发机C上,也就是说我的本地开发机C是无法找到公网IP服务器的内网IP地址的,所以无法获取Dubbo生产者提供的服务。

真相是否如此,做了一个实验,把生产者和消费者都部署到另一台阿里云服务器C上,如下:

事实证明,结果是正确的,在同一网络环境下,同样的配置是没有问题的,也就是说在统一环境下,内网是可以相互通信的。

因此问题的所在,归根于我的项目中Dubbo生产者的注册中心IP、Dubbo服务消费者注册中心的IP均设置的为公网IP,但是为什么经过注册中心这一程序,消费者查找生产者的IP地址变为内网IP地址了呢?

问题根源所在
Dubbo服务的消费者在向Zookeeper服务中心寻找服务的时候,Zookeeper将Dubbo服务生产者的内网地址给了消费者,所以才会出现:client(省略具体的服务全称) failed to connect to server /10.47.184.14:20880

这样的话,对于开发机C来说,这个内网是不具有可达性的,所以找不到服务的提供者。

找到了问题的原因,那么这个问题是由什么造成的呢?

这是由于在服务器hosts配置的文件中,将主机名指向了内网IP地址,查看我的服务器A和B的hosts配置文件如下:

服务器A的hosts文件为:

127.0.0.1 localhost
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.12.11.3 iZ132oqrrt7uZ

服务器B的hosts文件为:

127.0.0.1 localhost
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.12.11.3 iZ132oqrrt7uZ
10.12.11.4 iZuf6gd6n1wwjoZ

可以在上边看出,主机名都指向了内网IP,因此需要将他们改回具体的公网IP地址,或者直接删除,就可以解决问题。

分别对应的改成如下所示:

127.0.0.1 localhost
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
139.229.17.226 iZ132oqrrt7uZ
127.0.0.1 localhost
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
139.229.17.226 iZ132oqrrt7uZ
139.229.17.227 iZuf6gd6n1wwjoZ

然后依次重新启动:Zookeeper服务–>重启Dubbo服务生产者–>重启Dubbo服务消费者,既可以成功运行。

可以看出上边的IP地址已经变为公网的IP地址了,然后在自己的开发机C上重新运行Dubbo消费者项目,也可以成功的运行,得到生产者提供的服务。

总结
如果你在确定你的所有配置是正确的,指定的Zookeeper注册中心IP地址是正确的,所有使用到的端口都已经通过防火墙的配置的话,遇到无法获取生产者提供的服务,或者注册失败等信息的话,不妨看一下是不是因为内网IP造成的。

因为,我的这个项目使用的是阿里云的云服务器,有两台,即是上文中的服务器A和服务器B,遇到这个问题之后发现阿里云默认的为我们将内网IP和主机名进行了关联,即是hosts文件的配置:

图片做了处理,应该可以看得懂!

但是,我看了同等配置的腾讯云服务器,就没有了这个事情,没有自动指定。

所以,大家以后再遇到这个问题的时候,首先可以看一下是不是已经踏进了这个坑!

其他相关的文章:

1、Dubbo详细介绍与安装使用过程

2、Dubbo无法访问远程Zookeeper已注册服务的问题

3、Dubbo-admin无法显示Group分组信息
————————————————
版权声明:本文为CSDN博主「徐刘根」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xlgen157387/article/details/52702659

Dubbo host配置映射内网IP导致消费者无法连接到生产者提供的服务详解相关推荐

  1. (SVN笔记)https外网IP端口映射内网IP端口访问SVN服务端

    目录 1.前言 2.花生壳优点与相关技术 3.设置SVN服务器 4.外网IP映射内网IP访问SVN Server 5.总结 1.前言         上一章介绍了局域网内https服务端配置与客户端联 ...

  2. (SVN笔记)https内网IP端口配置SVN服务端+内网SVN客户端联合使用

    目录 1.前言 2.SVN服务端设置 3.开始使用SVN (1)新建版本库 (2)迁入项目到SVN服务端 (3)检索项目/拉取项目check out (4)提交代码commit (5)更新代码upda ...

  3. 公网域名如何解析到内网IP服务器——快解析域名映射外网访问

    在本地搭建主机应用后,由于没有公网IP或没有公网路由权限,在需要发布互联网时,就需要用到外网访问内网的一些方案.由于内网IP在外网不能直接访问,通常就用通过外网域名来访问内网的方法.那么,公网域名如何 ...

  4. 如何实现外网访问内网ip?公网端口映射或内网映射来解决

    本地搭建服务器应用,在局域网内可以访问,但在外网不能访问.如何实现外网访问内网ip?主要有两种方案:路由器端口映射和快解析内网映射.根据自己本地网络环境,结合是否有公网IP,是否有路由权限,设置让外网 ...

  5. 内网ip如何变成公网ip?快解析转换域名映射外网访问

    内网IP只能在本地内部网络连接访问,当本地搭建服务器部署好相关网站或应用后,在局域网内可以通过内网IP访问,但在外网是无法直接访问异地内网IP端口应用的,只有公网IP才能实现外网访问.但公网IP已经成 ...

  6. NAT外网访问内网方法,内网端口映射外网ip

    由于公网IP地址有限,不少ISP都采用多个内网用户通过代理和网关路由共用一个公网IP上INTERNET的方法,这样就限制了这些用户在自己计算机上架设个人网站,要实现在这些用户端架设网站,最关键的一点是 ...

  7. 更换公司核心路由器案例配置---1.console初始配置-2.用户配置-3.telnet登录配置-4.NAT端口映射配置-5.内网服务器配置-6.链路聚合配置-7.DHCP和DNS配置

    一.场景 因公司核心路由器老旧,运行不稳定,对旧路由器进行更换,要在路由器上实现以下功能. 1.模拟新机console初始配置:         2.用户配置:         3.模拟通过telne ...

  8. 内网ip映射到外网(路由器是tp-link)

    参考:https://service.tp-link.com.cn/detail_article_3403.html 1.ipconfig查看服务器所在的网关,浏览器访问网关ip(eg:192.168 ...

  9. 配置haproxy支持使用多个lan内网ip做负载均衡以突破haproxy机只支持64k连接(突破单ip 65535端口限制)

    https://www.iamle.com/archives/1865.html 前言 haproxy配置文件重要参数,有端口数目限制:  global     maxconn 65535 #最大连接 ...

最新文章

  1. 【vivado】debug hub时钟不匹配
  2. 用高中数学理解AI “深度学习”的基本原理
  3. golang flag包使用示例:接收命令行参数
  4. (转)更新Java final常量后,请重新编译你的class
  5. Spring_HelloWord
  6. 媒体应用大数据,先解决三大难题
  7. win7 activemq_带有骆驼,ActiveMQ,Elasticsearch的关键HL7用例
  8. java小项目实例,成功入职阿里
  9. linux -- read(), write()
  10. 钉钉电脑版怎么创建共享文件 钉钉文件共享的方法
  11. 编程语言 Ruby 如何还能再活 25 年?
  12. python3 获取电脑上某个点的颜色RGB值
  13. 五笔字根口诀(五笔86字根表)
  14. 蚩尤战团--管理分布
  15. 高级软件工程(2022春)课程总结
  16. Uderstanding and using Pointers 读书笔记
  17. Canvas 贪吃蛇大作战
  18. 低频相位计的校准方法
  19. EasyCVR通过大华SDK接入设备不能进行云台控制,如何判断是否为设备问题?
  20. 【调剂】华中师范大学伍伦贡联合研究院2021年单学位项目接收第一轮申请通知...

热门文章

  1. ACM-音频编解码器管理器
  2. 【I²C总线通信协议总结】
  3. c语言程序设计迷宫问题,C语言迷宫问题
  4. mysql锁表原因及解决
  5. 信息熵:什么是信息熵?
  6. 父类引用和子类引用之间 的关系
  7. 有了字节流,为什么还要有字符流
  8. 面经(各种面试内容)
  9. ORACLE学习详解
  10. 剪贴板操作 Clipboard API 使用教程