經歷過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服務的降級處理
dubbo服務的降級處理 服務不可用的時候的處理方法 容錯 不可處理返回null 2.2.0以上版本支援 參見 配置規則 向註冊中心寫入動態配置覆蓋規則 通過由監控中心或治理中心的頁面完成 registryfactory registryfactory extensionloader.getexte...
通俗易懂的 Dubbo 教程(九) 服務降級
當伺服器壓力比較大的時候,我們可以通過服務降級,遮蔽掉一些非關鍵服務,給它們定義乙個降級後的返回策略,從而降低核心業務的壓力。通俗的說,服務降級就是在遠端呼叫失敗 例如超時 之後,直接採用降級措施,返回乙個我們已經定義好的提示。例如,在12306搶票高峰時,明明票還有,但查詢列表總是空的,過了高峰之...