文档章节

DUBBO 使用问题记录

greki
 greki
发布于 2015/12/25 11:41
字数 1919
阅读 46570
收藏 26

 

官方ISSUE参考

https://github.com/alibaba/dubbo/issues

 

注册中心ZookeeperRegistry.doSaveProperties warn

2014-10-1419:56:51WARN  [com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry.doSaveProperties(221)]  [DUBBO] Failed to save registry store file, cause: Can not loc

k the registry cache file /homearch/.dubbo/dubbo-registry-192.168.1.109.cache, ignore and retry later, maybe multi java process use the file, please config: dubbo.re

gistry.file=xxx.properties, dubbo version:2.5.3, current host:192.168.1.22

java.io.IOException: Can not lock the registry cache file /homearch/.dubbo/dubbo-registry-192.168.1.109.cache, ignore and retry later, maybe multi java process use t

he file, please config: dubbo.registry.file=xxx.properties

        at com.alibaba.dubbo.registry.support.AbstractRegistry.doSaveProperties(AbstractRegistry.java:193)

        at com.alibaba.dubbo.registry.support.AbstractRegistry$SaveProperties.run(AbstractRegistry.java:150)

        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)

        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)

        at java.lang.Thread.run(Thread.java:744)

2014-10-1419:56:51WARN  [com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry.doSaveProperties(221)]  [DUBBO] Failed to save registry store file, cause: Can not loc

k the registry cache file /homearch/.dubbo/dubbo-registry-192.168.1.109.cache, ignore and retry later, maybe multi java process use the file, please config: dubbo.re

gistry.file=xxx.properties, dubbo version:2.5.3, current host:192.168.1.22

java.io.IOException: Can not lock the registry cache file /homearch/.dubbo/dubbo-registry-192.168.1.109.cache, ignore and retry later, maybe multi java process use t

he file, please config: dubbo.registry.file=xxx.properties

        at com.alibaba.dubbo.registry.support.AbstractRegistry.doSaveProperties(AbstractRegistry.java:193)

        at com.alibaba.dubbo.registry.support.AbstractRegistry$SaveProperties.run(AbstractRegistry.java:150)

        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)

        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)

        at java.lang.Thread.run(Thread.java:744)

 

原因:

dubbo会默认会在本地缓存注册中心的信息文件,默认路径在//home/[user]/.dubbo/dubbo-registry-192.168.1.109.cache

一个服务有多个应用有用到dubbo的时候更新注册中心的本地缓存,在更新本地缓存冲突时,就报了上面的warning;

如何消除这个warn:

在dubbo.properties文件里加入;
dubbo.registry.file=/home/xxx/app/dubbo-registry.properties

PS:Dubbo将自动加载classpath根目录下的dubbo.properties,可以通过JVM启动参数:-Ddubbo.properties.file=/home/xxx/dubbo.properties 改变缺省配置位置。

影响:

 这个warn可以忽略,只在存储文件的时候才报,存储的文件在AbstractRegistry构造函数里加载;是在启动的时候用

 

错误的服务提供者IP注册到中心

 

hostname解析错误或者可能是使用了VPN,启动了dubbo服务提供者应用,又连了正式环境的注册中心;

 一旦dubbo获取的ip错误后(拨了vpn 本机IP就会有多个),

 这种情况即使提供者服务停掉,目前dubbo没有能力清除这类错误的提供者;

 (需要修改源码测试,需要客户端重新更细包,因为清除动作client端)

 这种情况同样发生在测试的dubbo注册中心;

  

规避方案:

  1. 线上最好直接把10.10.10.10服务器的2181端口,做ip限制,VPN拨上的IP过滤掉(@旭峰,看能不能做到)
  2. 团队人员行为控制;
  3. 拨VPN又需要调试dubbo提供者的应用时,指定DUBBO服务的主机绑定 

发现这种情况的解决方法:

  1. 到dubbo管理后台,禁用错误的服务提供者;

Dubbo主机绑定说明: 

  缺省主机IP查找顺序: 

  • 通过LocalHost.getLocalHost()获取本机地址(hostname做解析,从而获取IP地址的,ping hostname)。
  • 如果是127.*等loopback地址,则扫描各网卡,获取网卡IP。

 

 注册的地址如果获取不正确,比如需要注册公网地址,可以:


1. 可以在/etc/hosts中加入:机器名 公网IP,比如: 

test1 205.182.23.201 

2. 在dubbo.xml中加入主机地址的配置:

<dubbo:protocol host="205.182.23.201">

3. 或在dubbo.properties中加入主机地址的配置:

dubbo.protocol.host=205.182.23.201 或 JAVA_OPTIONS="-Ddubbo.protocol.host=192.168.1.111

怎么样一次访问调用集群中所有节点?

配置下消费者端即可。dubbo已经支持广播调用《broadcast》

<dubbo:referenceid="testservice"interface="xxx.TestService"timeout="8000"cluster="broadcast"/>

spring jar包冲突

