Dubbo底層原理深度剖析
一、dubbo 概述
Apache Dubbo (incubating) |?d?b??| 是一款高性能、輕量級(jí)的開源 Java RPC 框架,它提供了三大核心能力:面向接口的遠(yuǎn)程方法調(diào)用,智能容錯(cuò)和負(fù)載均衡,以及服務(wù)自動(dòng)注冊(cè)和發(fā)現(xiàn)。 Dubbo 是一個(gè)分布式服務(wù)框架,致力于提供高性能和透明化的 rpc遠(yuǎn)程服務(wù)調(diào)用方案、服務(wù)治理方案。
特性:
面向接口代理:調(diào)用接口的方法,在 A 服務(wù)器調(diào)用 B 服務(wù)器的方法,由 dubbo 實(shí)現(xiàn)對(duì) B 的調(diào)用,無(wú)需關(guān)心實(shí)現(xiàn)的細(xì)節(jié),就像 MyBatis 訪問(wèn) Dao 的接口,可以操作數(shù)據(jù)庫(kù)一樣。不用關(guān)心 Dao 接口方法的實(shí)現(xiàn)。這樣開發(fā)是方便,舒服的。
二、基本架構(gòu)
服務(wù)提供者(Provider):暴露服務(wù)的服務(wù)提供方,服務(wù)提供者在啟動(dòng)時(shí),向注冊(cè)中心注冊(cè)自己提供的服務(wù)。
服務(wù)消費(fèi)者(Consumer): 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方,服務(wù)消費(fèi)者在啟動(dòng)時(shí),向注冊(cè)中心訂閱自己所需的服務(wù),服務(wù)消費(fèi)者,從提供者地址列表中,基于軟負(fù)載均衡算法,選一臺(tái)提供者進(jìn)行調(diào)用,如果調(diào)用失 敗,再選另一臺(tái)調(diào)用。
注冊(cè)中心(Registry):注冊(cè)中心返回服務(wù)提供者地址列表給消費(fèi)者,如果有變更,注冊(cè)中心將基于長(zhǎng)連接推送變更數(shù)據(jù)給消費(fèi)者
監(jiān)控中心(Monitor):服務(wù)消費(fèi)者和提供者,在內(nèi)存中累計(jì)調(diào)用次數(shù)和調(diào)用時(shí)間,定時(shí)每分鐘發(fā)送一次統(tǒng)計(jì)數(shù)據(jù)到監(jiān)控中心
三、dubbo 支持的協(xié)議
支持多種協(xié)議:dubbo , hessian , rmi , http, webservice , thrift , memcached , redis。
dubbo 官方推薦使用 dubbo 協(xié)議。dubbo 協(xié)議默認(rèn)端口 20880
使用 dubbo 協(xié)議,spring 配置文件加入:
<dubbo:protocol name="dubbo" port="20880" />
四、電商平臺(tái)需求
某電商平臺(tái)系統(tǒng)需求,用戶瀏覽商品;選擇商品下訂單,訂單系統(tǒng)需要獲取用戶信息中的送貨地址;向支付系統(tǒng)請(qǐng)求完成付款。
五、直連方式 dubbo
點(diǎn)對(duì)點(diǎn)的直連項(xiàng)目:消費(fèi)者直接訪問(wèn)服務(wù)提供者,沒(méi)有注冊(cè)中心。消費(fèi)者必須指定服務(wù)提供者的訪問(wèn)地址(url)。
消費(fèi)者直接通過(guò) url 地址訪問(wèn)固定的服務(wù)提供者。這個(gè) url 地址是不變的。
1.實(shí)現(xiàn)目標(biāo)
用戶訪問(wèn) ------>【商品網(wǎng)站服務(wù)】訪問(wèn)-----> 【訂單服務(wù)】
2.實(shí)現(xiàn)方式
以 JavaSE 為例,服務(wù)提供者,服務(wù)消費(fèi)者都是 JavaSE 項(xiàng)目
(1) 創(chuàng)建服務(wù)提供者:訂單服務(wù)
A、新建 java project
項(xiàng)目名稱:link-orderservice-provider
設(shè)置 version 為 1.0.0
B、 maven pom.xml
C、 創(chuàng)建訂單實(shí)體類:Order
D、新建訂單服務(wù)接口:OrderService
E、 新建接口的實(shí)現(xiàn)類:OrderServiceImpl
F、創(chuàng)建 dubbo 配置文件
orderservce-provider.xml
G、測(cè)試配置文件
H、安裝本地 jar 到 maven 倉(cāng)庫(kù)
服務(wù)接口中的方法要給消費(fèi)者使用,消費(fèi)者項(xiàng)目需要知道接口名稱和接口中的方法名稱、參數(shù)等。這些信息服務(wù)提供者才知道。需要把接口的 class 文件打包為 jar .
服務(wù)接口項(xiàng)目的類文件打包為 jar, 安裝到 maven 倉(cāng)庫(kù),倉(cāng)庫(kù)中的提供者 jar 可以被消費(fèi)者使用。
使用 idea 的 maven 窗口執(zhí)行 install
(2) 創(chuàng)建服務(wù)消費(fèi)者:商品網(wǎng)站
A、新建 java project
項(xiàng)目名稱:link-main-web
B、 maven pom.xml
C、 創(chuàng)建購(gòu)買商品接口
D、創(chuàng)建購(gòu)買接口的實(shí)現(xiàn)類
E、 創(chuàng)建 dubbo 配置文件
shop-consume.xml
F、 執(zhí)行消費(fèi)者
六、dubbo 服務(wù)化最佳實(shí)踐
1.分包
建議將服務(wù)接口、服務(wù)模型、服務(wù)異常等均放在公共包中。
2.粒度
服務(wù)接口盡可能大粒度,每個(gè)服務(wù)方法應(yīng)代表一個(gè)功能,而不是某功能的一個(gè)步驟,否則將面臨分布式事務(wù)問(wèn)題,Dubbo 暫未提供分布式事務(wù)支持。
服務(wù)接口建議以業(yè)務(wù)場(chǎng)景為單位劃分,并對(duì)相近業(yè)務(wù)做抽象,防止接口數(shù)量爆炸。
不建議使用過(guò)于抽象的通用接口,如:Map query(Map),這樣的接口沒(méi)有明確語(yǔ)義,會(huì)給后期維護(hù)帶來(lái)不便。
3.版本
每個(gè)接口都應(yīng)定義版本號(hào),為后續(xù)不兼容升級(jí)提供可能,如:
<dubbo:serviceinterface="com.xxx.XxxService" version="1.0" />。
建議使用兩位版本號(hào),要變更服務(wù)版本。先升級(jí)一半提供者為新版本,再將消費(fèi)者全部升為新版本,然后將剩下的一半提供者升為新版本。

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
3月27日立即報(bào)名>> 【工程師系列】汽車電子技術(shù)在線大會(huì)
-
4月30日立即下載>> 【村田汽車】汽車E/E架構(gòu)革新中,新智能座艙挑戰(zhàn)的解決方案
-
5月15-17日立即預(yù)約>> 【線下巡回】2025年STM32峰會(huì)
-
即日-5.15立即報(bào)名>>> 【在線會(huì)議】安森美Hyperlux™ ID系列引領(lǐng)iToF技術(shù)革新
-
5月15日立即下載>> 【白皮書】精確和高效地表征3000V/20A功率器件應(yīng)用指南
-
5月16日立即參評(píng) >> 【評(píng)選啟動(dòng)】維科杯·OFweek 2025(第十屆)人工智能行業(yè)年度評(píng)選
推薦專題
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達(dá)AI統(tǒng)治的開始
- 2 北電數(shù)智主辦酒仙橋論壇,探索AI產(chǎn)業(yè)發(fā)展新路徑
- 3 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 4 “AI寒武紀(jì)”爆發(fā)至今,五類新物種登上歷史舞臺(tái)
- 5 國(guó)產(chǎn)智駕迎戰(zhàn)特斯拉FSD,AI含量差幾何?
- 6 光計(jì)算迎來(lái)商業(yè)化突破,但落地仍需時(shí)間
- 7 東陽(yáng)光:2024年扭虧、一季度凈利大增,液冷疊加具身智能打開成長(zhǎng)空間
- 8 地平線自動(dòng)駕駛方案解讀
- 9 封殺AI“照騙”,“淘寶們”終于不忍了?
- 10 優(yōu)必選:營(yíng)收大增主靠小件,虧損繼續(xù)又逢關(guān)稅,能否乘機(jī)器人東風(fēng)翻身?