【dubbo】dubbo常見問題解答

常見問題解答

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

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