前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。
官方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.propertiesPS: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 {// ...
}
其實需要加上
<span style="color:#7f9f7f">@Activate(group = {"provider","consumer"})</span>
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;
}
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"/>
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 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. - Turn off wireless and use a wired connection
?