常見問題解答
- 1. 如果服務注冊不上怎麼辦?
- 2. 出現RpcException: No provider available for remote service異常怎麼辦?
- 3. 出現調用逾時com.alibaba.dubbo.remoting.TimeoutException異常怎麼辦?
- 4. 出現hessian序列化失敗com.caucho.hessian.client.HessianRuntimeException怎麼辦?< /h3>
- 5. 出現Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://repo.alibaba-inc.com/schema/dubbo]怎麼辦?
- 6. 出現"消息發送失敗"異常怎麼辦?
- 7. 出現org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'beans'異常怎麼辦?
- 8. 項目依賴的三方庫與Dubbo所依賴的版本沖突怎麼辦。
- 9. 出現java.util.concurrent.RejectedExecutionException或者Thread pool exhausted怎麼辦?
- 10. 出現com.alibaba.dubbo.registry.internal.rpc.exception.RpcLocalExceptionIoTargetIsNotConnected怎麼辦?< /h3>
- 11. 出現Remote server returns error: [6], Got invocation exception怎麼辦?< /h3>
- 12. 出現Error closing connection/tbr-client java.lang.NullPointerException怎麼辦?
- 13. 出現org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'xxxService': Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: Method must not be null怎麼辦?
- 14. 出現Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'applicationName' of bean class [com.alibaba.dubbo.registry.internal.DefaultRegistryService]: Bean property 'applicationName' is not writable or has an invalid setter method.怎麼辦?
- 15. 服務提供者沒挂,但在注冊中心裡看不到怎麼辦?
- 16. 出現ERROR monitor.StatLog -拒絕連接配接 java.net.ConnectException:拒絕連接配接 com.alibaba.dubbo.monitor.StatLog.sendStatData怎麼辦?
- 17. 服務位址出現127.0.0.1怎麼辦?
- 18. 通過netstat -anp看到連接配接的注冊中心和配置的不一樣怎麼辦?
- 19. 用戶端的異常資訊裡的errorcode是什麼意思?
- 20. 出現expected string at 0×33 java.lang.String 怎麼辦?
- 23. 擷取版本号出現java.lang.NullPointerException怎麼辦?
- 24. 以及配置中如何使用占位符?
- 25. 使用多個程序啟動服務,端口沖突怎麼辦?
- 26. 如何加載Spring?
- 27. 出現org.xml.sax.SAXParseException: cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element怎麼辦?
- 28. 出現Could not deserialize parameter instance, error is: readObject: unexpected end of file怎麼辦?
- 29. 出現java.net.SocketException: Invalid argument: sun.nio.ch.Net.setIntOption怎麼辦?
1. 如果服務注冊不上怎麼辦?
(1) 檢查dubbo的jar包有沒有在classpath中,以及有沒有重複的jar包
(2) 檢查有沒有重複的dubbo.properties配置檔案
(3) 檢查暴露服務的spring配置有沒有加載
(4) 檢查beanId或beanName有沒有重複
(5) 檢視有沒有錯誤日志:
cat ~/output/logs/webx.log
(6) 在服務提供者機器上測試與注冊中心的網絡是否通:
telnet 172.22.3.94 9090
(7) 檢查與注冊中心的連接配接是否存在:
netstat -anp | grep 172.22.3.94
(8) 如果是預釋出機,檢查hosts檔案有沒有正确綁定:
cat /etc/hosts
(9) 實在不行,開啟遠端調試:
– (a) 在伺服器JVM參數中加入:-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=7001,server=y,suspend=y
注意線上隻有7001和8080可以被線下通路,調試端口需用這兩個之一,因注冊是啟動時行為,啟動時必需挂起suspend=y
– (b) 在dubbo源碼的DefaultRegistryService的registerService()方法中設定斷點。
– (c) 在Eclipse的Debug按鈕下拉菜單Debug Configurations中的Remote Java Applications中新增遠端調試,并設定IP和端口,以及增加dubbo的源碼,進行遠端Debug調試。
2. 出現RpcException: No provider available for remote service異常怎麼辦?
表示沒有可用的服務提供者,
1. 檢查連接配接的注冊中心是否正确
2. 到注冊中心檢視相應的服務提供者是否存在
3. 檢查服務提供者是否正常運作
3. 出現調用逾時com.alibaba.dubbo.remoting.TimeoutException異常怎麼辦?
通常是業務處理太慢,可在服務提供方執行:jstack PID > jstack.log 分析線程都卡在哪個方法調用上,這裡就是慢的原因。
如果不能調優性能,請将timeout設大。
4. 出現hessian序列化失敗com.caucho.hessian.client.HessianRuntimeException怎麼辦?
1. 檢查服務方法的傳入傳出參數是否實作Serializable接口
2. 檢查服務方法的傳入傳出參數是否繼承了Number,Date,ArrayList,HashMap等hessian特殊化處理的類
5. 出現Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://repo.alibaba-inc.com/schema/dubbo]怎麼辦?
表示spring找不到<dubbo:...>配置的解析處理器。
通常是Dubbo的jar沒有引入,請加入對Dubbo的依賴,或者是ClassLoader隔離,看是否有使用osgi或其它熱加載機制。
6. 出現"消息發送失敗"異常怎麼辦?
通常是接口方法的傳入傳出參數未實作Serializable接口。
7. 出現org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'beans'異常怎麼辦?
表示xsd加載失敗,
1. 檢查spring版本,如果是spring2.0版本,因為該版本不能讀取jar包内xsd,會讀取外網的xsd,而線上環境通常不允許通路外網,
可修改/etc/hosts加入:(已将spring的xsd放在公司内部的maven倉庫中)
|
spring2.5.x版本不存在此問題,可以考慮更新到2.5.x版本。
2. 檢查有沒有使用osgi的xsd,如果用了,需要将spring-osgi.jar及其依賴包加進來
8. 項目依賴的三方庫與Dubbo所依賴的版本沖突怎麼辦。
比如,項目使用的spring和commons.pool與dubbo沖突,
dubbo使用的是spring2.5和commons.pool1.4,
而項目中其它子產品依賴的是spring2.0.1和commons.pool1.3。
1. 在Maven中,使用項目根pom.xml中的dependencyManagement版本仲裁解決:
|
2. 在Antx中,使用項目根project.xml中版本仲裁解決:
|
9. 出現java.util.concurrent.RejectedExecutionException或者Thread pool exhausted怎麼辦?
RejectedExecutionException表示線程池已經達到最大值,并且沒有空閑連,拒絕執行了一些任務。
Thread pool exhausted通常是min和max不一樣大時,表示目前已建立的連接配接用完,進行了一次擴充,建立了新線程,但不影響運作。
原因可能是連接配接池不夠用,請調整dubbo.properites中的:
|
配置項說明請參見:配置參考手冊
如果線程池已經有200,還不夠,通常是業務處理占用線程時間過長,
需優化業務,可通過運作:
jstack 程序号 > jstack.txt
分析目前大多數線程都在幹什麼,進而分析出哪個地方是瓶頸,
比如,如果大部分線程都在處理SQL,可能是資料庫連接配接不夠,或資料源配置錯誤,或SQL沒走索引等。
10. 出現com.alibaba.dubbo.registry.internal.rpc.exception.RpcLocalExceptionIoTargetIsNotConnected怎麼辦?
1. 檢查注冊中心是否開啟白名單功能,如果開啟,當IP不在白名單清單中,注冊中心将拒絕連接配接。
2. 檢查端口是否正确,注冊中心有兩個端口,一個為控制台HTTP端口,用于管理者檢視資料,一個為程式注冊服務用的TCP端口。
11. 出現Remote server returns error: [6], Got invocation exception怎麼辦?
此異常表示Dubbo架構調用服務提供者的實作方法失敗,并且不是方法本身的業務異常。
通常是服務消費者和服務提供者的API簽名不一緻引起,或者提供方比消費方少此函數。
一般是服務增加方法,或修改了方法簽名,而雙方用的服務API的jar包不一緻。
12. 出現Error closing connection/tbr-client java.lang.NullPointerException怎麼辦?
如果服務提供者先關閉,當注冊中心通知服務消費者後,服務消費者會再次關閉與服務提供者的連接配接,
而此時連接配接早已不存在,TBRemoting沒有判斷null,直接調用了close方法,是以會抛出空指針異常,
由于TBRemoting源碼由taobao管理,暫時未解決此BUG,但不影響使用,可忽略。
Dubbo1.0.11-3以後版本已hack了taobao的代碼,不存在此問題。
13. 出現org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'xxxService': Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: Method must not be null怎麼辦?
通常是classpath下存在spring多個版本的jar包,排除掉不需要的spring包即可。
14. 出現Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'applicationName' of bean class [com.alibaba.dubbo.registry.internal.DefaultRegistryService]: Bean property 'applicationName' is not writable or has an invalid setter method.怎麼辦?
出現類似的dubbo某個類的屬性沒有setter方法的異常,通常是classpath下有多個不同版本的dubbo的jar包,導緻配置檔案與類不比對。
可以在程式中運作下面的代碼發現重複的類或jar包:(代碼中的類名視具體沖突而定)
|
15. 服務提供者沒挂,但在注冊中心裡看不到怎麼辦?
首先,确認服務提供者是否連接配接了正确的注冊中心,不隻是檢查配置中的注冊中心位址,而且要檢查實際的網絡連接配接。
其次,看服務提供者是否非常繁忙,比如壓力測試,以至于沒有CPU片段向注冊中心發送心跳,這種情況,減小壓力,将自動恢複。
16. 出現ERROR monitor.StatLog -拒絕連接配接 java.net.ConnectException:拒絕連接配接 com.alibaba.dubbo.monitor.StatLog.sendStatData怎麼辦?
監控中心不可用,發送統計資訊失敗,不影響調用,但将丢失統計資訊。
17. 服務位址出現127.0.0.1怎麼辦?
Dubbo1.0.7以後版本不存在此問題,當發現本機IP為127.0.0.1時,将周遊所有網卡查找有效IP。
之前版本處理方式:
正确配置的IP映射,Linux下為/etc/hosts,Windows下為C:/WINDOWS/system32/drivers/etc/hosts
假設:ifconfig指令行結果為10.20.130.230,hostname指令行結果為test2,
則配置為:
|
18. 通過netstat -anp看到連接配接的注冊中心和配置的不一樣怎麼辦?
檢查classpath下是否存在兩個dubbo.properties檔案:
|
19. 用戶端的異常資訊裡的errorcode是什麼意思?
如Remote server returns error: [6], Got invocation exception
1 — 收到消息的時候線程池拒絕處理
2 — 服務提供者端未能根據服務名找到相應服務
3 — 該服務調用時,服務提供者端不能加載參數類型對應的class
4 — 參數不能被正确的反序列化
5 — 不能正确從Class中create該調用所訓示的方法
6 — 不能正确調用該方法
20. 出現expected string at 0×33 java.lang.String 怎麼辦?
這是Hessian3.2.1的一個BUG,Dubbo内部使用Hessian3.2.1做序列化,更新到Dubbo1.0.14以上版本,已解決此問題。
具體原因參見:
http://pt.alibaba-inc.com/wp/experience_929/hessian-big-string-serialize-problems.html
21. 預釋出環境,在本地的/etc/hosts檔案作了對注冊中心的綁定,為什麼服務還是注冊到生産環境的注冊中心?
antx.properties中配置的 dubbo.registry.address = dubbo-reg1.hst.xyi.cn.alidc.net dubbo-reg2.hst.xyi.cn.alidc.net dubbo-reg3.hst.xyi.cn.alidc.net dubbo-reg4.hst.xyi.cn.alidc.net
而/etc/hosts裡的綁定如下:
172.22.14.13 dubbo-reg1.hst.xyi.cn.alidc.net dubbo-reg2.hst.xyi.cn.alidc.net
兩邊的不一緻,導緻該問題出現。
将綁定修改為:172.22.14.13 dubbo-reg1.hst.xyi.cn.alidc.net dubbo-reg2.hst.xyi.cn.alidc.net dubbo-reg3.hst.xyi.cn.alidc.net dubbo-reg4.hst.xyi.cn.alidc.net 即可!
22. 注冊中心上服務是存在的,為什麼報找不到服務的錯誤?
報錯資訊: Caused by: com.alibaba.dubbo.rpc.RpcException: No invoker available for remote service com.alibaba.china.album.service.IBankNewPicService:1.0.0, servers: []
注冊中心上看到的服務提供者提供的服務位址是:dubbo://172.29.61.76:55372?version=1.0.0&group=ibank&dubbo=1.0.0&application=ibank
原因:服務提供者配置了group屬性,預設的路由規則是 服務名= group/serviceName。
對這個服務,根據預設的路由規則,消費者消費的服務名應該是 ibank/com.alibaba.china.album.service.IBankNewPicService:1.0.0
23. 擷取版本号出現java.lang.NullPointerException怎麼辦?
java.lang.NullPointerException
at com.alibaba.dubbo.classic.DubboVersion.getVersion
這個隻有1.0.14和1.0.14-2存在的問題,在擷取版本時靜态字段初始化順序不對,不影使用,可忽略,更新為1.0.15以上版本不再會有該問題。
24. 以及配置中如何使用占位符?
注:此為Spring的标準功能,僅在此提示使用方式,不屬于Dubbo範疇。
使用Spring自帶的PropertyPlaceholderConfigurer實作properties配置:
|
|
25. 使用多個程序啟動服務,端口沖突怎麼辦?
注:此為Spring的标準功能,僅在此提示使用方式,不屬于Dubbo範疇。
使用Spring自帶的PropertyPlaceholderConfigurer的SYSTEM_PROPERTIES_MODE_OVERRIDE實作通過-D參數設定端口:
|
|
26. 如何加載Spring?
注:此為Spring的标準功能,僅在此提示使用方式,不屬于Dubbo範疇。
1. 基于ClassPath加載:
|
2. 基于檔案系統加載:
|
3. 基于Web容器加載:(WEB-INF/web.xml)
|
27. 出現org.xml.sax.SAXParseException: cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element怎麼辦?
通常是在用Dubbo1.0的jar包,卻用了Dubbo2.0才支援的<dubbo:registry> <dubbo:application> <dubbo:provider> <dubbo:consumer>或2.0才支援的屬性。
28. 出現Could not deserialize parameter instance, error is: readObject: unexpected end of file怎麼辦?
通常是消費方或提供方的記憶體不足,導緻buffer不能配置設定,使發送到一半的請求被中斷了。
也可能是網絡抖動,導緻傳輸流被中斷。
29. 出現java.net.SocketException: Invalid argument: sun.nio.ch.Net.setIntOption怎麼辦?
通常是Windows Vista和Windows7的JDK1.6的部分版本存在BUG:
https://issues.apache.org/jira/browse/DIRMINA-379
可以換換JDK版本試試。
轉載的問題很全面,先儲存下來。後續遇到的時候可以檢視,感謝分享http://alibaba.github.io/dubbo-doc-static/FAQ-zh.htm
* dubbo是怎樣保持資料一緻的,各個服務之間保持資料一緻?
跟dubbo沒關系,微服務是無狀态的。資料一緻屬于另外的範疇
* zookeeper會與其中的各個服務保持一種心跳連接配接嗎?
作為分布式服務的協調中樞,這是一種必須的能力,但是zookeeper用的是長連接配接機制,後面會講到的eureka是心跳機制。
* zookeeper和eureka在協調服務上的差別?一個是cp一個是ap