Dubbo服务注册到Zookeeper上的IP与本机IP不一致

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dubbo服务注册到Zookeeper上的IP与本机IP不一致相关的知识,希望对你有一定的参考价值。

参考技术A 1、问题描述

如图,本地在内网的ip为172.27.43.8,但是服务注册到了zk上后,ip变成了本地的ip:192.168.68.2

2、原因解析
发布服务到远程zk,dubbo是调用ServiceConfig.doExportUrlsFor1Protocol方法,
在doExportUrlsFor1Protocol方法中,通过以下两步获取到host和port两个值。

服务注册到zk上所用的ip,正是这个host,这个findConfigedHosts方法,入参就包括protocolConfig。
因此我们猜想,修改protocolConfig中的host配置,是不是就可以改变服务注册到zk上所显示的ip?

3、解决方法
在dubbo的xml配置文件中,配置protocol属性如下:
<dubbo:protocol name="dubbo" id="dubbo" host="172.27.43.8"/>
将host改为本地的ip后,重新尝试将服务注册到zk,发现zk上的ip已经变为我们所配置的host,问题解决~

Dubbo多注册中心和Zookeeper服务的迁移

一、Dubbo多注册中心

1、 应用场景

例如阿里有些服务来不及在青岛部署,只在杭州部署,而青岛的其它应用需要引用此服务,就可以将服务同时注册到两个注册中心。

consumer.xml

<?xml version="1.0" encoding="UTF-8"?>  

<beans xmlns="http://www.springframework.org/schema/beans"  

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  

    xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd">  

   

    <dubbo:application name="world"  />  

   

    <!-- 多注册中心配置 -->  

    <dubbo:registry id="hangzhouRegistry" address="10.20.141.150:9090" />  

    <dubbo:registry id="qingdaoRegistry" address="10.20.141.151:9010" default="false" />  

   

    <!-- 向多个注册中心注册 -->  

    <dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" registry="hangzhouRegistry,qingdaoRegistry" />  

   

</beans>


2、不同服务使用不同注册中心


比如:CRM有些服务是专门为国际站设计的,有些服务是专门为中文站设计的。

consumer.xml

<?xml version="1.0" encoding="UTF-8"?>  

<beans xmlns="http://www.springframework.org/schema/beans"  

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  

    xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd">  

   

    <dubbo:application name="world"  />  

   

    <!-- 多注册中心配置 -->  

    <dubbo:registry id="chinaRegistry" address="10.20.141.150:9090" />  

    <dubbo:registry id="intlRegistry" address="10.20.154.177:9010" default="false" />  

   

    <!-- 向中文站注册中心注册 -->  

    <dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" registry="chinaRegistry" />  

   

    <!-- 向国际站注册中心注册 -->  

    <dubbo:service interface="com.alibaba.hello.api.DemoService" version="1.0.0" ref="demoService" registry="intlRegistry" />  

   

</beans> 

3、多注册中心引用


比如:CRM需同时调用中文站和国际站的PC2服务,PC2在中文站和国际站均有部署,接口及版本号都一样,但连的数据库不一样。

consumer.xml

<?xml version="1.0" encoding="UTF-8"?>  

<beans xmlns="http://www.springframework.org/schema/beans"  

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  

    xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd">  

   

    <dubbo:application name="world"  />  

   

    <!-- 多注册中心配置 -->  

    <dubbo:registry id="chinaRegistry" address="10.20.141.150:9090" />  

    <dubbo:registry id="intlRegistry" address="10.20.154.177:9010" default="false" />  

   

    <!-- 引用中文站服务 -->  

    <dubbo:reference id="chinaHelloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" registry="chinaRegistry" />  

   

    <!-- 引用国际站站服务 -->  

    <dubbo:reference id="intlHelloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" registry="intlRegistry" />  

   

</beans>  



<?xml version="1.0" encoding="UTF-8"?>  

<beans xmlns="http://www.springframework.org/schema/beans"  

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  

    xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd">  

   

    <dubbo:application name="world"  />  

   

    <dubbo:registry address="10.20.141.150:9090|10.20.154.177:9010" />  

   

    <!-- 引用服务 -->  

    <dubbo:reference id="helloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" />  

   

</beans>  

二、Dubbo多注册中心的服务迁移

1、顾名思义,将服务从一个地儿迁到另一个地儿,例如从A地迁到B地。

2、如何实现多注册中心的服务迁移

步骤一

     例如:dubbo.registry.address=192.168.220.128:2181|192.168.221.129:2181,192.168.221.130:2181,192.168.221.131:2181 这就是两个注册中心配置sample

步骤二

     Jenkins重新构建服务,zk1本身就是含有全部服务的,现在构建是将服务部署到zk2集群中。这样就可实现AzkB地的zk两套注册中心享有两套相同的服务

步骤三

     把服务的消费端都构建一遍;

步骤四

     先取消服务消费者调用zk1的服务,具体实施就是去掉第一个zk的配置,然后构建消费者

步骤五

     把服务提供者的配置也取消;然后重新构建服务提供者。这样就完成了将zk1中的所有服务迁移到zk2中,且去除zk1中的所有服务。


以上是关于Dubbo服务注册到Zookeeper上的IP与本机IP不一致的主要内容,如果未能解决你的问题,请参考以下文章

为什么阿里的dubbo注册中心要放弃zookeeper, 而用Nacos?

gateway-dubbo服务未注册到zookeeper

基于zookeeper实现rpc注册中心

dubbo与zookeeper的关系

dubbo与zookeeper的关系

zookeeper和dubbo的关系[转]