Dubbo是阿里巴巴開源的基於 Java 的高性能 RPC 分散式服務框架,現已成為 Apache 基金會孵化項目。
面試官問你如果這個都不清楚,那下面的就沒必要問了。
官網:http://dubbo.apache.org
因為是阿里開源項目,國內很多互聯網公司都在用,已經經過很多線上考驗。內部使用了 Netty、Zookeeper,保證了高性能高可用性。
使用 Dubbo 可以將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,可用於提高業務復用靈活擴展,使前端應用能更快速的響應多變的市場需求。
下面這張圖可以很清楚的詮釋,最重要的一點是,分散式架構可以承受更大規模的並發流量。
下面是 Dubbo 的服務治理圖。
兩個沒關聯,如果硬要說區別,有以下幾點。
1)通信方式不同
Dubbo 使用的是 RPC 通信,而 Spring Cloud 使用的是 HTTP RESTFul 方式。
2)組成部分不同
不需要,如果硬要用 Web 容器,只會增加複雜性,也浪費資源。
Spring Container
Jetty Container
Log4j Container
Dubbo 的服務容器只是一個簡單的 Main 方法,並載入一個簡單的 Spring 容器,用於暴露服務。
服務註冊與發現流程圖
推薦使用 Zookeeper 作為註冊中心,還有 Redis、Multicast、Simple 註冊中心,但不推薦。
1)Spring 配置方式
2)Java API 配置方式
我曾經面試就遇到過面試官讓你寫這些配置,我也是蒙逼。。
配置之間的關係見下圖。
Dubbo 預設會在啟動時檢查依賴的服務是否可用,不可用時會拋出異常,阻止 Spring 初始化完成,默認 check="true",可以通過 check="false" 關閉檢查。
推薦使用Hessian序列化,還有Duddo、FastJson、Java自帶序列化。
Dubbo 默認使用 Netty 框架,也是推薦的選擇,另外內容還集成有Mina、Grizzly。
可以配置環境點對點直連,繞過註冊中心,將以服務介面為單位,忽略註冊中心的提供者列表。
Dubbo 允許配置多協議,在不同服務上支持不同協議或者同一服務上同時支持多種協議。
當一個介面有多種實現時,可以用 group 屬性來分組,服務提供方和消費方都指定同一個 group 即可。
可以用版本號(version)過渡,多個不同版本的服務註冊到註冊中心,版本號不同的服務相互間不引用。這個和服務分組的概念有一點類似。
可以,Dubbo 提供了聲明式緩存,用於加速熱門數據的訪問速度,以減少用戶加緩存的工作量。
默認是同步等待結果阻塞的,支持非同步調用。
Dubbo 是基於 NIO 的非阻塞實現並行調用,客戶端不需要啟動多線程即可完成並行調用多個遠程服務,相對多線程開銷較小,非同步調用會返回一個 Future 對象。
非同步調用流程圖如下。
目前暫時不支持,後續可能採用基於 JTA/XA 規範實現,如以圖所示。
dubbo 通過 telnet 命令來進行服務治理。
telnet localhost 8090
Dubbo 2.2.0 以上版本支持。
Dubbo 是通過 JDK 的 ShutdownHook 來完成優雅停機的,所以如果使用 kill -9 PID 等強制關閉指令,是不會執行優雅停機的,只有通過 kill PID 時,才會執行。
服務失效踢出基於 Zookeeper 的臨時節點原理。
Dubbo 可以使用 Pinpoint 和 Apache Skywalking(Incubator) 實現分散式服務追蹤,當然還有其他很多方案。
讀操作建議使用 Failover 失敗自動切換,默認重試兩次其他伺服器。
寫操作建議使用 Failfast 快速失敗,發一次調用失敗就立即報錯。
Dubbo 必須依賴 JDK,其他為可選。
管理控制台主要包含:路由規則,動態配置,服務降級,訪問控制,權重調整,負載均衡,等管理功能。
Dubbo 會在 Spring 實例化完 bean 之後,在刷新容器最後一步發布 ContextRefreshEvent 事件的時候,通知實現了 ApplicationListener 的 ServiceBean 類進行回調 onApplicationEvent 事件方法,Dubbo 會在這個方法中調用 ServiceBean 父類 ServiceConfig 的 export 方法,而該方法真正實現了服務的(非同步或者非非同步)發布。
2014 年開始停止維護過幾年,17 年開始重新維護,並進入了 Apache 項目。
Dubbox 是繼 Dubbo 停止維護後,噹噹網基於 Dubbo 做的一個擴展項目,如加了服務可 Restful 調用,更新了開源組件等。
別的還有 Spring cloud、Facebook 的 Thrift、Twitter 的 Finagle 等。
可以的,項目地址如下。
https://github.com/apache/incubator-dubbo-spring-boot-project
Dubbo 的設計目的是為了滿足高並發小數據量的 rpc 調用,在大數據量下的性能表現並不好,建議使用 rmi 或 http 協議。
要了解 Dubbo 就必須看其源碼,了解其原理,花點時間看下吧,網上也有很多教程,後續有時間我也會在公眾號上分享 Dubbo 的源碼。
擴展性的問題,沒有好壞,只有適合不適合,不過我好像更傾向於使用 Dubbo, Spring Cloud 版本升級太快,組件更新替換太頻繁,配置太繁瑣,還有很多我覺得是沒有 Dubbo 順手的地方……
針對於上面涉及到的知識點我總結出了有1到5年開發經驗的程序員在面試中涉及到的絕大部分架構面試題及答案做成了文檔和架構視頻資料免費分享給大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分散式、高並發等架構技術資料),希望能幫助到您面試前的複習且找到一個好的工作,也節省大家在網上搜索資料的時間來學習,也可以關注我一下以後會有更多乾貨分享。
需要資料的私信我「資料」即可免費獲取
推薦閱讀: