dubbo注册服务IP解析异常及IP解析源码分析
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解析源码分析相关推荐
- 【SpringCloud微服务】第3章 服务治理SpringCloudEureka(五)——Eureka源码分析
2.8 Eureka 源码分析 首先,对于服务注册中心.服务提供者.服务消费者这三个主要元素来说,后两者(也就是Eureka客户端)在整个运行机制中是大部分通信行为的主动发起者,而注册中心主要是处 ...
- Framework 源码解析知识梳理(5) startService 源码分析
一.前言 最近在看关于插件化的知识,遇到了如何实现Service插件化的问题,因此,先学习一下Service内部的实现原理,这里面会涉及到应用进程和ActivityManagerService的通信, ...
- java futuretask 源码解析_Java异步编程——深入源码分析FutureTask
Java的异步编程是一项非常常用的多线程技术. 之前通过源码详细分析了ThreadPoolExecutor<你真的懂ThreadPoolExecutor线程池技术吗?看了源码你会有全新的认识&g ...
- ViewPager异常,对ViewPager源码分析
今天遇到以下异常: java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's cont ...
- 源码解析2-GUI-绘制引擎(QPainter源码分析 )
Qt源码解析 索引 Qt图形用户界面 应用程序窗口 Qt GUI 模块中最重要的类是QGuiApplication和QWindow.想要在屏幕上显示内容的 Qt 应用程序需要使用这些.QGuiAppl ...
- java eventbus 原理_本文为 Android 开源项目实现原理解析 EventBus 部分,从源码分析 EventBus 的实现原理...
之前太忙导致 Android 开源项目实现原理解析 一度搁浅,目前一期进行中,我也完成了 EventBus 分析的初稿,大家可以稍微看看后面会继续润色下. PS:本文直接复制 Markdown,格式有 ...
- 安卓壁纸服务(动态壁纸)使用与源码分析
概览 安卓的动态壁纸可以归属到SystemUI中,是SystemUI管理的一部分,安卓支持静态壁纸,同时也支持动态壁纸(added in API level 7 ) 用户可以从设备的内部或者是外部存储 ...
- opencv源码解析之(6):hog源码分析
一.网上一些参考资料 在博客目标检测学习_1(用opencv自带hog实现行人检测) 中已经使用了opencv自带的函数detectMultiScale()实现了对行人的检测,当然了,该算法采 ...
- python flask源码解析_Flask知识全套及源码分析
Flask是一个短小精悍可扩展强的框架,他独特之处在于 "上下文管理机制",如果你想要学习Flask使用并了解其中的精髓,那就赶快上车吧.... 内容包含三部分: 1. Flask ...
- android 事件分发 代码解析,Android事件分发之源码分析
原文首发于微信公众号:躬行之,欢迎关注交流! 上篇文章中叙述了 Android 事件分发的大致流程,下面从 Activity.ViewGroup.View 三个方面介绍事件的相关方法,小节如下: Ac ...
最新文章
- 机翻降重?掩饰抄袭?SCI期刊上的这些「奇言怪语」,不少来自中国作者
- 暴雪应该从《争霸艾泽拉斯》中吸取什么教训?
- HTTP权威指南阅读笔记一:HTTP概述
- 7月发布?华为李昌竹确认Mate 50系列:会来的但不是现在
- Tensorflow笔记:MNIST数据集输出手写数字识别准确率
- Spark Mllib里数据集如何取前M行(图文详解)
- DataGridView:DataGridView控件清空绑定的数据
- mssql 获取2个时间之间相距的时分秒(取余数得秒)
- 【面向代码】学习 Deep Learning(三)Convolution Neural Network(CNN)
- USB-Blaster驱动安装失败 Code 39
- input框中的文字加下划线
- 分销开源微信小程序-真正意义上的开源
- 如何在CentOS8服务器上启用PowerTools
- NA公链(Nirvana)NAC公链独步公链江湖
- SIMULIA仿真技术研讨会浙江专场
- 微信小程序开发之城市选择器 城市切换
- 西南科技大学数据库实验二(Oracle 11g)
- 33、基于CACX和R7F0C004M的瑞萨单片机入门教程
- 江西理工大学南昌校区排名赛 F: 单身狗的骑马游戏
- Android 后台保活,这里有你需要的所有姿势。2019,flutterlistview滚动卡顿