我们现在用的spring是3,而dubbo引用的是2.5.6,会造成jar包冲突,需要排除

错误信息:WARN:oejuc.AbstractLifeCycle:FAILED ModelViewController: java.lang.NoSuchFieldError: APPLICATION_CONTEXT_ID_PREFIX

解决办法:<dependency>

            <groupId>com.alibaba</groupId>

            <artifactId>dubbo</artifactId>

            <version>2.4.9</version>

                <exclusions>

                <exclusion>

                    <groupId>org.springframework</groupId>

                    <artifactId>spring</artifactId>

                </exclusion>

            </exclusions>

</dependency>

异步调用问题

  dubbo的异步调用发现个问题

A -----[异步]-->    B   --[同步调用]-->C

B同步dubbo调用C,就会直接返回null

如果B调用C后,下一步还有同步调用D,D返回的会正确;

 

 

服务端开发不注册到中心

开发调试的时候:开发的dubbo服务不要注册到注册中心。不注册的方法如下,建议用1或2
1:启动jvm参数:-Ddubbo.registry.address=192.168.1.109:2183?register=false
2:改properties:<dubbo:registry address="192.168.1.109:2183?register=false"/>  

3:dubbo.xml 配置:<dubbo:registry address="192.168.1.109:2183" register="false" />(上线要改回来)

 

dubbo-monitor-simple

 

里面有个配置dubbo.statistics.directory=${user.home}/monitor/statistics

下面的监控是写文件的,导致服务器的文件过多,几个月下来inode都要满了。

定期清理,或者用dubbo-monitor-x吧,入mysql

 

oschina有一个开源项目:http://git.oschina.net/handu/dubbo-monitor 

 

状态被禁用,管理后台设置无效

不知道什么原因,管理后台看服务是禁用状态,而且启用不成功,感觉是哪里配置写进去的地方写错,具体原因没分析,

解决方法就是去登录zookeeper里手段删除配置节点

zkCli.sh -server 192.168.1.23:2183

 delete /dubbo/xxxx.xxxx.Service/configurators/xxxxxxx

 

DUBBO的回调问题,指导文档是(试用)生产上慎用;

provider <--consumer:  正常调用

provider -->consumer:  回调

例子里,消费的端配置是

<dubbo:reference id="callbackService" interface="com.callback.CallbackService" />

CallbackService callbackService = (CallbackService) context.getBean("callbackService");
 
callbackService.addListener("http://10.20.160.198/wiki/display/dubbo/foo.bar", new CallbackListener(){
    public void changed(String msg) {
        System.out.println("callback1:" + msg);
    }
});

注意点1:初始化的时候,必须调用callbackService.addListener后,provider在调用回调服务,客户端才能收到。

注意点2: provider如果重启了,consumer如果没有重启,这时候如果provider直接进行回调是掉不通的。

如果你重现再consumer里再callbackService.addListener,那就可以了。

 

原因跟回调实现有关,dubbo的回调暴露,CallbackServiceCodec实现consumer的接口暴露。

1.callbackService.addListener

2.-->CallbackServiceCodec(tcp进行callback的编码)、并export回调服务

3.--tcp传输编码-->

4.provider收到编码,CallbackServiceCodec.decode解码知道consumer有回调接口暴露,生成invoker

5.这个时候provider就可以调用invoker了。

 

所以,如果provider重启了,内存里的callbackService 的invoker就没有了。

刚开始看到回调,以为能很好的解决相互依赖,实现provider对consumer的调用,

 

比如场景:

业务系统--依赖-->配置中心。

配置中心后台修改了配置,想下发到业务系统(广播调用)。

用回调有很多问题:1.上面provider重启问题,2.回调没有类似的广播调用。

这种场景大致的dubbo扩张方案(如果谁有解决方案,多谢指导):

看了下如果通过回调机制扩展,有相当大麻烦(按目前对他的理解程度),所以比较简单的

1.provider发布share包时候,直接包consumer暴露成一个provider,就是让他相互依赖。

2.通过注册中心zookeeper,建立监听和通知机制(相对会破坏一点,原来的注册中心定位)

 

管理中心的服务注册信息不同步

重新发布服务后,发现管理中心的服务信息没有更新,包括PID TS,以为应用没更新。

这类问题可以直接登录zookeeper进行查看,

zkCli.sh -server 192.168.1.23:2183

 

扩展点自动激活

dubbo开发文档,自动激活,filter是从ProtocolFilterWrapper 调ExtensionLoader.getActivateExtension

@Activate // 无条件自动激活
public class XxxFilter implements Filter {
    // ...
}

其实需要加上

@Activate(group = {"provider","consumer"})

ExtensionLoader.getActivateExtension

private boolean isMatchGroup(String group, String[] groups) {
    if (group == null || group.length() == 0) {
        return true;
    }
    if (groups != null && groups.length > 0) {
        for (String g : groups) {
            if (group.equals(g)) {
                return true;
            }
        }
    }
    return false;
}

 

广播地址绑定失败:Can't assign requested address mac dubbo

