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;

如何消除這個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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章