註冊中心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