[TOC]
1 為何要使用dubbo
大規(guī)模服務(wù)化之前员舵,應(yīng)用可能只是通過(guò)RMI或Hessian等工具藕畔,簡(jiǎn)單的暴露和引用遠(yuǎn)程服務(wù)注服,通過(guò)配置服務(wù)的URL地址進(jìn)行調(diào)用,通過(guò)F5等硬件進(jìn)行負(fù)載均衡女淑。
(1) 當(dāng)服務(wù)越來(lái)越多時(shí)鸭你,服務(wù)URL配置管理變得非常困難擒权,F(xiàn)5硬件負(fù)載均衡器的單點(diǎn)壓力也越來(lái)越大。
此時(shí)需要一個(gè)服務(wù)注冊(cè)中心愉老,動(dòng)態(tài)的注冊(cè)和發(fā)現(xiàn)服務(wù)俺夕,使服務(wù)的位置透明劝贸。并通過(guò)在消費(fèi)方獲取服務(wù)提供方地址列表逗宁,實(shí)現(xiàn)軟負(fù)載均衡和Failover,降低對(duì)F5硬件負(fù)載均衡器的依賴件甥,也能減少部分成本。
(2) 當(dāng)進(jìn)一步發(fā)展瓣颅,服務(wù)間依賴關(guān)系變得錯(cuò)蹤復(fù)雜宫补,甚至分不清哪個(gè)應(yīng)用要在哪個(gè)應(yīng)用之前啟動(dòng)曾我,架構(gòu)師都不能完整的描述應(yīng)用的架構(gòu)關(guān)系抒巢。
這時(shí),需要自動(dòng)畫(huà)出應(yīng)用間的依賴關(guān)系圖稚晚,以幫助架構(gòu)師理清理關(guān)系蜈彼。
(3) 接著俺驶,服務(wù)的調(diào)用量越來(lái)越大,服務(wù)的容量問(wèn)題就暴露出來(lái)还绘,這個(gè)服務(wù)需要多少機(jī)器支撐拍顷?什么時(shí)候該加機(jī)器塘幅?
為了解決這些問(wèn)題电媳,第一步,要將服務(wù)現(xiàn)在每天的調(diào)用量捞稿,響應(yīng)時(shí)間娱局,都統(tǒng)計(jì)出來(lái),作為容量規(guī)劃的參考指標(biāo)任斋。其次仁卷,要可以動(dòng)態(tài)調(diào)整權(quán)重犬第,在線上歉嗓,將某臺(tái)機(jī)器的權(quán)重一直加大鉴分,并在加大的過(guò)程中記錄響應(yīng)時(shí)間的變化带膀,直到響應(yīng)時(shí)間到達(dá)閥值,記錄此時(shí)的訪問(wèn)量伦糯,再以此訪問(wèn)量乘以機(jī)器數(shù)反推總?cè)萘俊?/p>
2 dubbo實(shí)戰(zhàn)
關(guān)于dubbo項(xiàng)目搭建敛纲,實(shí)戰(zhàn)的例子淤翔。網(wǎng)上可以找到很多佩谷,這里提供一個(gè)我覺(jué)得寫(xiě)的比較清晰的,Dubbo與Zookeeper抡谐、SpringMVC整合和使用
3 基本概念
節(jié)點(diǎn)角色說(shuō)明:
Container: 服務(wù)運(yùn)行容器童叠。
Provider: 暴露服務(wù)的服務(wù)提供方厦坛。
Consumer: 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方。
Registry: 服務(wù)注冊(cè)與發(fā)現(xiàn)的注冊(cè)中心放仗。
Monitor: 統(tǒng)計(jì)服務(wù)的調(diào)用次調(diào)和調(diào)用時(shí)間的監(jiān)控中心撬碟。
調(diào)用關(guān)系說(shuō)明:
- 服務(wù)容器負(fù)責(zé)啟動(dòng),加載惶傻,運(yùn)行服務(wù)提供者银室。
- 服務(wù)提供者在啟動(dòng)時(shí)励翼,向注冊(cè)中心注冊(cè)自己提供的服務(wù)。
- 服務(wù)消費(fèi)者在啟動(dòng)時(shí)抓狭,向注冊(cè)中心訂閱自己所需的服務(wù)否过。
- 注冊(cè)中心返回服務(wù)提供者地址列表給消費(fèi)者,如果有變更叠纹,注冊(cè)中心將基于長(zhǎng)連接推送變更數(shù)據(jù)給消費(fèi)者誉察。
- 服務(wù)消費(fèi)者惹谐,從提供者地址列表中氨肌,基于軟負(fù)載均衡算法,選一臺(tái)提供者進(jìn)行調(diào)用怎囚,如果調(diào)用失敗,再選另一臺(tái)調(diào)用考婴。
- 服務(wù)消費(fèi)者和提供者沥阱,在內(nèi)存中累計(jì)調(diào)用次數(shù)和調(diào)用時(shí)間,定時(shí)每分鐘發(fā)送一次統(tǒng)計(jì)數(shù)據(jù)到監(jiān)控中心策精。
負(fù)載均衡策略崇棠,可選值:random(隨機(jī)),roundrobin(輪循),leastactive(最少活躍調(diào)用)
集群容錯(cuò)模式
可以自行擴(kuò)展集群容錯(cuò)策略枕稀,參見(jiàn):集群擴(kuò)展
Failover Cluster
- 失敗自動(dòng)切換,當(dāng)出現(xiàn)失敗,重試其它服務(wù)器骄恶。(缺省)
- 通常用于讀操作僧鲁,但重試會(huì)帶來(lái)更長(zhǎng)延遲。
- 可通過(guò)retries="2"來(lái)設(shè)置重試次數(shù)(不含第一次)斟叼。
Failfast Cluster
- 快速失敗春寿,只發(fā)起一次調(diào)用绑改,失敗立即報(bào)錯(cuò)。
- 通常用于非冪等性的寫(xiě)操作识腿,比如新增記錄渡讼。
Failsafe Cluster
- 失敗安全,出現(xiàn)異常時(shí)展箱,直接忽略析藕。
- 通常用于寫(xiě)入審計(jì)日志等操作。
Failback Cluster
- 失敗自動(dòng)恢復(fù)账胧,后臺(tái)記錄失敗請(qǐng)求治泥,定時(shí)重發(fā)遮精。
- 通常用于消息通知操作。
Forking Cluster
- 并行調(diào)用多個(gè)服務(wù)器准脂,只要一個(gè)成功即返回檬洞。
- 通常用于實(shí)時(shí)性要求較高的讀操作狸膏,但需要浪費(fèi)更多服務(wù)資源湾戳。
可通過(guò)forks="2"來(lái)設(shè)置最大并行數(shù)砾脑。
Broadcast Cluster
- 廣播調(diào)用所有提供者艾杏,逐個(gè)調(diào)用购桑,任意一臺(tái)報(bào)錯(cuò)則報(bào)錯(cuò)其兴。(2.1.0開(kāi)始支持)
- 通常用于通知所有提供者更新緩存或日志等本地資源信息。
重試次數(shù)配置如:(failover集群模式生效)
<dubbo:service retries="2" />
或者
<dubbo:reference retries="2" />
或者
<dubbo:reference>
<dubbo:method name="findFoo" retries="2" />
</dubbo:reference>
集群模式配置
<dubbo:service cluster="failsafe" />
或者
<dubbo:reference cluster="failsafe" />
4 負(fù)載均衡
可以自行擴(kuò)展負(fù)載均衡策略榴徐,參見(jiàn):負(fù)載均衡擴(kuò)展
Random LoadBalance
- 隨機(jī)坑资,按權(quán)重設(shè)置隨機(jī)概率袱贮。
- 在一個(gè)截面上碰撞的概率高,但調(diào)用量越大分布越均勻嗽仪,而且按概率使用權(quán)重后也比較均勻闻坚,有利于動(dòng)態(tài)調(diào)整提供者權(quán)重窿凤。
RoundRobin LoadBalance
- 輪循跨蟹,按公約后的權(quán)重設(shè)置輪循比率。
- 存在慢的提供者累積請(qǐng)求問(wèn)題相种,比如:第二臺(tái)機(jī)器很慢品姓,但沒(méi)掛腹备,當(dāng)請(qǐng)求調(diào)到第二臺(tái)時(shí)就卡在那植酥,久而久之弦牡,所有請(qǐng)求都卡在調(diào)到第二臺(tái)上驾锰。
LeastActive LoadBalance
- 最少活躍調(diào)用數(shù)椭豫,相同活躍數(shù)的隨機(jī),活躍數(shù)指調(diào)用前后計(jì)數(shù)差医增。
- 使慢的提供者收到更少請(qǐng)求,因?yàn)樵铰奶峁┱叩恼{(diào)用前后計(jì)數(shù)差會(huì)越大搬素。
ConsistentHash LoadBalance
- 一致性Hash熬尺,相同參數(shù)的請(qǐng)求總是發(fā)到同一提供者囱淋。
- 當(dāng)某一臺(tái)提供者掛時(shí)妥衣,原本發(fā)往該提供者的請(qǐng)求税手,基于虛擬節(jié)點(diǎn)芦倒,平攤到其它提供者兵扬,不會(huì)引起劇烈變動(dòng)。
- 算法參見(jiàn):http://en.wikipedia.org/wiki/Consistent_hashing津坑。
- 缺省只對(duì)第一個(gè)參數(shù)Hash傲霸,如果要修改疆瑰,請(qǐng)配置
<dubbo:parameter key="hash.arguments" value="0,1" />
- 缺省用160份虛擬節(jié)點(diǎn),如果要修改昙啄,請(qǐng)配置
<dubbo:parameter key="hash.nodes" value="320" />
配置方式:
<dubbo:service interface="..." loadbalance="roundrobin" />
<dubbo:reference interface="..." loadbalance="roundrobin" />
<dubbo:service interface="...">
<dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:service>
<dubbo:reference interface="...">
<dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:reference>
關(guān)于一致性hash穆役,五分鐘理解一致性哈希算法(consistent hashing)
更多關(guān)于dubbo的信息,查看dubbo官方網(wǎng)站