dubbo 服務降級

2021-07-29 14:49:23 字數 2999 閱讀 1184

經歷過12306搶票的人應該經常會遇到這個問題:在搶票高峰的時候,明明票還有,但是查詢出來的列表卻是為空的(如果沒票列表也應該會呈現);等高峰過後再查詢,列表又恢復正常。個人猜測應該是查詢過程中出現了問題,要麼超時,要麼網路問題導致查詢失敗採用的服務降級處理。所以,最終呈現給使用者的並不是內部系統出錯之類的提示,而是乙個空的列表。

服務降級,當伺服器壓力劇增時,根據當前業務情況及流量對一些服務和頁面有策略的降級,以此緩解了伺服器資源壓力,以保證核心任務的正常執行,同時也保證了部分甚至大部分客戶得到正確響應。

當伺服器檢測到壓力增大,伺服器監測自動傳送通知給運維人員,運維人員根據自己或相關人員判斷後通過配置平台設定當前執行等級來降級。降級首先可以對非核心業務進行介面降級。如果效果不顯著,開始對一些頁面進行降級,以此保證核心功能的正常執行。

業務確定好對應業務的優先級別,指定好分級降級方案。當伺服器檢測到壓力增大,服務檢測自動傳送通知給運維人員。運維人員根據情況選擇執行等級. 

而各個應用還可以根據自己的級別自動判斷是否工作,如何拒絕

最後,在dubbo中想實現服務降級,需要怎麼樣做可以實現?

dubbo開發中,可能由於服務沒有啟動或者網路不通,呼叫中會出現rpcexception,也就是遠端呼叫失敗。如果是服務啟動順序的問題,可能加工check=」false」的配置可以得到很好的解決。但是,如果是服務宕掉或者併發數太高導致的rpcexception該如何處理?

檢視dubbo的官方文件,可以發現有個mock的配置,mock只在出現非業務異常(比如超時,網路異常等)時執行。mock的配置支援兩種,一種為boolean值,預設的為false。如果配置為true,則預設使用mock類名,即類名+mock字尾;另外一種則是配置」return null」,可以很簡單的忽略掉異常。

服務介面

/**介面定義*/

public

inte***ce

iuser

/**實現類*/

public

class

userimpl

implements

iuser

}public

void

adduser(user u)

public user getuserbyid(int id)

}return

null;

}}

服務提供方的配置:

dubbo-provider.xml

<?xml version="1.0" encoding="utf-8"?>

xmlns=""

xmlns:xsi=""

xmlns:dubbo=""

xsi:schemalocation=" /spring-beans.xsd /dubbo.xsd">

address="zookeeper:" />

name="dubbo"

port="20880" />

inte***ce="com.dubbosample.iface.iuser"

ref="userimpl"

timeout="10000" />

id="userimpl"

class="com.dubbosample.ifaceimpl.userimpl" />

beans>

服務呼叫方的配置:
<?xml version="1.0" encoding="utf-8"?>

xmlns=""

xmlns:xsi=""

xmlns:dubbo=""

xsi:schemalocation=" /spring-beans.xsd /dubbo.xsd">

name="dubbo-consumer" />

address="zookeeper:" />

id="iuser"

inte***ce="com.dubbosample.iface.iuser"

timeout="10000"

check="false"

mock="return null">

dubbo:reference>

beans>

服務呼叫的測試**:
public

static

void

main(string args) throws exception

測試時,如果服務啟動,則程式按照預期的執行正常;如果服務沒啟動,則此時執行程式,程式並未報錯,輸出資料為null。

說明通過以上的例子可以知道,通過mock的配置,可以很好的實現dubbo服務降級。但是,仔細檢視上面的例子會發現,iuser本身定義了兩個介面,乙個是新增使用者,乙個是根據id查詢使用者資訊。對於根據id查詢使用者資訊,在呼叫失敗的時候返回null很好理解,可能是由於驗證失敗或者記錄刪除了,但是對於新增使用者,可能就需要丟擲具體的業務資訊,否則程式無法處理後續的業務,包括頁面彈出」新增成功「或者列表重新整理的時候無法檢視到最新的記錄,這樣體驗將會非常不好。所以,如果要有較好的區分,可以通過以下的方式,可以更好的實現降級:

(1)將介面進行歸類,分成查詢操作類、變更操作類:對於查詢的操作分為乙個介面類,變更的歸類為其他的介面類,這樣對於查詢的可以使用mock=」return null」進行降級操作;對於變更類的操作介面,可以仍舊使用try……catch進行異常捕獲處理;

(2)配置mock=」true」,同時mock實現介面,介面名要注意命名規範:介面名+mock字尾。此時如果呼叫失敗會呼叫mock實現。mock實現需要保證有無參的構造方法。

配置mock=」true」的情況,對於上面的例子即在iuser的同個路徑下,新增類iusermock,實現如下:

public

class

iusermock

implements

iuser

@override

public user getuserbyid(int id)

}

Dubbo服務降級

當伺服器壓力劇增的情況下,根據實際業務情況及流量,對一些服務和頁面有策略的不處理或簡單處理,從而釋放伺服器資源以保證核心業務正常運作或高效運作。可以通過服務降級功能臨時遮蔽某個出錯的非關鍵服務並定義降級後的返回策略。dubbo支援兩種服務降級策略 1 mock force return null 表...

Dubbo服務降級設定

dubbo降級服務 dubbo開發中,通常是微服務架構,那麼在使用過程中可能會遇到多種問題 1 多個服務之間可能由於服務沒有啟動或者網路不通,呼叫中會出現遠端呼叫失敗 2 服務請求過大,需要停止部分服務以保證核心業務的正常執行 以上兩個問題可以使用dubbo的服務降級來實現 即 在服務宕掉或者併發數...

Dubbo服務降級設定

原文 dubbo降級服務 dubbo開發中,通常是微服務架構,那麼在使用過程中可能會遇到多種問題 1 多個服務之間可能由於服務沒有啟動或者網路不通,呼叫中會出現遠端呼叫失敗 2 服務請求過大,需要停止部分服務以保證核心業務的正常執行 以上兩個問題可以使用dubbo的服務降級來實現 即 在服務宕掉或者...