Dubbo問題總結

一、Dubbo是什麼?
Dubbo是阿里巴巴開源的基於 Java 的高性能 RPC(一種遠程調用) 分佈式服務框架(SOA),致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。
二、爲什麼要用Dubbo?
因爲是阿里開源項目,國內很多互聯網公司都在用,已經經過很多線上考驗。內部使用了 Netty、Zookeeper,保證了高性能高可用性。

1、使用Dubbo可以將核心業務抽取出來,作爲獨立的服務,逐漸形成穩定的服務中心,可用於提高業務複用
靈活擴展,使前端應用能更快速的響應多變的市場需求。
2、分佈式架構可以承受更大規模的併發流量。

三、Dubbo 和 Spring Cloud 有什麼區別?

1、通信方式不同:Dubbo 使用的是 RPC 通信,而Spring Cloud 使用的是HTTP RESTFul 方式。
2、組成不一樣:
dubbo的服務註冊中心爲Zookeerper,服務監控中心爲dubbo-monitor,無消息總線,服務跟蹤、批量任務等組件;
spring-cloud的服務註冊中心爲spring-cloud netflix  enruka,服務監控中心爲spring-boot admin,有消息總線,數據流、服務跟蹤、批量任務等組件;

四、Dubbo需要 Web 容器嗎?
不需要,如果硬要用Web 容器,只會增加複雜性,也浪費資源。
五、Dubbo內置了哪幾種服務容器?

三種服務容器:
1、Spring Container
2、Jetty Container
3、Log4j Container

Dubbo 的服務容器只是一個簡單的 Main 方法,並加載一個簡單的 Spring 容器,用於暴露服務。
六、dubbo都支持什麼協議,推薦用哪種?

1、dubbo://(推薦)
2、http://
3、rest://
4、redis://
5、memcached://

七、Dubbo裏面有哪幾種節點角色?

1、provide:暴露服務的服務提供方
2、consumer:調用遠程服務的服務消費方
3、registry:服務註冊於發現的註冊中心
4、monitor:統計服務調用次數和調用時間的監控中心
5、container:服務運行容器

八、dubbo服務註冊與發現的流程圖

 

dubbo服務註冊與發現的流程圖

 

九、Dubbo默認使用什麼註冊中心,還有別的選擇嗎?
推薦使用zookeeper作爲註冊中心,還有redis、multicast、simple註冊中心。
十、Dubbo 核心的配置有哪些?

 

Dubbo 核心的配置


十一、在 Provider 上可以配置的 Consumer 端的屬性有哪些?

1、timeout:方法調用超時
2、retries:失敗重試次數,默認重試 2 次
3、loadbalance:負載均衡算法,默認隨機
4、actives 消費者端,最大併發調用限制

十二、Dubbo有哪幾種負載均衡策略,默認是哪種?

1、random loadbalance:安權重設置隨機概率(默認);
2、roundrobin loadbalance:輪尋,按照公約後權重設置輪訓比例;
3、lastactive loadbalance:最少活躍調用數,若相同則隨機;
4、consistenthash loadbalance:一致性hash,相同參數的請求總是發送到同一提供者。

十三、Dubbo啓動時如果依賴的服務不可用會怎樣?
Dubbo缺省會在啓動時檢查依賴的服務是否可用,不可用時會拋出異常,阻止 Spring 初始化完成,默認
check="true",可以通過 check="false" 關閉檢查。
十四、Dubbo推薦使用什麼序列化框架,你知道的還有哪些?

推薦使用Hessian序列化,還有Duddo、FastJson、Java自帶序列化;

十五、Dubbo默認使用的是什麼通信框架,還有別的選擇嗎?

Dubbo 默認使用 Netty 框架,也是推薦的選擇,另外內容還集成有Mina、Grizzly。

十六、Dubbo有哪幾種集羣容錯方案,默認是哪種?

 

Dubbo集羣容錯方案

 

十七、服務提供者能實現失效踢出是什麼原理?

服務失效踢出基於zookeeper的臨時節點原理。

十八、Dubbo服務之間的調用是阻塞的嗎?

默認是同步等待結果阻塞的,支持異步調用。
Dubbo 是基於 NIO 的非阻塞實現並行調用,客戶端不需要啓動多線程即可完成並行調用多個遠程服務,相對
多線程開銷較小,異步調用會返回一個 Future 對象。

Dubbo暫時不支持分佈式事務。
十九、Dubbo的管理控制檯能做什麼?

管理控制檯主要包含:路由規則,動態配置,服務降級,訪問控制,權重調整,負載均衡,等管理功能。
注:dubbo源碼中的dubbo-admin模塊打成war包,發佈運行即可得到dubbo控制管理界面。

二十、Dubbo 服務暴露的過程

Dubbo 會在 Spring 實例化完 bean 之後,在刷新容器最後一步發佈 ContextRefreshEvent 事件的時候,通知
實現了 ApplicationListener 的 ServiceBean 類進行回調 onApplicationEvent 事件方法,Dubbo 會在這個方法
中調用 ServiceBean 父類 ServiceConfig 的 export 方法,而該方法真正實現了服務的(異步或者非異步)發
布。

二十一、當一個服務接口有多種實現時怎麼做?
當一個接口有多種實現時,可以用 group 屬性來分組,服務提供方和消費方都指定同一個 group 即可。
二十一、服務上線怎麼兼容舊版本?
可以用版本號(version)過渡,多個不同版本的服務註冊到註冊中心,版本號不同的服務相互間不引用。這
個和服務分組的概念有一點類似。
二十二、Dubbo 和 Dubbox 有什麼區別?
Dubbox 是繼 Dubbo 停止維護後,噹噹網基於 Dubbo 做的一個擴展項目,如加了服務可 Restful 調用,更新了開源組件等。
二十三、你覺得用 Dubbo 好還是 Spring Cloud 好?
擴展性的問題,沒有好壞,只有適合不適合,我更傾向於使用 Dubbo, Spring Cloud 版本升級太快,組件更新替換太頻繁,配置太繁瑣。
二十四、出現調用超時com.alibaba.dubbo.remoting.TimeoutException異常怎麼辦?

通常是業務處理太慢,可在服務提供方執行:jstack PID > jstack.log 分析線程都卡在哪個方法調用上,這裏就是慢的原因。
如果不能調優性能,請將timeout設大。 

二十五、出現java.util.concurrent.RejectedExecutionException或者Thread pool exhausted怎麼辦?

1、RejectedExecutionException表示線程池已經達到最大值,並且沒有空閒連,拒絕執行了一些任務。 
2、Thread pool exhausted通常是min和max不一樣大時,表示當前已創建的連接用完,進行了一次擴充,創建了新線程,但不影響運行。 
原因可能是連接池不夠用,請調整dubbo.properites中的:
// 設成一樣大,減少線程池收縮開銷  
dubbo.service.min.thread.pool.size=200  
dubbo.service.max.thread.pool.size=200  

 

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