今天在跑dubbo 的 DemoService 2.5.4-SNAPSHOT版本的时候,遇到到一个奇怪的问题。consumer怎么都连接不上provider的服务。最后才发现是由于dubbo自 己实现的检测本地IP地址代码不够强壮造成的。你这里的provider实际上是运行在A地址上,但是dubbo检测到本地的IP地址是B,然后他在 zookeeper上注册自己的服务地址的时候,用的是这个B这个IP地址,那么当consumer连接到zookeeper上的时候,查询到 DemoService是在B上的,显然这个IP地址上并没有这样的dubbo服务,那么这个consumer就肯定不能成功。

为什么dubbo检测本地IP地址的结果是错的,因为dubbo检测本地IP地址的策略是先调用InetAddress.getLocalHost,如果
该方法返回一个合法的地址,则直接认为是本地的IP地址,否则会枚举本地所有网卡,并返回第一个合法的IP地址作为本地地址。

坑爹的就是InetAddress.getLocalHost返回了一个错误的IP地址。为什么这个函数会返回一个错误的地址,因为这个函数的原理是通过
获取本机的hostname,然后对此hostname做解析,从而获取IP地址的。那么问题来了,如果在本机的/etc/hosts文件里对这个主机名
指向了一个错误的IP地址,那么InetAddress.getLocalHost就会返回这个错误的IP地址。当然如果你的hostname是到DNS
去解析的,碰巧DNS上的信息也是错的,也同样是悲惨结局。

遇到同样问题的人,可以先检查下hosts文件的设置里面A地址指向哪里了,然后看一下DNS解析出的地址。当然如果dubbo的代码检查一下,这个返回
的地址,是不是真的是本机的IP地址,也不会出现这个问题了,归根结底还是dubbo的卡发人员太相信InetAddress.getLocalHost
了,这货自己应该确保不会出现这样的乌龙事件的。你返回一个不是本机的IP地址作为本机的IP地址,这个在语义上就错误了。不管你用了多么愚蠢的算法,结
果就是不应该返回一个不是本地的IP地址作为本地的地址,不是吗?否则还叫什么狗屁get local host!!!

我为什么说InetAddress.getLocalHost的算法是愚蠢的,是因为这个尽管可能会被hosts文件和DNS误导,但是显然这两个地方都
不是本机IP地址的权威获取处,权威获取处是网卡本身的配置信息。即便你要使用一个不靠谱来源的信息,你至少跟本机的网卡地址做一下校验嘛!如果你实在是
不知道怎么获取,抛出个异常说明一下你的无能为力,大家也是可以接受的嘛!犯不着给个错误的信息,让这么多人掉坑里,浪费时间,对不对?

最后,dubbo检测本地地址的代码位于:
dubbo-common/src/main/java/com/alibaba/dubbo/common/utils/NetUtils.java里的getLocalAddress函数,可以看一下。

最新文章

  1. Chrome 控制台新玩法-console显示图片以及为文字加样式
  2. C标准头文件<string.h>
  3. JavaScript中作用域和作用域链解析
  4. ubuntu中常用软件的安装
  5. 第四十一章 微服务CICD(3)- jenkins + gitlab + webhooks + publish-over-ssh(1)
  6. CAD2015安装教程 AutoCAD2015中文版安装激活图文教程
  7. 《Effective C++》第三版笔记
  8. linux网络编程-(socket套接字编程UDP传输)
  9. JS常用的设计模式(8)——访问者模式
  10. 【原创】关于MVC自己新建的 action,Controller提示找不到页面的问题
  11. sharepoint 2013 suitbar
  12. 我的创业劲儿,无可阻挡-JAVA学院张孝伟
  13. Robot Framework源码解析(2) - 执行测试的入口点
  14. VS2017中的nuget还原失败或超时的解决方案
  15. vue 自学笔记记录
  16. Open Graph Protocol(开放内容协议)
  17. rabbitmq - java client lib一二事
  18. 前端框架VUE----node.js的简单介绍
  19. @Autowired用法详解
  20. Git------如何使用Git Bash Here提交代码

热门文章

  1. 安卓开发_数据存储技术_SharedPreferences类
  2. Android BitmapUtils工具类
  3. Element隐藏组件:scrollbar
  4. c#所有部门及其下所部门生成树形图(递归算法获取或键值对方式获取)
  5. 洗礼灵魂,修炼python(54)--爬虫篇—urllib2模块
  6. 使用缓存方式优化递归函数与lru_cache
  7. Python基础知识:集合
  8. 8.1Python面向对象编程(一)
  9. VRS生成的虚拟观测值存在的问题
  10. python下载脚本