實戰(zhàn)Dubbo常用參數(shù)與服務(wù)治理參數(shù)配置

上一編說到了springboot整合dubbo注解版搭建和最簡單的RPC遠程調(diào)用的基本使用,但是dubbo不僅僅是能進行RPC調(diào)用,它也是一個服務(wù)治理的框架,官網(wǎng)對dubbo的介紹

Apache Dubbo (incubating) |?d?b??| 是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向接口的遠程方法調(diào)用,智能容錯和負載均衡,以及服務(wù)自動注冊和發(fā)現(xiàn)。

現(xiàn)在我們來對dubbo的一些常用參數(shù)的作用進行研究

http://dubbo.apache.org/zh-cn/docs/user/references/xml/dubbo-service.html dubbo官網(wǎng)上有生產(chǎn)者與消息者的參數(shù)說明

接著上一編的demo作演示,我用的是注解形式。生產(chǎn)者的配置在@Service注解上,消費者的配置在@Reference上

****1.check參數(shù):用在@Reference的參數(shù),啟動時檢查提供者是否存在,true報錯,false忽略,默認為true,如果生產(chǎn)者不存在,消費者啟動會報錯****

1.version參數(shù):給服務(wù)設(shè)定版本

用法:生產(chǎn)者只要在暴露dubbo服務(wù)的api的實現(xiàn)類上加上

@Service(version="版本號")就行了

image
image

上面生產(chǎn)者啟動時com.api.HelloFacade接口會注冊兩個不同版本的地址,查看一下zookeeper的節(jié)點/dubbo/com.api.HelloFacade/providers

[dubbo%3A%2F%2F172.16.19.186%3A20880%2Fcom.api.HelloFacad...version%3D2.0.0, dubbo%3A%2F%2F172.16.19.186%3A20880%2Fcom.api.HelloFacad...version%3D1.0.0]

發(fā)現(xiàn)上面有兩個地址,用逗號分開,地址最后有version2.0.0和1.0.0。說明這個api服務(wù)注冊了兩個地址到注冊中心

消費者調(diào)用時,注入服務(wù)接口時加上版本

<pre style="margin: 0px; padding: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: justify; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial; background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); font-family: Consolas; font-size: 12pt;">@Reference(version = "1.0.0")</pre>

image
image

上面結(jié)果說明調(diào)的是Service(version="1.0.0")的服務(wù)實現(xiàn)

改成

@Reference(version = "2.0.0")看看結(jié)果

image

調(diào)的是Service(version="2.0.0")的服務(wù)實現(xiàn)

注意:如果生產(chǎn)者注冊的服務(wù)設(shè)置了版本,消費者必須指定版本,如果生產(chǎn)沒設(shè)置版本,消費者可以不指定版本。官方推薦做法是設(shè)置版本,版本兩位數(shù)字如: 1.0

****version參數(shù)使用場景:如果需要進行灰度發(fā)布,一半服務(wù)使用1.0.0版本的接口,一半使用2.0.0的接口,就需要用到version****

****通常在接口不兼容時版本號才需要升級****version********

**********2.group參數(shù):服務(wù)分組,當一個接口有多個實現(xiàn),可以用分組區(qū)分**********

**********上面設(shè)定版本號的demo,就是********************一個接口有多個實現(xiàn)的例子,只是版本號不同,******************************如果版本號相同,服務(wù)注冊到注冊中心上只有一個地址,并且只代理其中一個實現(xiàn)類****************************************,現(xiàn)在兩個實現(xiàn)類改成都是1.0.0版本,測試結(jié)果為是只會HelloFacade2Impl的實現(xiàn)方法,如果我們想要區(qū)分,必須加上group********************

image
image

********************啟動生產(chǎn)者服務(wù)********************

********************[dubbo%3A%2F%2F172.16.19.186%3A20880%2Fcom.api.HelloFacade...****************************************group%3Dhello1****************************************...****************************************version%3D1.0.0,**************************************** dubbo%3A%2F%2F172.16.19.186%3A20880%2Fcom.api.HelloFacade...****************************************group%3Dhello2.****************************************..****************************************version%3D1.0.0****************************************]********************

********************注冊中心節(jié)點上有兩個相同版本不同group的地址********************

生產(chǎn)者設(shè)置了****version和group,****消費者調(diào)用時必須同時指定version和group

