`
m635674608
  • 浏览: 5041873 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

dubbo 机器多IP问题的解决

 
阅读更多

承载dubbo服务的机器多IP时,需要指定dubbo服务需要绑定到的IP(dubbo.protocol.host),确保登记到注册中心的提供者或者消费者的IP之间可以互相ping通

此IP与具体环境有关,上生产环境时,需要进行增量配置



 

 

=========================

绑定IP,DUBBO 怎么做的

 

通常绑定本机ip地址 一般如下

 

Java代码  收藏代码
  1. InetSocketAddress address = new InetSocketAddress(port);  
  2. Channel serverChannel = bootstrap.bind(address);  

 

 

InetSocketAddress默认使用的是什么ip呢?看看内部代码就明白了:

Java代码  收藏代码
  1. public InetSocketAddress(int port) {  
  2.    this(InetAddress.anyLocalAddress(), port);  
  3. }  

 

InetAddress.anyLocalAddress()一般就是0.0.0.0/0.0.0.0,如果我们有两块网卡,一块内网,一块外网,那么都能访问这个socket,这通常是不安全的。那么通过InetAddress.getLocalHost().getHostAddress()呢?

结果悲剧了,使用上面的代码取回的是127.0.0.1。

 

好了,看看dubbo是怎么解决,dubbo获取本机ip地址的方法封装在com.alibaba.dubbo.common.utils.NetUtils类里面。

Java代码  收藏代码
  1. import java.net.InetAddress;  
  2. import java.net.NetworkInterface;  
  3. import java.util.Enumeration;  
  4. import java.util.regex.Pattern;  
  5.   
  6. import org.slf4j.Logger;  
  7. import org.slf4j.LoggerFactory;  
  8.   
  9. public class NetUtils {  
  10.   
  11.     private static final Logger  logger           = LoggerFactory.getLogger(NetUtils.class);  
  12.   
  13.     private static final Pattern IP_PATTERN       = Pattern.compile("\\d{1,3}(\\.\\d{1,3}){3,5}$");  
  14.   
  15.     private static final Pattern LOCAL_IP_PATTERN = Pattern.compile("127(\\.\\d{1,3}){3}$");  
  16.   
  17.     public static final String   ANYHOST          = "0.0.0.0";  
  18.   
  19.     public static final String   LOCALHOST        = "127.0.0.1";  
  20.   
  21.     private static boolean isValidAddress(InetAddress address) {  
  22.         if (address == null || address.isLoopbackAddress()) return false;  
  23.         String name = address.getHostAddress();  
  24.         return (name != null && !ANYHOST.equals(name) && !LOCALHOST.equals(name) && IP_PATTERN.matcher(name).matches());  
  25.     }  
  26.   
  27.     public static boolean isLocalHost(String host) {  
  28.         return host != null && (LOCAL_IP_PATTERN.matcher(host).matches() || host.equalsIgnoreCase("localhost"));  
  29.     }  
  30.   
  31.     public static boolean isAnyHost(String host) {  
  32.         return "0.0.0.0".equals(host);  
  33.     }  
  34.   
  35.     private static volatile InetAddress LOCAL_ADDRESS = null;  
  36.   
  37.     /** 
  38.      * 遍历本地网卡,返回第一个合理的IP。 
  39.      *  
  40.      * @return 本地网卡IP 
  41.      */  
  42.     public static InetAddress getLocalAddress() {  
  43.         if (LOCAL_ADDRESS != null) {  
  44.             return LOCAL_ADDRESS;  
  45.         }  
  46.         InetAddress localAddress = getLocalAddress0();  
  47.         LOCAL_ADDRESS = localAddress;  
  48.         return localAddress;  
  49.     }  
  50.   
  51.     private static InetAddress getLocalAddress0() {  
  52.         InetAddress localAddress = null;  
  53.         try {  
  54.             localAddress = InetAddress.getLocalHost();  
  55.             if (isValidAddress(localAddress)) {  
  56.                 return localAddress;  
  57.             }  
  58.         } catch (Throwable e) {  
  59.             logger.warn("Failed to retriving ip address, " + e.getMessage(), e);  
  60.         }  
  61.         try {  
  62.             Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();  
  63.             if (interfaces != null) {  
  64.                 while (interfaces.hasMoreElements()) {  
  65.                     try {  
  66.                         NetworkInterface network = interfaces.nextElement();  
  67.                         Enumeration<InetAddress> addresses = network.getInetAddresses();  
  68.                         if (addresses != null) {  
  69.                             while (addresses.hasMoreElements()) {  
  70.                                 try {  
  71.                                     InetAddress address = addresses.nextElement();  
  72.                                     if (isValidAddress(address)) {  
  73.                                         return address;  
  74.                                     }  
  75.                                 } catch (Throwable e) {  
  76.                                     logger.warn("Failed to retriving ip address, " + e.getMessage(), e);  
  77.                                 }  
  78.                             }  
  79.                         }  
  80.                     } catch (Throwable e) {  
  81.                         logger.warn("Failed to retriving ip address, " + e.getMessage(), e);  
  82.                     }  
  83.                 }  
  84.             }  
  85.         } catch (Throwable e) {  
  86.             logger.warn("Failed to retriving ip address, " + e.getMessage(), e);  
  87.         }  
  88.         logger.error("Could not get local host ip address, will use 127.0.0.1 instead.");  
  89.         return localAddress;  
  90.     }  
  91.   
  92. }  

 简单的说就是通过NetworkInterface遍历网卡address,然后通过isValidAddress校验ip是否正常即可。需要注意的一点是,dubbo通过Pattern.compile("\\d{1,3}(\\.\\d{1,3}){3,5}$")判断ip是否合法,也就是说不能保证只返回内网ip!

 

=====================================

 

 http://curious.iteye.com/blog/2286476

分享到:
评论

相关推荐

    解决dubbo错误ip及ip乱入问题的方法

    Dubbo 错误 IP 及 IP 乱入问题解决方法 在 Dubbo 框架中,服务注册在 Zookeeper 中,但是注册的 IP 不是本地的 IP,这将导致 Consumer 无法找到 Provider,无法访问服务。今天,我们将分享解决 Dubbo 错误 IP 及 IP...

    dubbo+zookeeper集成搭建

    Dubbo 和 ZooKeeper 是两个广泛使用的开源项目,它们分别解决了不同层面的问题。Dubbo 是一款高性能、轻量级的 Java RPC 框架,而 ZooKeeper 是一个分布式的、开放源码的协同服务管理系统,常用于实现服务发现、配置...

    dubbo控制台文件

    Dubbo是阿里巴巴开源的一款高性能、轻量级的Java RPC框架,它主要解决的是分布式系统中的服务调用问题,使得服务提供者和消费者之间能够透明地进行通信。Dubbo提供了服务注册、服务发现、负载均衡、容错机制等核心...

    灰度系统(基于dubbo、spring扩展实现的接入层灰度、服务层灰度、mq灰度、外部调用灰度,支持多套灰度环境).zip

    在这个“灰度系统”中,基于dubbo和spring扩展的实现,我们可以看到一套完整的灰度测试解决方案,包括接入层灰度、服务层灰度、MQ(消息队列)灰度以及外部调用灰度,支持多套灰度环境。这样的系统设计有助于开发者...

    Java Dubbo面试及答案

    1. 服务提供者端设置超时时间,在 Dubbo 的用户文档中,推荐如果能在服务端多配置就尽量多配置,因为服务提供者比消费者更清楚自己提供的服务特性。 2. 服务消费者端设置超时时间,如果在消费者端设置了超时时间,以...

    dubbo 参考

    2. **垂直应用架构**:随着访问量的增加,单一应用增加机器带来的效果递减,此时需要将应用拆分成多个相互独立的应用,以提高效率。 3. **分布式服务架构**:随着垂直应用数量的增加,应用之间的交互变得不可避免...

    史上最全40道Dubbo面试题!.zip

    39. **Dubbo如何处理服务的分片问题?** 可以通过分区策略,根据请求参数的不同将请求路由到不同的服务实例。 40. **Dubbo服务如何实现数据一致性?** 可以借助分布式事务解决方案,如2PC、TCC、Saga等,保证跨...

    Zookeeper面试题 20道.pdf

    Dubbo是一个管理中间层的工具,在业务层到数据仓库间有非常多服务的接入和服务提供者需要调度,Dubbo提供一个框架解决这个问题。Zookeeper和Dubbo的关系:Dubbo将注册中心进行抽象,它可以外接不同的存储媒介给注册...

    zookeeper的介绍和使用.docx

    如果我们每台机器里都备有一份域名到 IP 地址的映射,这个倒是能解决一部分问题,但是如果域名对应的 IP 发生变化了又该怎么办呢?于是我们有了 DNS 这个东西。我们只需要访问一个大家熟知的(known)的点,它就会...

    微服务注册中心演变过程1

    其次,如果订单服务获取到的IP对应的机器宕机,将导致调用失败。最后,如果注册中心自身出现问题,整个服务发现机制都将受到影响。 为优化这一流程,注册中心引入了心跳机制。服务实例会定期发送心跳信息到注册中心...

    蚂蚁、头条、拼多多的面试总结.zip

    在IT行业中,面试是每个...而"interview-master"可能是面试准备资料或经验分享文档,包含更多具体的问题和解答。为了成功通过这些公司的面试,求职者需要扎实的计算机基础知识,实践经验,以及对所在行业的深刻理解。

    ZooKeeper应用场景

    2. **分布式日志收集系统**:在分布式环境中,日志收集器可以根据应用程序名称在ZooKeeper上创建相应的节点,并将所有相关机器IP作为子节点注册。这种方式可以在机器发生变动时,自动调整收集任务,确保日志收集的...

    公司面试题

    7. **大型互联网公司面试题**:可能涉及分布式系统设计,例如CAP理论,微服务架构,消息队列(如Kafka、RabbitMQ),服务治理(如Dubbo、Spring Cloud),负载均衡,数据一致性解决方案(如Paxos、Raft)。...

    各个公司面试题 面试题

    2. **数据结构**:理解并运用各种数据结构(如数组、链表、栈、队列、哈希表、树、图等)是基础,面试时可能会要求设计和实现数据结构,以及解决与之相关的算法问题。 3. **算法**:包括排序(快速排序、归并排序、...

    高级Java人才培训专家-微服务保护

    Sentinel作为一款强大的微服务流量控制组件,不仅能够有效地解决微服务架构下的雪崩问题,还能通过流量控制、隔离和降级、授权规则等功能提供全方位的保护。通过对Sentinel的深入学习和应用,可以帮助开发者更好地...

    网络协议3-41

    在这个“网络协议3-41”主题中,我们可以深入探讨多个关键的网络协议及其应用。 1. **流媒体协议**(第16章):流媒体协议如RTMP、HLS、DASH等,使得实时视频和音频内容能通过互联网高效传输。例如,在直播中,这些...

    zookeeper之分布式环境搭建.zip

    在IT行业中,ZooKeeper是一个至关重要的组件,尤其在分布式系统的设计和管理中扮演着核心角色。本教程将深入探讨如何在分布式环境下搭建Zookeeper...在实践中不断探索,才能更好地利用Zookeeper解决实际的分布式问题。

    PHP高性能服务化框架介绍.pptx

    新老订单系统对比显示,RT降低了约10倍,所需机器数量也大幅减少。 总之,PSF作为一款PHP高性能服务化框架,通过技术创新和优化,成功地提升了PHP在服务化场景下的性能,为企业级服务化提供了有力支撑。

Global site tag (gtag.js) - Google Analytics