承载dubbo服务的机器多IP时,需要指定dubbo服务需要绑定到的IP(dubbo.protocol.host),确保登记到注册中心的提供者或者消费者的IP之间可以互相ping通
此IP与具体环境有关,上生产环境时,需要进行增量配置
=========================
绑定IP,DUBBO 怎么做的
通常绑定本机ip地址 一般如下
- InetSocketAddress address = new InetSocketAddress(port);
- Channel serverChannel = bootstrap.bind(address);
InetSocketAddress默认使用的是什么ip呢?看看内部代码就明白了:
- public InetSocketAddress(int port) {
- this(InetAddress.anyLocalAddress(), port);
- }
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类里面。
- import java.net.InetAddress;
- import java.net.NetworkInterface;
- import java.util.Enumeration;
- import java.util.regex.Pattern;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- public class NetUtils {
- private static final Logger logger = LoggerFactory.getLogger(NetUtils.class);
- private static final Pattern IP_PATTERN = Pattern.compile("\\d{1,3}(\\.\\d{1,3}){3,5}$");
- private static final Pattern LOCAL_IP_PATTERN = Pattern.compile("127(\\.\\d{1,3}){3}$");
- public static final String ANYHOST = "0.0.0.0";
- public static final String LOCALHOST = "127.0.0.1";
- private static boolean isValidAddress(InetAddress address) {
- if (address == null || address.isLoopbackAddress()) return false;
- String name = address.getHostAddress();
- return (name != null && !ANYHOST.equals(name) && !LOCALHOST.equals(name) && IP_PATTERN.matcher(name).matches());
- }
- public static boolean isLocalHost(String host) {
- return host != null && (LOCAL_IP_PATTERN.matcher(host).matches() || host.equalsIgnoreCase("localhost"));
- }
- public static boolean isAnyHost(String host) {
- return "0.0.0.0".equals(host);
- }
- private static volatile InetAddress LOCAL_ADDRESS = null;
- /**
- * 遍历本地网卡,返回第一个合理的IP。
- *
- * @return 本地网卡IP
- */
- public static InetAddress getLocalAddress() {
- if (LOCAL_ADDRESS != null) {
- return LOCAL_ADDRESS;
- }
- InetAddress localAddress = getLocalAddress0();
- LOCAL_ADDRESS = localAddress;
- return localAddress;
- }
- 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;
- }
- }
简单的说就是通过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 框架中,服务注册在 Zookeeper 中,但是注册的 IP 不是本地的 IP,这将导致 Consumer 无法找到 Provider,无法访问服务。今天,我们将分享解决 Dubbo 错误 IP 及 IP...
Dubbo 和 ZooKeeper 是两个广泛使用的开源项目,它们分别解决了不同层面的问题。Dubbo 是一款高性能、轻量级的 Java RPC 框架,而 ZooKeeper 是一个分布式的、开放源码的协同服务管理系统,常用于实现服务发现、配置...
Dubbo是阿里巴巴开源的一款高性能、轻量级的Java RPC框架,它主要解决的是分布式系统中的服务调用问题,使得服务提供者和消费者之间能够透明地进行通信。Dubbo提供了服务注册、服务发现、负载均衡、容错机制等核心...
在这个“灰度系统”中,基于dubbo和spring扩展的实现,我们可以看到一套完整的灰度测试解决方案,包括接入层灰度、服务层灰度、MQ(消息队列)灰度以及外部调用灰度,支持多套灰度环境。这样的系统设计有助于开发者...
1. 服务提供者端设置超时时间,在 Dubbo 的用户文档中,推荐如果能在服务端多配置就尽量多配置,因为服务提供者比消费者更清楚自己提供的服务特性。 2. 服务消费者端设置超时时间,如果在消费者端设置了超时时间,以...
2. **垂直应用架构**:随着访问量的增加,单一应用增加机器带来的效果递减,此时需要将应用拆分成多个相互独立的应用,以提高效率。 3. **分布式服务架构**:随着垂直应用数量的增加,应用之间的交互变得不可避免...
39. **Dubbo如何处理服务的分片问题?** 可以通过分区策略,根据请求参数的不同将请求路由到不同的服务实例。 40. **Dubbo服务如何实现数据一致性?** 可以借助分布式事务解决方案,如2PC、TCC、Saga等,保证跨...
Dubbo是一个管理中间层的工具,在业务层到数据仓库间有非常多服务的接入和服务提供者需要调度,Dubbo提供一个框架解决这个问题。Zookeeper和Dubbo的关系:Dubbo将注册中心进行抽象,它可以外接不同的存储媒介给注册...
如果我们每台机器里都备有一份域名到 IP 地址的映射,这个倒是能解决一部分问题,但是如果域名对应的 IP 发生变化了又该怎么办呢?于是我们有了 DNS 这个东西。我们只需要访问一个大家熟知的(known)的点,它就会...
其次,如果订单服务获取到的IP对应的机器宕机,将导致调用失败。最后,如果注册中心自身出现问题,整个服务发现机制都将受到影响。 为优化这一流程,注册中心引入了心跳机制。服务实例会定期发送心跳信息到注册中心...
在IT行业中,面试是每个...而"interview-master"可能是面试准备资料或经验分享文档,包含更多具体的问题和解答。为了成功通过这些公司的面试,求职者需要扎实的计算机基础知识,实践经验,以及对所在行业的深刻理解。
2. **分布式日志收集系统**:在分布式环境中,日志收集器可以根据应用程序名称在ZooKeeper上创建相应的节点,并将所有相关机器IP作为子节点注册。这种方式可以在机器发生变动时,自动调整收集任务,确保日志收集的...
7. **大型互联网公司面试题**:可能涉及分布式系统设计,例如CAP理论,微服务架构,消息队列(如Kafka、RabbitMQ),服务治理(如Dubbo、Spring Cloud),负载均衡,数据一致性解决方案(如Paxos、Raft)。...
2. **数据结构**:理解并运用各种数据结构(如数组、链表、栈、队列、哈希表、树、图等)是基础,面试时可能会要求设计和实现数据结构,以及解决与之相关的算法问题。 3. **算法**:包括排序(快速排序、归并排序、...
Sentinel作为一款强大的微服务流量控制组件,不仅能够有效地解决微服务架构下的雪崩问题,还能通过流量控制、隔离和降级、授权规则等功能提供全方位的保护。通过对Sentinel的深入学习和应用,可以帮助开发者更好地...
在这个“网络协议3-41”主题中,我们可以深入探讨多个关键的网络协议及其应用。 1. **流媒体协议**(第16章):流媒体协议如RTMP、HLS、DASH等,使得实时视频和音频内容能通过互联网高效传输。例如,在直播中,这些...
在IT行业中,ZooKeeper是一个至关重要的组件,尤其在分布式系统的设计和管理中扮演着核心角色。本教程将深入探讨如何在分布式环境下搭建Zookeeper...在实践中不断探索,才能更好地利用Zookeeper解决实际的分布式问题。
新老订单系统对比显示,RT降低了约10倍,所需机器数量也大幅减少。 总之,PSF作为一款PHP高性能服务化框架,通过技术创新和优化,成功地提升了PHP在服务化场景下的性能,为企业级服务化提供了有力支撑。