https://www.cnblogs.com/leo-li-3046/p/5702479.html

在使用dubbo注册服务时会遇到IP解析错误导致无法正常访问.
比如: 本机设置的IP为172.16.11.111, 但实际解析出来的是180.20.174.11
这样就导致这个Service永远也无法被访问到, 而调用方一直报错.

当然若发现服务无法访问, 最好先通过dubbo-admin后台排查下注册的服务是否正常.

IP解析异常时的解决方法:

  • 绑定hostname+ip
    1. 先查看机器的hostname2. 修改hosts文件, 增加hostname 172.16.11.111
  • 配置nameserver
    排查机器上配置的nameserver是否有问题, 若存在无用的nameserver则直接删掉
  • 在dubbo的配置文件中写死host
    <dubbo:protocol host="172.16.11.111"/>或者在每个provider中绑定host<dubbo:provider host="172.16.11.111">

最好不要用第三种方式, 限制太多. 而且如果这样做了就不支持集群了.
dubbo的官网也不建议使用这种方式. 请慎用.

dubbo获取IP源码分析

/*** 判断host是否为不可用的本地Host*/public static boolean isInvalidLocalHost(String host) {return host == null || host.length() == 0|| host.equalsIgnoreCase("localhost")|| host.equals("0.0.0.0")|| (LOCAL_IP_PATTERN.matcher(host).matches());}/*** 获取本地Host.* 若address == null ? "127.0.0.1" : InetAddress.getHostAddress();*/public static String getLocalHost(){InetAddress address = getLocalAddress();return address == null ? LOCALHOST : address.getHostAddress();}private void doExportUrlsFor1Protocol(ProtocolConfig protocolConfig, List<URL> registryURLs) {......//1. 先从ProtocolConfig中取host. 若没有配置则为nullString host = protocolConfig.getHost();//2. 再从ProviderConfig中取host. 若没有配置则为nullif (provider != null && (host == null || host.length() == 0)) {host = provider.getHost();}boolean anyhost = false;//3. 若取出的是本地host, 则继续取hostif (NetUtils.isInvalidLocalHost(host)) {anyhost = true;try {//4. 通过InetAddress的方式获取Host//默认读取本机hosts中hostname对应的IP//如: 你在hosts中配置了 leo 172.16.11.111//则读取的IP就是172.16.11.111host = InetAddress.getLocalHost().getHostAddress();} catch (UnknownHostException e) {logger.warn(e.getMessage(), e);}if (NetUtils.isInvalidLocalHost(host)) {if (registryURLs != null && registryURLs.size() > 0) {for (URL registryURL : registryURLs) {try {Socket socket = new Socket();try {//5. 通过Socket的方式获取Host//一般解析到这里, 都会获取到正确的本地IP, 除非你有多网卡, 或者有VPN, 导致无法正常解析.SocketAddress addr = new InetSocketAddress(registryURL.getHost(), registryURL.getPort());socket.connect(addr, 1000);host = socket.getLocalAddress().getHostAddress();break;} finally {try {socket.close();} catch (Throwable e) {}}} catch (Exception e) {logger.warn(e.getMessage(), e);}}}//6. 遍历本地网卡, 返回第一个合理的Host//最后一个大招. 当上述都解析不到时, 则会遍历本地网卡.//逐个获取IP, 直到有一个合理的IP为止.if (NetUtils.isInvalidLocalHost(host)) {host = NetUtils.getLocalHost();}}}...}
    /*** 遍历本地网卡,返回第一个合理的IP。* @return 本地网卡IP*/public static InetAddress getLocalAddress() {if (LOCAL_ADDRESS != null)return LOCAL_ADDRESS;InetAddress localAddress = getLocalAddress0();LOCAL_ADDRESS = localAddress;return localAddress;}/*** 遍历本地网卡,返回第一个合理的IP。* @return 本地网卡IP*/private static InetAddress getLocalAddress0() {InetAddress localAddress = null;try {localAddress = InetAddress.getLocalHost();if (isValidAddress(localAddress)) {return localAddress;}} catch (Throwable e) {logger.warn("Failed to retriving ip address, " + e.getMessage(), e);}try {Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();if (interfaces != null) {while (interfaces.hasMoreElements()) {try {NetworkInterface network = interfaces.nextElement();Enumeration<InetAddress> addresses = network.getInetAddresses();if (addresses != null) {while (addresses.hasMoreElements()) {try {InetAddress address = addresses.nextElement();if (isValidAddress(address)) {return address;}} catch (Throwable e) {logger.warn("Failed to retriving ip address, " + e.getMessage(), e);}}}} catch (Throwable e) {logger.warn("Failed to retriving ip address, " + e.getMessage(), e);}}}} catch (Throwable e) {logger.warn("Failed to retriving ip address, " + e.getMessage(), e);}logger.error("Could not get local host ip address, will use 127.0.0.1 instead.");return localAddress;}

dubbo注册服务IP解析异常及IP解析源码分析相关推荐

  1. 【SpringCloud微服务】第3章 服务治理SpringCloudEureka(五)——Eureka源码分析

    2.8 Eureka 源码分析   首先,对于服务注册中心.服务提供者.服务消费者这三个主要元素来说,后两者(也就是Eureka客户端)在整个运行机制中是大部分通信行为的主动发起者,而注册中心主要是处 ...

  2. Framework 源码解析知识梳理(5) startService 源码分析

    一.前言 最近在看关于插件化的知识,遇到了如何实现Service插件化的问题,因此,先学习一下Service内部的实现原理,这里面会涉及到应用进程和ActivityManagerService的通信, ...

  3. java futuretask 源码解析_Java异步编程——深入源码分析FutureTask

    Java的异步编程是一项非常常用的多线程技术. 之前通过源码详细分析了ThreadPoolExecutor<你真的懂ThreadPoolExecutor线程池技术吗?看了源码你会有全新的认识&g ...

  4. ViewPager异常,对ViewPager源码分析

    今天遇到以下异常: java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's cont ...

  5. 源码解析2-GUI-绘制引擎(QPainter源码分析 )

    Qt源码解析 索引 Qt图形用户界面 应用程序窗口 Qt GUI 模块中最重要的类是QGuiApplication和QWindow.想要在屏幕上显示内容的 Qt 应用程序需要使用这些.QGuiAppl ...

  6. java eventbus 原理_本文为 Android 开源项目实现原理解析 EventBus 部分,从源码分析 EventBus 的实现原理...

    之前太忙导致 Android 开源项目实现原理解析 一度搁浅,目前一期进行中,我也完成了 EventBus 分析的初稿,大家可以稍微看看后面会继续润色下. PS:本文直接复制 Markdown,格式有 ...

  7. 安卓壁纸服务(动态壁纸)使用与源码分析

    概览 安卓的动态壁纸可以归属到SystemUI中,是SystemUI管理的一部分,安卓支持静态壁纸,同时也支持动态壁纸(added in API level 7 ) 用户可以从设备的内部或者是外部存储 ...

  8. opencv源码解析之(6):hog源码分析

    一.网上一些参考资料     在博客目标检测学习_1(用opencv自带hog实现行人检测) 中已经使用了opencv自带的函数detectMultiScale()实现了对行人的检测,当然了,该算法采 ...

  9. python flask源码解析_Flask知识全套及源码分析

    Flask是一个短小精悍可扩展强的框架,他独特之处在于 "上下文管理机制",如果你想要学习Flask使用并了解其中的精髓,那就赶快上车吧.... 内容包含三部分: 1. Flask ...

  10. android 事件分发 代码解析,Android事件分发之源码分析

    原文首发于微信公众号:躬行之,欢迎关注交流! 上篇文章中叙述了 Android 事件分发的大致流程,下面从 Activity.ViewGroup.View 三个方面介绍事件的相关方法,小节如下: Ac ...

最新文章

  1. 机翻降重?掩饰抄袭?SCI期刊上的这些「奇言怪语」,不少来自中国作者
  2. 暴雪应该从《争霸艾泽拉斯》中吸取什么教训?
  3. HTTP权威指南阅读笔记一:HTTP概述
  4. 7月发布?华为李昌竹确认Mate 50系列:会来的但不是现在
  5. Tensorflow笔记:MNIST数据集输出手写数字识别准确率
  6. Spark Mllib里数据集如何取前M行(图文详解)
  7. DataGridView:DataGridView控件清空绑定的数据
  8. mssql 获取2个时间之间相距的时分秒(取余数得秒)
  9. 【面向代码】学习 Deep Learning(三)Convolution Neural Network(CNN)
  10. USB-Blaster驱动安装失败 Code 39
  11. input框中的文字加下划线
  12. 分销开源微信小程序-真正意义上的开源
  13. 如何在CentOS8服务器上启用PowerTools
  14. NA公链(Nirvana)NAC公链独步公链江湖
  15. SIMULIA仿真技术研讨会浙江专场
  16. 微信小程序开发之城市选择器 城市切换
  17. 西南科技大学数据库实验二(Oracle 11g)
  18. 33、基于CACX和R7F0C004M的瑞萨单片机入门教程
  19. 江西理工大学南昌校区排名赛 F: 单身狗的骑马游戏
  20. Android 后台保活,这里有你需要的所有姿势。2019,flutterlistview滚动卡顿

热门文章

  1. ngrok使用/踩坑分析-http代理
  2. cuda、Nvidia driver、GCC版本对应关系
  3. java求几何周长面积_java求几何图形面积
  4. go文件下载(普通文件和压缩文件)
  5. 【经济学视频课程】科斯定理的本质…
  6. VIII openstack(2)
  7. PicPick软件系统语言设置
  8. 《树莓派实战秘籍》——1.15 技巧15连接GPIO脚到面包板上
  9. Java面试题(一)100家大公司java笔试题汇总
  10. Akka(6): become/unbecome:运算行为切换