承载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错误ip及ip乱入问题的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
解决dubbo启动报错,加载失败问题。
解决springboot 中 dubbo配置的报错问题 dubbo XML Schema 文件
protocol.host 支持正则IP或网卡名,解决多网卡绑定问题
引入 dubbo框架 需要引用dubbo标签,dubbo.xsd 可以解决标签不识别的问题
dubbo例子 2台机器亲测通过
dubbo资源 dubbo-admin dubbo demo
dubbo.xsd文件,用于解决dubbo配置报错。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...
dubbo示例代码dubbo-sample
incubator-dubbo-dubbo-2.6.1
dubbo资源包
当当对Dubbo的评价:Dubbo是一个被国内很多互联网公司广泛使用的开源分布式服务框架,即使从国际视野来看应该也是一个非常全面的SOA基础框架。作为一个重要的技术研究课题,在当当网我们根据自身的需求,为Dubbo实现...
dubbo是目前分布式系统开发里面使用非常多的一个RPC框架。本套视频从分布式系统的基本概念出发,由浅入深,讲解了RPC原理,Dubbo基本使用,Dubbo高可用场景以及Dubbo原理,涉及了分布式系统中服务注册、服务发现、...
引入 dubbo框架 需要引用dubbo标签,dubbo.xsd 可以解决标签不识别的问题
解决dubbo接口自定义异常的捕捉问题,dubbo消费者可以捕捉到提供者所抛出的自定义异常。
1.dubbo-zookeeper springSpringMVC 一个生产者,多消费者 例子 2. ssm-dubbo 源码 ssm-tomcat 里放的是 warbao ,程序包 zookeeper-3.4.9 zookeeper 免安装包 设置都是默认的 zookeeper 端口 2181 dubbo-...
backup=ip:port,ip:port; dubbo.admin.root.password dubbo-admin root账号的密码 4.启动tomcat ok dubbo-monitor安装要点: 1.解压dubbo-monitor包; 2.修改dubbo-monitor中的conf目录中的dubbo.properties ...
dubbo多个版本-jar包,dubbo-2.0.10 —到— dubbo-2.5.2-sources 全部都全
前段时间排查某问题的时候,想要快速知道某些dubbo接口(三无)的响应结果,但不想启动项目(因为这些项目不是你负责的,不会部署而且超级笨重),也不想新建一个dubbo客户端项目(占地方),也不想开telnet客户端...