**調(diào)用hello1組 **@Reference(version = "1.0.0",group = "hello1")

image

結(jié)果,訪問的就是@Service(version = "1.0.0",group = "hello1")的服務(wù)接口實現(xiàn)類

image

**調(diào)用hello2組 **@Reference(version = "1.0.0",group = "hello2")

image

結(jié)果,訪問的就是@Service(version = "1.0.0",group = "hello2")的服務(wù)接口實現(xiàn)類

**********3.timeout參數(shù)(默認1000毫秒):遠程服務(wù)調(diào)用超時時間(毫秒),超過時間接口沒有響應(yīng)返回值就會報com.alibaba.dubbo.rpc.RpcException: Invoke remote method timeout異常。**********

**********4.retries參數(shù)(默認2):遠程服務(wù)調(diào)用重試次數(shù),不包括第一次調(diào)用,不需要重試請設(shè)為0。**********

**********演示一下重試機制**********

生產(chǎn)者代碼,客戶端每調(diào)用一次都會打印 count

image

消費者設(shè)置timeout=1(1毫秒沒有服務(wù)端響應(yīng)就報異常)來模擬拋出異常

image

調(diào)用服務(wù)后看生產(chǎn)者的控制臺

image

打印了3次,說明默認調(diào)用1次,重試了2次 這是默認的配置

現(xiàn)在修改retries=5,看執(zhí)行結(jié)果

image
image

打印了6次,說明重試了5次。

下面說一下dubbo服務(wù)治理(限流、容錯、服務(wù)降級、負載均衡等)的一些配置,都是dubbo集群操作

****1.cluster參數(shù):集群容錯(最后解釋這個名詞的意思)****

****可選方式 failover/failfast/failsafe/failback/forking****

Failover Cluster(默認)

失敗自動切換,當出現(xiàn)失敗,重試其它服務(wù)器 ****。通常用于讀操作,但重試會帶來更長延遲。可通過 retries="2" 來設(shè)置重試次數(shù)(不含第一次)。

Failfast Cluster

快速失敗,只發(fā)起一次調(diào)用,失敗立即報錯。通常用于非冪等性的寫操作,比如新增記錄。

Failsafe Cluster

失敗安全,出現(xiàn)異常時,直接忽略。通常用于寫入審計日志等操作。

Failback Cluster

失敗自動恢復(fù),后臺記錄失敗請求,定時重發(fā)。通常用于消息通知操作。

Forking Cluster

并行調(diào)用多個服務(wù)器,只要一個成功即返回。通常用于實時性要求較高的讀操作,但需要浪費更多服務(wù)資源。可通過 forks="2" 來設(shè)置最大并行數(shù)。

Broadcast Cluster

廣播調(diào)用所有提供者,逐個調(diào)用,任意一臺報錯則報錯 ****[2]****。通常用于通知所有提供者更新緩存或日志等本地資源信息

默認配置方式 cluster = "failover",啟動兩臺生產(chǎn)者測試失敗自動切換效果

第一臺生產(chǎn)者服務(wù),睡眠1.5,模擬超時

image

第二臺生產(chǎn)者服務(wù)器返回結(jié)果

image

消費者調(diào)用服務(wù)時,默認是隨機調(diào)用的(這個負載均衡策略下面講到)。

設(shè)置調(diào)用超時為timeout = 1000 看看調(diào)用結(jié)果

生產(chǎn)者1的控制臺調(diào)用了3次

image

但消費者打印的10次都是 我是生產(chǎn)者2號 (有報錯日志,不好全部截圖),

image

說明那3次調(diào)用超時后自動重試了生產(chǎn)者2的服務(wù)器。

注意:重試機制只會在**************非業(yè)務(wù)異常(比如超時,網(wǎng)絡(luò)異常等)時生效**************,如果生產(chǎn)者執(zhí)行過程中拋出異常,如int i =1/0,是不會重試的(重試機制不生效)

****2.******loadbalance******參數(shù):負載均衡策略,****

****可選值:random(默認值),roundrobin,leastactive,****

****分別表示:隨機,輪詢,最少活躍調(diào)用****

啟動兩個生產(chǎn)者服務(wù)來測試

啟動第一臺服務(wù)返回值

image

修改dubbo端口,idea把Single...的勾去掉,設(shè)置可運行多次main方法

image

然后啟動第二臺服務(wù)返回值

image

