• Dubbo使用问题搜集


    注册中心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;
    
    • 1
    • 2
    • 3

    如何消除这个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 改变缺省配置位置。
    
    • 1
    • 2
    • 3
    • 4

    影响:

    这个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:protocolhost=“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

    解决办法:

    com.alibaba

    dubbo

    2.4.9

    org.springframework

    spring

    异步调用问题

    dubbo的异步调用发现个问题

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

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

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

    服务端开发不注册到中心

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

    3:dubbo.xml 配置:(上线要改回来)

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    注意点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

  • 相关阅读:
    七夕 跟mysql 数据库一起度过
    接口自动化之测试数据动态生成并替换
    面试题 数据库 MYSQL
    Java项目:JSP员工出差请假考勤管理系统
    硅谷(12)菜单管理
    2024/4/16 网络编程day4
    思科Nexus 9000系列交换机光模块解决方案
    javaScript事件
    装饰模式-C++实现
    24PL-18-50-1836、12PN-4.1-50-1836比例电磁铁控制器
  • 原文地址:https://blog.csdn.net/m0_67391870/article/details/126327972