1. 功能特性一覽
- 實現(xiàn)rpc調(diào)用逻卖,像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程server上的方法
- 支持多協(xié)議:(Dubbo形纺、Rmi、Http危彩、Webservice攒磨、Redis等等)用戶可以根據(jù)業(yè)務(wù)場景選擇合適的協(xié)議
- 并發(fā)高性能:默認(rèn)Dubbo協(xié)議支持,Netty實現(xiàn)汤徽,Provider娩缰、Consumer、Register之間彼此保持長連接
- 解耦和伸縮性:利用注冊中心谒府,實現(xiàn)Provider和Consumer之間解耦拼坎,也實現(xiàn)Providers之間的解耦浮毯,從而實現(xiàn)靈活的擴(kuò)展和縮容
- 負(fù)載均衡:4種策略配合權(quán)重,而且支持代碼配置和Dubbo控制臺動態(tài)配置
- 高可用:利用注冊中心發(fā)現(xiàn)功能泰鸡,一個provider掛了的話债蓝,會自動被剔除掉,保證服務(wù)器繼續(xù)對外提供服務(wù)盛龄,如果重新provider重新恢復(fù)的話饰迹,又恢復(fù)到服務(wù)提供隊列當(dāng)中了
- 容錯: 支持failover、failfast余舶、forking等容錯機(jī)制啊鸭,引入retry和timeout參數(shù)配置
- 并發(fā)控制:服務(wù)端(executors、accepts參數(shù))和消費端(actives)都支持不同形式的并發(fā)控制
- 調(diào)用結(jié)果緩存:消費端支持配置3種策略的結(jié)果緩存
- 異步調(diào)用:支持阻塞和非阻塞將來式返回Future對象的兩種調(diào)用方式
- 支持權(quán)限配置功能:比如白名單功能
2.?Dubbo 原理淺析(基于Dubbo協(xié)議)
看起來像是BIO阻塞欧芽,其實是異步的NIO
1. 每個Provider就是一個Nio的Server莉掂,內(nèi)部機(jī)制由Netty實現(xiàn)(也可以是Mina等)葛圃,兩個線程組工作千扔。Provider啟動的時候,結(jié)合注冊中心库正,暴露對外服務(wù)曲楚。
2. Consumer的一個線程發(fā)起請求,會獲取一個全局的線程ID褥符,然后會把該請求的接口名稱龙誊、方法名稱、參數(shù)值等信息封裝成一個object的對象
3. 把 ID,請求Object放在全局的ConcurrentHashMap里面喷楣,發(fā)起異步的調(diào)用趟大,自身用object為鎖對象,wait請求線程進(jìn)入阻塞狀態(tài)
4. 調(diào)用成功后铣焊,觸發(fā)客戶端的監(jiān)聽逊朽,然后根據(jù)全局ConcurrentHashMap中ID找到object,設(shè)置好返回值和回調(diào)方法的時候曲伊,notifyAll調(diào)用的阻塞線程叽讳,完成調(diào)用
3. Dubbo的容錯性
通過在consumer里面配置策略,來實現(xiàn)不同的容錯措施坟募,只羅列了3種
I.?failover 超時失敗自動切換 (缺省值岛蚤,默認(rèn)失敗后再重試2次)(會導(dǎo)致重復(fù)寫)
這種方式通常用于讀操作,而不是寫操作. 因為用在寫操作,可能為導(dǎo)致重復(fù)寫。
如果其中一個Provider 超時回復(fù)了懈糯,會自動切換到其他的Provider節(jié)點涤妒,業(yè)務(wù)并不會停擺,如果Provider集群中只有1個Node赚哗,則會重復(fù)調(diào)用這個Provider
如果其中一個Provider 調(diào)用報錯了她紫,則直接調(diào)用失敗铁坎,也不會去嘗試切換,這個和超時不是一個概念
<dubbo:reference id="demoService" interface="..." cluster="failover" retries="2"/>
II.?Forking 并行調(diào)用多個服務(wù)器犁苏,只要一個成功即返回硬萍。(會導(dǎo)致重復(fù)寫)
通常用于實時性要求較高的讀操作,但需要浪費更多服務(wù)資源
III.?failfast 快速失效
只發(fā)起一次調(diào)用围详,失敗立即報錯朴乖。通常用于非冪等性寫操作,比如說新增記錄助赞。
但是這里也會有問題的买羞,如果是因為網(wǎng)絡(luò)問題,Provider的響應(yīng)時間慢雹食,Consumer以為調(diào)用失敗了畜普,但是Provider卻調(diào)用成功了,涉及到分布式事務(wù)的問題群叶。
如果是因為Provider報錯的話吃挑,倒沒事,因為兩邊都顯示執(zhí)行失敗街立。
?配置的方法(配置cunsumer的配置文件):
<dubbo:reference id="demoService" interface="...” cluster="forking" />
Dubbo 負(fù)載均衡策略
一般不通過代碼xml里面配置舶衬,而是通過web界面,動態(tài)的選擇均衡策略和權(quán)重赎离,這樣更靈活
1.?Random LoadBalance逛犹,按照權(quán)重隨機(jī)分配Provider,比如隨機(jī)且權(quán)重是 2:1梁剔,那么運(yùn)行30此虽画,大約有20次在Node1上10次在Node2上。
2.?RoundRobin LoadBalance 按照權(quán)重輪詢分配荣病,如果權(quán)重一樣就按照取模码撰。比如權(quán)重2:1,那么運(yùn)行30此众雷,一定有20次在Node1上10次在Node2上灸拍。
3.?LeastActive LoadBalance 節(jié)點越活躍越分配更多,避免慢節(jié)點堆積
4.?ConsistentHash LoadBalance 對第一個參數(shù)做Hash計算砾省,每次都訪問相同的Provider節(jié)點,如果該節(jié)點掛了鸡岗,會均攤到其它節(jié)點
?配置的方式
1.?xml配置:同時支持服務(wù)端和客戶端配置(如果都配置以客戶端配置為主);不僅支持接口級別的總配置编兄,也可以具體到該接口下面的某一個方法
2.?dubbo控制臺配置轩性,不需要在代碼中配置,可以靈活調(diào)整
Dubbo 并發(fā)控制
客戶端并發(fā)控制:actives參數(shù)
參考源碼:ActiveLimitFilter
1.?設(shè)置UserServiceBo接口中所有方法狠鸳,每個方法最多同時并發(fā)請求10個請求
2.?如果客戶端請求該方法并發(fā)超過了10則客戶端會被阻塞(count.wait)揣苏,等客戶端并發(fā)請求數(shù)量少于10的時候悯嗓,該請求才會被發(fā)送到服務(wù)提供方服務(wù)器
3.?如果等待時間超時,則拋出異常,這時候服務(wù)根本都沒有發(fā)送到服務(wù)提供方服務(wù)器卸察。
<dubbo:reference interface="..." actives="10"/>
?服務(wù)端并發(fā)控制:executes參數(shù)
1.?服務(wù)端并發(fā)執(zhí)行(或占用線程池線程數(shù))不能超過10個脯厨,超過的話,直接報錯
2.?源碼參考ExecuteLimitFilter
3.?設(shè)置dubbo協(xié)議的時候坑质,支持設(shè)置最大長連接數(shù)(不同于并發(fā)執(zhí)行數(shù))
<dubbo:service interface="..." executes="10" />
<dubbo:protocol name="dubbo" accepts="1000" />
常用協(xié)議
不同服務(wù)在性能上適用不同協(xié)議進(jìn)行傳輸合武,比如大數(shù)據(jù)用短連接協(xié)議,小數(shù)據(jù)大并發(fā)用長連接協(xié)議
Dubbo協(xié)議(默認(rèn))
1. Transporter(傳輸層):mina, netty, grizzy:默認(rèn)Netty(3.2.5)
2. Serialization: Hessian2 serialization
3. 單一鏈接涡扼、長連接稼跳、TCP
4. 適合小數(shù)據(jù)量(數(shù)據(jù)小于100k)、高并發(fā)的業(yè)務(wù)場景
5. 支持自定義配置消費端長連接的個數(shù)和服務(wù)端最大支持的長連接總數(shù)
6. 默認(rèn)Dubbo協(xié)議支持:消費者吃沪、服務(wù)提供者汤善、注冊中心之間的長連接,高性能支持并發(fā)請求票彪。消費者红淡、服務(wù)提供者和監(jiān)控中心是短連接。
?rmi協(xié)議(java標(biāo)準(zhǔn)的)
1. 多連接抹镊、短連接锉屈、BIO連接荤傲、基于http協(xié)議垮耳,適合并發(fā)量不大的業(yè)務(wù)場景
2. 約束:參數(shù)和返回值必須實現(xiàn)Java的序列化
其它高級特性
?Dubbo 結(jié)果緩存(支持3種策略:LRU、FIFO遂黍、LFU)
Dubbo的緩存是在服務(wù)消費者調(diào)用端進(jìn)行配置的终佛,因為只有業(yè)務(wù)端才知道自己業(yè)務(wù),然后配置相應(yīng)的策略
<dubbo:reference id="demoService" interface="..."??cache="lru" />
白名單功能
1.?maven項目需要在resources 下創(chuàng)建 META-INF\dubbocom.alibaba.dubbo.rpc.Filter文件
dubboContextFilter=com.mor.server.dubbo.service.AuthorityFilter
2.?重寫Filter方法
Dubbo超時設(shè)置
1.?在dubbo的provider和consumer的配置文件中雾家,如果都配置了timeout的超時時間铃彰,dubbo默認(rèn)以consumer中配置的時間為準(zhǔn)
2.?默認(rèn)調(diào)用超時重試的時間: 1s,未響應(yīng)就重試芯咧。
3.?provider中代碼的執(zhí)行不會因為超時而中斷牙捉,在執(zhí)行完畢后,會得到一個dubbo的警告敬飒。所以存在分布式事務(wù)的一致性問題
<dubbo:service interface="..."? ref="helloService" timeout="300"/>
參考資料
https://blog.csdn.net/zgliang88/article/details/75440043
https://www.cnblogs.com/heben/p/7887664.html? ? ?//容錯性