Dubbo本地偽裝 Mock


本地偽裝通常用於在遠程調用出錯的情況下服務降級,即本地偽裝用來做容錯處理

通過將服務端設置睡眠使用得客戶端調用超時,拋出異常
public String sayHello(String name) {
    // Dubbo 默認的超時時間是 1000 ms,這里通過睡眠 5000ms 來達到觸發超時異常的發生
    // 由於超時的發生,這個結果並不會被返回給客戶端,取而代之的是 org.apache.dubbo.remoting.TimeoutException
    try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); }
    return "Hello " + name;
}

 

在客戶端提供本地偽裝的實現。當遠程調用發生錯誤的時候,返回給調用方的不是服務端的 "hello name",取而代之的是 "mock name"。
public class DemoServiceMock implements DemoService {
    
    public String sayHello(String name) {
        System.out.println("about to execute mock: " + DemoServiceMock.class.getSimpleName());
        return "mock " + name;
    }
}

 

要使用本地偽裝的話,還需要在 mock-consumer.xml 中配置屬性 mock。可以簡單的通過指定 mock="true" 來告訴 Dubbo 框架使用本地偽裝,這個時候,本地偽裝的包名需要和服務接口的包名一致,類名必須在服務接口的類名后加上 Mock 的后綴。例如,當服務接口名是 com.alibaba.dubbo.demo.DemoService 時,本地存根的全類名應該是 com.alibaba.dubbo.demo.DemoServiceMock。
<dubbo:reference id="demoService" check="false" interface="com.alibaba.dubbo.demo.DemoService" mock="true">
    <dubbo:method name="sayHello" retries="0"></dubbo:method>
</dubbo:reference>

 

如果不希望使用默認的命名規則,也可以直接通過 mock 屬性來指定本地偽裝的全類名
<dubbo:reference id="demoService" check="false" interface="com.alibaba.dubbo.demo.DemoService" 
                 mock="com.alibaba.dubbo.demo.consumer.DemoServiceMock">
    <dubbo:method name="sayHello" retries="0"></dubbo:method>
</dubbo:reference>

 

通過提供一個本地偽裝的類,可以最大限度的控制出錯之后的容錯邏輯。有的時候,業務上並不需要這樣靈活的機制,只有返回一個默認值的訴求,這個時候提供一個完整的本地偽裝的實現就顯得有點重了。或者線上出錯的時候,應用並沒有打包本地偽裝,需要通過推送規則的方式臨時對服務降級。Dubbo 框架為上面的這兩種訴求都提供了快捷方式,幫助用戶快速配置服務降級。
 
總結
本文介紹了 Dubbo 中本地存根和本地偽裝的概念和用法。從本質來講, 本地存根和本地偽裝等同於面向切面編程中的概念,通過諸如 Spring 框架提供的 AOP 編程可以達到同樣的目的。通過本文如何開發一個本地存根和本地偽裝的示例,讀者可以直觀的感受到通過框架提供的機制更加方便快捷。同時,對於很多簡單的場景和動態配置推送的場景,框架提供了僅通過配置而無需編碼的方式來滿足,進一步提升了框架使用者的效率。
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM