Dubbo官網(wǎng)實(shí)戰(zhàn)使用技巧
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號”
優(yōu)質(zhì)文章,第一時間送達(dá)
76套java從入門到精通實(shí)戰(zhàn)課程分享
1、啟動時檢查:
我們檢查依賴的服務(wù)是否啟動,可利用下面三個屬性,優(yōu)先級從左到右逐漸降低。
如果服務(wù)不是強(qiáng)依賴,或者說服務(wù)之間可能存在死循環(huán)依賴,我們應(yīng)該將 check 置為 false。
檢查判斷優(yōu)先級:dubbo.reference.check?>?dubbo.consumer.check?>?dubbo.registry.check
2、只訂閱:
一般在開發(fā)環(huán)境時,我們新開發(fā)的接口都還不能發(fā)布出去,所以我們本地的服務(wù)不能往注冊中心注冊;
而且,如果我們將本地服務(wù)注冊上去,會影響別的服務(wù)的聯(lián)調(diào),所以我們會利用下面屬性,將服務(wù)設(shè)置為只訂閱,不往注冊中心注冊。
dubbo.registry.register=false
dubbo.registry.subscribe=true
3、集群容錯:
集群容錯模式可利用?dubbo.reference.cluster、dubbo.consumer.cluster?和?dubbo.service.cluster、dubbo.provider.cluster?等屬性配置。
集群容錯中主要有幾個角色:
Invoker:Provider 的一個可調(diào)用 Service 的抽象,Invoker 封裝了 Provider 地址以及 Service 接口信息。
Directory:代表多個 Invoker ,可以把它看成是 List,但是與 List 不同的是,它的值可能是動態(tài)變化的,比如注冊中心推送變更。
Cluster:將 Directory 中的多個 Invoker 偽裝成一個 Invoker,對上層透明,偽裝過程包含了容錯邏輯,調(diào)用失敗后,重試另一個。
Router:負(fù)責(zé)從多個 Invoker 中按路由規(guī)則選出子集,比如讀寫分離,應(yīng)用隔離等。
LoadBalance:負(fù)責(zé)從多個 Invoker 中選出具體的一個用于本次調(diào)用,選的過程包含了負(fù)載均衡算法,調(diào)用失敗后,需要重選
dubbo 提供的集群容錯模式:
Failover Cluster:失敗自動切換,當(dāng)出現(xiàn)失敗,重試其它服務(wù)器。通常用于讀操作,但重試會帶來更長延遲。可通過 retries=“2” 來設(shè)置重試次數(shù)(不含第一次)。
Failfast Cluster:快速失敗,即只發(fā)起一次調(diào)用,失敗立即報(bào)錯。通常用于非冪等性的寫操作。
Failsafe Cluster:失敗安全,出現(xiàn)異常時直接忽略掉。通常用于寫入審計(jì)日志等不重要的操作。
Failback Cluster:失敗自動恢復(fù),后臺記錄失敗請求,定時重發(fā)。通常用于消息通知操作。
Forking Cluster:并行調(diào)用多個服務(wù)器,只要一個成功就返回。通常用于實(shí)時性要求較高的讀操作,但需要浪費(fèi)更多服務(wù)資源。可通過 forks=“2” 來設(shè)置最大并行數(shù)。
Broadcast Cluster:廣播調(diào)用所有提供者,逐個調(diào)用,任意一臺報(bào)錯則報(bào)錯。通常用于通知所有提供者更新緩存或日志等本地資源信息。
4、負(fù)載均衡:
在集群負(fù)載均衡時,Dubbo 提供了多種均衡策略,缺省為 random 隨機(jī)調(diào)用。
Random LoadBalance:
隨機(jī),按權(quán)重設(shè)置隨機(jī)概率。
在一個截面上碰撞的概率高,但調(diào)用量越大分布越均勻,而且按概率使用權(quán)重后也比較均勻,有利于動態(tài)調(diào)整提供者權(quán)重。
RoundRobin LoadBalance:
輪詢,按公約后的權(quán)重設(shè)置輪詢比率。
存在慢的提供者累積請求的問題,比如:第二臺機(jī)器很慢,但沒掛,當(dāng)請求調(diào)到第二臺時就卡在那,久而久之,所有請求都卡在調(diào)到第二臺上。
LeastActive LoadBalance:
最少活躍調(diào)用數(shù),相同活躍數(shù)的隨機(jī),活躍數(shù)指調(diào)用前后計(jì)數(shù)差。
使慢的提供者收到更少請求,因?yàn)樵铰奶峁┱叩恼{(diào)用前后計(jì)數(shù)差會越大。
ConsistentHash LoadBalance:
一致性 Hash,相同參數(shù)的請求總是發(fā)到同一提供者。
當(dāng)某一臺提供者掛時,原本發(fā)往該提供者的請求,基于虛擬節(jié)點(diǎn),平攤到其它提供者,不會引起劇烈變動。
算法參見:http://en.wikipedia.org/wiki/Consistent_hashing
缺省只對第一個參數(shù) Hash,如果要修改,請配置
缺省用 160 份虛擬節(jié)點(diǎn),如果要修改,請配置
可在服務(wù)端服務(wù)級別、客戶端服務(wù)級別、服務(wù)端方法級別和客戶端方法級別設(shè)置。
服務(wù)端服務(wù)級別&客戶端服務(wù)級別配置:
dubbo.provider.loadbalance=leastactive
dubbo.consumer.loadbalance=leastactive服務(wù)端方法級別和客戶端方法級別配置:
@DubboService(interfaceClass?=?DubboServiceOne.class,loadbalance?=?"random",
????????????????methods?=?{
????????????????????@Method(name="sayHello",loadbalance?=?"leastActive")
????????????????})
public?class?DubboServiceOneImpl?implements?DubboServiceOne?{}
@DubboReference(loadbalance?=?"random",
????????????????????methods?=?{
????????????????????????@Method(name="sayHello",loadbalance?=?"leastactive")
????????????????????})
private?DubboServiceOne?DubboServiceOne;
5、直連提供者
在開發(fā)及測試環(huán)境下,經(jīng)常需要繞過注冊中心,只測試指定服務(wù)提供者,這時候可能需要點(diǎn)對點(diǎn)直連,點(diǎn)對點(diǎn)直連方式,將以服務(wù)接口為單位,忽略注冊中心的提供者列表,A 接口配置點(diǎn)對點(diǎn),不影響 B 接口從注冊中心獲取列表。
在 JVM 啟動參數(shù)中加入 -D 參數(shù)映射服務(wù)地址:
java?-D?com.alibaba.xxx.XxxService=dubbo://localhost:20890
在標(biāo)簽或者@DubboResource注解中增加 url 屬性。
"dubbo://localhost:20890"?interfaceClass=""/>
@DubboReference(url="dubbo://localhost:20890")
private?DubboServiceOne?DubboServiceOne;6、本地調(diào)用
本地調(diào)用使用了 injvm 協(xié)議,是一個偽協(xié)議,它不開啟端口,不發(fā)起遠(yuǎn)程調(diào)用,只在 JVM 內(nèi)直接關(guān)聯(lián),但執(zhí)行 Dubbo 的 Filter 鏈。
protocol、provider、consumer、service、reference 都可以設(shè)置。
7、本地存根
遠(yuǎn)程服務(wù)后,客戶端通常只剩下接口,而實(shí)現(xiàn)全在服務(wù)器端,但提供方有些時候想在客戶端也執(zhí)行部分邏輯,比如:做 ThreadLocal 緩存,提前驗(yàn)證參數(shù),調(diào)用失敗后偽造容錯數(shù)據(jù)等等,此時就需要在 API 中帶上 Stub,客戶端生成 Proxy 實(shí)例,會把 Proxy 通過構(gòu)造函數(shù)傳給 Stub ,然后把 Stub 暴露給用戶,Stub 可以決定要不要去調(diào) Proxy。
Sub 利用?dubbo.service.sub?屬性設(shè)置。
例子:
假設(shè)服務(wù)提供者提供了一個接口,DubboServiceOne,然后服務(wù)消費(fèi)者要做本地存根,只需要在自己的項(xiàng)目中,增加一個 DubboServiceOne 接口的實(shí)現(xiàn)類,然后在?@DubboReference?注解或者??標(biāo)簽增加 stub 屬性即可。
實(shí)現(xiàn)類:
/**
?*?DubboServiceOne?本地存根
?*?@author?winfun
?*?@date?2021/2/1?9:59?上午
?**/
@Slf4j
public?class?DubboServiceOneStub?implements?DubboServiceOne?{
????private?final?DubboServiceOne?dubboServiceOne;
????public?DubboServiceOneStub(DubboServiceOne?dubboServiceOne){
????????this.dubboServiceOne?=?dubboServiceOne;
????}
????/***
?????*??say?hello
?????*?@author?winfun
?????*?@param?name?name
?????*?@return?{@link?ApiResult??}
?????**/
????@Override
????public?ApiResult?sayHello(String?name)?{
????????try?{
????????????ApiResult?result?=?this.dubboServiceOne.sayHello(name);
????????????if?(ApiContants.SUCCESS.equals(result.getCode())){
????????????????return?ApiResult.fail(ApiContants.FAIL,"業(yè)務(wù)異常",result.getData());
????????????}
????????}catch?(Exception?e){
????????????log.error("call?DubboServiceOne?throw?exception!message?is?{}",e.getMessage());
????????????return?ApiResult.fail("調(diào)用失敗");
????????}
????????return?null;
????}
}
使用:
/**
?*?測試本地存根
?*?@author?winfun
?*?@date?2021/2/1?10:26?上午
?**/
@RestController
public?class?TestStubController?{
????@DubboReference(lazy?=?true,check?=?false,stub?=?"com.winfun.demo.stub.DubboServiceOneStub")
????private?DubboServiceOne?dubboServiceOne;
????@GetMapping("/stub/{name}")
????public?ApiResult?testStub(@PathVariable("name")?String?name){
????????return?this.dubboServiceOne.sayHello(name);
????}
}
8、本地偽裝
本地偽裝通常用于服務(wù)降級,比如某驗(yàn)權(quán)服務(wù),當(dāng)服務(wù)提供方全部掛掉后,客戶端不拋出異常,而是通過 mock 數(shù)據(jù)返回授權(quán)失敗。
mock 是 sub 的一個子集,mock是發(fā)生了錯誤,也就是拋出 RpcException 異常時會觸發(fā);而使用 sub,那么就需要在程序捕獲異常,然后進(jìn)行處理。
mock 機(jī)制可利用標(biāo)簽或者@DubboReference的mock屬性設(shè)置。
詳細(xì)可看我自己寫的文章:https://blog.csdn.net/Howinfun/article/details/113439208
9、服務(wù)延遲暴露
Dubbo 2.6.5 之后,所有服務(wù)都將在 Spring 初始化完成后進(jìn)行暴露,如果你不需要延遲暴露服務(wù),無需配置 delay。
可使用?dubbo.service.delay?屬性來設(shè)置延遲多少秒暴露服務(wù)。delay 的時間單位為毫秒。
10、并發(fā)控制
并發(fā)控制都是在服務(wù)提供者端設(shè)置的。
首先,可通過?dubbo.service.executes?屬性限制服務(wù)端每個方法的并發(fā)量(占用線程池線程數(shù))、通過?dubbo.method.executes(服務(wù)端) 屬性直接將并發(fā)限制具體到接口的某個方法。
還可以通過?dubbo.service.actives/dubbo.reference.actives?屬性控制接口每個方法每個客戶端的并發(fā)執(zhí)行數(shù);
通過?dubbo.method.actives(兩端) 屬性直接將并發(fā)執(zhí)行控制到接口的某個方法。
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
本文鏈接:
https://blog.csdn.net/Howinfun/article/details/113584534
鋒哥最新SpringCloud分布式電商秒殺課程發(fā)布
??????
??長按上方微信二維碼?2 秒
感謝點(diǎn)贊支持下哈?
