天天看點

【dubbo】dubbo常見問題解答常見問題解答

常見問題解答

  • 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倉庫中)

10.20

.

133.138

repo.alibaba-inc.com  www.springframework.org

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版本仲裁解決:

<

dependencyManagement

>

<

dependencies

>

<

dependency

>

<

groupId

>com.alibaba.external</

groupId

>

<

artifactId

>sourceforge.spring</

artifactId

>

<

version

>2.0.1</

version

>

</

dependency

>

<

dependency

>

<

groupId

>com.alibaba.external</

groupId

>

<

artifactId

>jakarta.commons.poolg</

artifactId

>

<

version

>1.3</

version

>

</

dependency

>

</

dependencies

>

</

dependencyManagement

>

2. 在Antx中,使用項目根project.xml中版本仲裁解決:

<

projects

name

=

"thirdpart"

>

<

project

id

=

"sourceforge/spring"

version

=

"2.0.1"

/>

<

project

id

=

"jakarta/commons/pool"

version

=

"1.3"

/>

</

projects

>

9. 出現java.util.concurrent.RejectedExecutionException或者Thread pool exhausted怎麼辦?

RejectedExecutionException表示線程池已經達到最大值,并且沒有空閑連,拒絕執行了一些任務。

Thread pool exhausted通常是min和max不一樣大時,表示目前已建立的連接配接用完,進行了一次擴充,建立了新線程,但不影響運作。

原因可能是連接配接池不夠用,請調整dubbo.properites中的:

// 設成一樣大,減少線程池收縮開銷

dubbo.service.min.thread.pool.size=

200

dubbo.service.max.thread.pool.size=

200

配置項說明請參見:配置參考手冊

如果線程池已經有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包:(代碼中的類名視具體沖突而定)

Enumeration<URL> urls = Thread.currentThread().getContextClassLoader().getResources(

"com/alibaba/dubbo/registry/internal/DefaultRegistryService.class"

);

while

(urls.hasMoreElements()) {

URL url = urls.nextElement();

System.out.println(

">>>>>>>>>>>>>>>>>>>>>>"

+ url.getFile());

}

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,

則配置為:

127.0

.

0.1

localhost

10.20

.

130.230

test2

18. 通過netstat -anp看到連接配接的注冊中心和配置的不一樣怎麼辦?

檢查classpath下是否存在兩個dubbo.properties檔案:

Enumeration<URL> urls = Thread.currentThread().getContextClassLoader().getResources(

"dubbo.properties"

);

while

(urls.hasMoreElements()) {

URL url = urls.nextElement();

System.out.println(

">>>>>>>>>>>>>>>>>>>>>>"

+ url.getFile());

}

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配置:

xxx=10.20.130.230:9090

yyy=morgan

<?

xml

version

=

"1.0"

encoding

=

"UTF-8"

?>

<

beans

xmlns

=

"http://www.springframework.org/schema/beans"

xmlns:xsi

=

"http://www.w3.org/2001/XMLSchema-instance"

xmlns:dubbo

=

"http://repo.alibaba-inc.com/schema/dubbo"

xsi:schemaLocation

=

"http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://repo.alibaba-inc.com/schema/dubbohttp://repo.alibaba-inc.com/schema/dubbo/dubbo-component.xsd"

>

<!-- 使用Spring自帶的占位符替換功能 -->

<

bean

class

=

"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"

>

<!-- 指定properties配置所在位置 -->

<

property

name

=

"location"

value

=

"classpath:xxx.properties"

/>

</

bean

>

<!-- 使用${}引用配置項 -->

<

dubbo:registry

address

=

"${xxx}"

application

=

"${yyy}"

/>

</

beans

>

25. 使用多個程序啟動服務,端口沖突怎麼辦?

注:此為Spring的标準功能,僅在此提示使用方式,不屬于Dubbo範疇。

使用Spring自帶的PropertyPlaceholderConfigurer的SYSTEM_PROPERTIES_MODE_OVERRIDE實作通過-D參數設定端口:

java -Ddubbo.service.server.port=20881

<?

xml

version

=

"1.0"

encoding

=

"UTF-8"

?>

<

beans

xmlns

=

"http://www.springframework.org/schema/beans"

xmlns:xsi

=

"http://www.w3.org/2001/XMLSchema-instance"

xmlns:dubbo

=

"http://repo.alibaba-inc.com/schema/dubbo"

xsi:schemaLocation

=

"http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://repo.alibaba-inc.com/schema/dubbohttp://repo.alibaba-inc.com/schema/dubbo/dubbo-component.xsd"

>

<!-- 使用Spring自帶的占位符替換功能 -->

<

bean

class

=

"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"

>

<!-- 系統-D參數覆寫 -->

<

property

name

=

"systemPropertiesModeName"

value

=

"SYSTEM_PROPERTIES_MODE_OVERRIDE"

/>

<!-- 指定properties配置所在位置 -->

<

property

name

=

"location"

value

=

"classpath:xxx.properties"

/>

</

bean

>

<!-- 使用${}引用配置項 -->

<

dubbo:provider

port

=

"${dubbo.service.server.port}"

/>

</

beans

>

26. 如何加載Spring?

注:此為Spring的标準功能,僅在此提示使用方式,不屬于Dubbo範疇。

1. 基于ClassPath加載:

ClassPathXmlApplicationContext context =

new

ClassPathXmlApplicationContext(

new

String[}{

"http://10.20.160.198/wiki/display/dubbo/service.xml"

});

context.start();

2. 基于檔案系統加載:

FileSystemXmlApplicationContext context =

new

FileSystemXmlApplicationContext(

new

String[}{

"http://10.20.160.198/home/xxx/service.xml"

});

context.start();

3. 基于Web容器加載:(WEB-INF/web.xml)

<?

xml

version

=

"1.0"

encoding

=

"UTF-8"

?>

<

web-app

xmlns:xsi

=

"http://www.w3.org/2001/XMLSchema-instance"

xmlns

=

"http://java.sun.com/xml/ns/javaee"

xmlns:web

=

"http://java.sun.com/xml/ns/javaee/web-app_2_4.xsd"

xsi:schemaLocation

=

"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_4.xsd"

id

=

"appication"

version

=

"2.4"

>

<

context-param

>

<

param-name

>contextConfigLocation</

param-name

>

<

param-value

>classpath:service.xml</

param-value

>

</

context-param

>

<

listener

>

<

listener-class

>org.springframework.web.context.ContextLoaderListener</

listener-class

>

</

listener

>

</

web-app

>

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

繼續閱讀