消費者循環(huán)調(diào)用10次

image

看看結(jié)果

image

默認就是隨機調(diào)用的,設(shè)置loadbalance = "roundrobin"看看是不是****輪詢****

image

每臺服務(wù)輪詢訪問,說明了配置生效

**************3.**************************mock**************************參數(shù):服務(wù)降級,服務(wù)接口調(diào)用失敗Mock實現(xiàn)類名,該Mock類必須有一個無參構(gòu)造函數(shù)****************************Mock只在出現(xiàn)非業(yè)務(wù)異常(比如超時,網(wǎng)絡(luò)異常等)時執(zhí)行**************

**************用法**************

**************創(chuàng)建一個服務(wù)降級后調(diào)用的類,并實現(xiàn)調(diào)用服務(wù)的接口**************

image

**************在消費者調(diào)用時,加上降級類的全路徑,**************

mock = "com.HelloFacadeMock"

image

************** 模擬超時場景**************

image
image

我在生產(chǎn)者設(shè)置了retries = 3,表示超時重試3次。從日志可以看出,調(diào)用了4次之前,還是超時,就會調(diào)用服務(wù)降級的方法。

結(jié)論:服務(wù)降級在重試機制執(zhí)行完之后才會被執(zhí)行

以上的參數(shù)配置,在生產(chǎn)者和消費者都能配置,那么同時配置優(yōu)先級別是哪個?還有配置哪邊比較合適?

優(yōu)先級別

  • 方法級優(yōu)先,接口級次之,全局配置再次之。

  • 如果級別一樣,則消費方優(yōu)先,提供方次之。

合理配置

  • 建議在 Provider 端配置的 Consumer 端屬性有:

  • timeout:方法調(diào)用的超時時間

  • retries:失敗重試次數(shù),缺省是 2

  • loadbalance:負載均衡算法 [3],缺省是隨機 random。還可以配置輪詢roundrobin、最不活躍優(yōu)先 [4] leastactive 和一致性哈希 consistenthash

  • actives:消費者端的最大并發(fā)調(diào)用限制,即當 Consumer 對一個服務(wù)的并發(fā)調(diào)用到上限后,新調(diào)用會阻塞直到超時,在方法上配置 dubbo:method 則針對該方法進行并發(fā)限制,在接口上配置 dubbo:service,則針對該服務(wù)進行并發(fā)限制

集群容錯

什么是容錯機制?容錯機制指的是某種系統(tǒng)控制在一定范圍內(nèi)的一種允許或包容犯錯情況的發(fā)生,比如調(diào)用時某個節(jié)點突然掛掉了,會自動切換到另一個集群節(jié)點去訪問。在分布式架構(gòu)下,網(wǎng)絡(luò)、應(yīng)用都可能發(fā)生故障,由于各個服務(wù)之間可能存在依賴關(guān)系,如果一條鏈路中的其中一個節(jié)點出現(xiàn)故障,將會導(dǎo)致雪崩效應(yīng)。為了減少某一個節(jié)點故障的影響范圍,所以我們才需要去構(gòu)建容錯服務(wù),來優(yōu)雅的處理這種中斷的響應(yīng)結(jié)果

服務(wù)降級

降級的目的是為了保證核心服務(wù)可用。

降級可以有幾個層面的分類:自動降級和人工降級;

按照功能可以分為:讀服務(wù)降級和寫服務(wù)降級;

    1. 對一些非核心服務(wù)進行人工降級,在大促之前通過降級開關(guān)關(guān)閉哪些推薦內(nèi)容、評價等對主流程沒有影響的功能
    1. 故障降級,比如調(diào)用的遠程服務(wù)掛了,網(wǎng)絡(luò)故障、或者RPC服務(wù)返回異常。 那么可以直接降級,降級的方案比如設(shè)置默認值、采用兜底數(shù)據(jù)(系統(tǒng)推薦的行為廣告掛了,可以提前準備靜態(tài)頁面做返回)等等
    1. 限流降級,在秒殺這種流量比較集中并且流量特別大的情況下,因為突發(fā)訪問量特別大可能會導(dǎo)致系統(tǒng)支撐不了。這個時候可以采用限流來限制訪問量。當達到閥值時,后續(xù)的請求被降級,比如進入排隊頁面,比如跳轉(zhuǎn)到錯誤頁(活動太火爆,稍后重試等)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容