<dubbo:registry address="multicast://224.5.6.7:1234"/>

 

This was caused by an IPv6 address being returned from java.net.NetworkInterface.getDefault(). I'm on a Macbook and was using wireless -- p2p0 (used for AirDrop) was returned as the default network interface but my p2p0 only has an IPv6 ether entry [found by running ipconfig].

Two solutions, both of which worked for me (I prefer the first because it works whether you are using a wired or wireless connection)

  1. Start the JVM with -Djava.net.preferIPv4Stack=true. This caused java.net.NetworkInterface.getDefault() to return my vboxnet0 network interface -- not sure what you'll get if you're not running a host-only VM.
  2. Turn off wireless and use a wired connection

 

© 著作权归作者所有

共有 人打赏支持
greki
粉丝 98
博文 109
码字总数 45236
作品 0
杭州
技术主管
私信 提问
加载中

评论(6)

二号铺
二号铺
总结的不错,学习了
湖心亭看雪
湖心亭看雪
写的好乱,感觉把多个问题都柔和到一块了
芝麻绿豆
芝麻绿豆
分布式架构项目实战实战实例参考:http://www.roncoo.com/course/view/f614343765bc4aac8597c6d8b38f06fd
调皮的XD
调皮的XD

引用来自“假装在旅游”的评论

那个Dubbo异步调用的问题,,我们也遇到了,,爬了1个星期的坑,开始解决方案是 B如果发现返回值是null,再请求一次,后来发现太多了,而且low,就改成全部同步调用了
异步这个坑,把我们坑惨了,擦,找了好久才发现异步这个问题
假装在旅游
假装在旅游
那个Dubbo异步调用的问题,,我们也遇到了,,爬了1个星期的坑,开始解决方案是 B如果发现返回值是null,再请求一次,后来发现太多了,而且low,就改成全部同步调用了
冰峰1990
冰峰1990
有用
Linux Zookeeper Dubbo弄弄环境

背景和什么什么就不说了,记录记录问题和过程来着。 1. 环境: 2.安装: 解压缩tar.gz包,使用命令: JDK的bin文件安装,可参考:http://my.oschina.net/u/1991646/blog/703205 3.配置和启动...

郁极风
2016/06/30
58
0
Dubbo分布式环境搭建测试(依赖mybatis,spring,druid)

此文档针对初学者。 废话不多说,先上源码: http://git.oschina.net/alexgaoyh/Dubbo-parent http://git.oschina.net/alexgaoyh/Dubbo-parent/attach_files Maven项目,只需要注意下图中红色...

alexgaoyh
2015/10/20
2.3K
6
架构设计:系统间通信(45)——阶段性问题记录

到此为止 《架构设计:系统间通信》专题就暂时告一段落了。这边文章笔者用于暂时记录这个专题中还需要补充的内容,并在后续的整理中足一补上: 退避算法和退避规则,以及其应用场景 系统间通...

yinwenjie
2016/08/11
0
0
dubbox粗记

一直在用dubbo2.5。今天花了一天时间研究了当当网的dubbox项目并在本地运行,粗略记录一下认识。 dubbox的主要升级点: 1、dubbox弥补了dubbo中没有REST框架的不足,但REST性能指标比RPC要差...

Jim_Ai
2016/07/18
1K
3
Dubbo设计分享——实现的健壮性

Dubbo作为远程服务暴露、调用和治理的解决方案,是应用运转的经络,其本身实现健壮性的重要程度是不言而喻的。 这里列出一些Dubbo用到的原则和方法。 一、日志 日志是发现问题、查看问题一个...

candies
2014/02/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

jquery通过id显示隐藏

var $div3 = $('#div3'); 显示 $div3.show(); 隐藏 $div3.hide();

yan_liu
今天
3
0
《乱世佳人》读书笔记及相关感悟3900字

《乱世佳人》读书笔记及相关感悟3900字: 之前一直听「荔枝」,后来不知怎的转向了「喜马拉雅」,一听就是三年。上班的时候听房产,买房了以后听装修,兴之所至时听旅行,分手后听亲密关系,...

原创小博客
今天
3
0
大数据教程(9.6)map端join实现

上一篇文章讲了mapreduce配合实现join,本节博主将讲述在map端的join实现; 一、需求 实现两个“表”的join操作,其中一个表数据量小,一个表很大,这种场景在实际中非常常见,比如“订单日志...

em_aaron
今天
3
0
cookie与session详解

session与cookie是什么? session与cookie属于一种会话控制技术.常用在身份识别,登录验证,数据传输等.举个例子,就像我们去超市买东西结账的时候,我们要拿出我们的会员卡才会获取优惠.这时...

士兵7
今天
3
0
十万个为什么之为什么大家都说dubbo

Dubbo是什么? 使用背景 dubbo为什么这么流行, 为什么大家都这么喜欢用dubbo; 通过了解分布式开发了解到, 为适应访问量暴增,业务拆分后, 子应用部署在多台服务器上,而多台服务器通过可以通过d...

尾生
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部