多版本支持
在Dubbo中配置不同版本的接口,會(huì)在zookeeper地址中有多個(gè)協(xié)議url的體現(xiàn),具體內(nèi)容如下:
dubbo%3A%2F%2F192.168.94.1%3A20880%2Fcom.yxk.IyxkHello%3Fanyhost%3Dtrue%26application%3Ddubbo-server%26dubbo%3D2.5.3%26interface%3Dcom.yxk.IyxkHello%26methods%3DsayHello%26owner%3Dyxk%26pid%3D4988%26revision%3D1.0.0%26side%3Dprovider%26timestamp%3D1536659809975%26version%3D1.0.0
dubbo%3A%2F%2F192.168.94.1%3A20880%2Fcom.yxk.IyxkHello2%3Fanyhost%3Dtrue%26application%3Ddubbo-server%26dubbo%3D2.5.3%26interface%3Dcom.yxk.IyxkHello%26methods%3DsayHello%26owner%3Dyxk%26pid%3D4988%26revision%3D1.0.1%26side%3Dprovider%26timestamp%3D1536659820796%26version%3D1.0.1
主機(jī)綁定
在發(fā)布一個(gè)Dubbo服務(wù)的時(shí)候,會(huì)生成一個(gè)dubbo://ip:port的協(xié)議地址,那么這個(gè)IP是根據(jù)什么生成的呢?大家可以在ServiceConfig.java代碼中找到如下代碼;可以發(fā)現(xiàn),在生成綁定的主機(jī)的時(shí)候,會(huì)通過(guò)一層一層的判斷,直到獲取到合法的ip地址。
集群容錯(cuò)
什么是容錯(cuò)機(jī)制?容錯(cuò)機(jī)制指的是某種系統(tǒng)控制在一定范圍內(nèi)的一種允許或包容犯錯(cuò)情況的發(fā)生,舉個(gè)簡(jiǎn)單例子,我們?cè)陔娔X上運(yùn)行一個(gè)程序,有時(shí)候會(huì)出現(xiàn)無(wú)響應(yīng)的情況,然后系統(tǒng)會(huì)彈出一個(gè)提示框讓我們選擇,是立即結(jié)束還是繼續(xù)等待,然后根據(jù)我們的選擇執(zhí)行對(duì)應(yīng)的操作,這就是“容錯(cuò)”。
在分布式架構(gòu)下,網(wǎng)絡(luò)、硬件、應(yīng)用都可能發(fā)生故障,由于各個(gè)服務(wù)之間可能存在依賴關(guān)系,如果一條鏈路中的其中一個(gè)節(jié)點(diǎn)出現(xiàn)故障,將會(huì)導(dǎo)致雪崩效應(yīng)。為了減少某一個(gè)節(jié)點(diǎn)故障的影響范圍,所以我們才需要去構(gòu)建容錯(cuò)服務(wù),來(lái)優(yōu)雅的處理這種中斷的響應(yīng)結(jié)果。
Dubbo提供了6種容錯(cuò)機(jī)制,分別如下
1. failsafe失敗安全,可以認(rèn)為是把錯(cuò)誤吞掉(記錄日志)
2. failover(默認(rèn))? ?重試其他服務(wù)器; retries(2)
3. failfast快速失敗, 失敗以后立馬報(bào)錯(cuò)
4. failback? 失敗后自動(dòng)恢復(fù)。
5. forking? forks.設(shè)置并行數(shù)
6. broadcast? 廣播,任意一臺(tái)報(bào)錯(cuò),則執(zhí)行的方法報(bào)錯(cuò)
配置方式如下,通過(guò)cluster方式,配置指定的容錯(cuò)方案

服務(wù)降級(jí)
降級(jí)的目的是為了保證核心服務(wù)可用
降級(jí)可以有幾個(gè)層面的分類:自動(dòng)降級(jí)和人工降級(jí); 按照功能可以分為:讀服務(wù)降級(jí)和寫(xiě)服務(wù)降級(jí);
1.對(duì)一些非核心服務(wù)進(jìn)行人工降級(jí),在大促之前通過(guò)降級(jí)開(kāi)關(guān)關(guān)閉哪些推薦內(nèi)容、評(píng)價(jià)等對(duì)主流程沒(méi)有影響的功能
2.故障降級(jí),比如調(diào)用的遠(yuǎn)程服務(wù)掛了,網(wǎng)絡(luò)故障、或者RPC服務(wù)返回異常。 那么可以直接降級(jí),降級(jí)的方案比如設(shè)置默認(rèn)值、采用兜底數(shù)據(jù)(系統(tǒng)推薦的行為廣告掛了,可以提前準(zhǔn)備靜態(tài)頁(yè)面做返回)等等
3.限流降級(jí),在秒殺這種流量比較集中并且流量特別大的情況下,因?yàn)橥话l(fā)訪問(wèn)量特別大可能會(huì)導(dǎo)致系統(tǒng)支撐不了。這個(gè)時(shí)候可以采用限流來(lái)限制訪問(wèn)量。當(dāng)達(dá)到閥值時(shí),后續(xù)的請(qǐng)求被降級(jí),比如進(jìn)入排隊(duì)頁(yè)面,比如跳轉(zhuǎn)到錯(cuò)誤頁(yè)(活動(dòng)太火爆,稍后重試等)
dubbo的降級(jí)方式: Mock
實(shí)現(xiàn)步驟
1.在client端創(chuàng)建一個(gè)TestMock類,實(shí)現(xiàn)對(duì)應(yīng)IGpHello的接口(需要對(duì)哪個(gè)接口進(jìn)行mock,就實(shí)現(xiàn)哪個(gè)),名稱必須以Mock結(jié)尾
2.在client端的xml配置文件中,添加如下配置,增加一個(gè)mock屬性指向創(chuàng)建的TestMock
模擬錯(cuò)誤(設(shè)置timeout),模擬超時(shí)異常,運(yùn)行測(cè)試代碼即可訪問(wèn)到TestMock這個(gè)類。當(dāng)服務(wù)端故障解除以后,調(diào)用過(guò)程將恢復(fù)正常。

配置優(yōu)先級(jí)別
以timeout為例,顯示了配置的查找順序,其它retries, loadbalance等類似。
1.方法級(jí)優(yōu)先,接口級(jí)次之,全局配置再次之。
2.如果級(jí)別一樣,則消費(fèi)方優(yōu)先,提供方次之。
其中,服務(wù)提供方配置,通過(guò)URL經(jīng)由注冊(cè)中心傳遞給消費(fèi)方。
建議由服務(wù)提供方設(shè)置超時(shí),因?yàn)橐粋€(gè)方法需要執(zhí)行多長(zhǎng)時(shí)間,服務(wù)提供方更清楚,如果一個(gè)消費(fèi)方同時(shí)引用多個(gè)服務(wù),就不需要關(guān)心每個(gè)服務(wù)的超時(shí)設(shè)置。