https://my.oschina.net/greki/blog/550976
官方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注册中心;
规避方案:
- 线上最好直接把10.10.10.10服务器的2181端口,做ip限制,VPN拨上的IP过滤掉(@旭峰,看能不能做到)
- 团队人员行为控制;
- 拨VPN又需要调试dubbo提供者的应用时,指定DUBBO服务的主机绑定
发现这种情况的解决方法:
- 到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)
- Start the JVM with
-Djava.net.preferIPv4Stack=true
. This causedjava.net.NetworkInterface.getDefault()
to return my vboxnet0 network interface -- not sure what you'll get if you're not running a host-only VM. - Turn off wireless and use a wired connection