1. 程式人生 > >實現dubbo服務降級

實現dubbo服務降級

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/wsm0712syb/article/details/61413276

dubbo降級服務

使用dubbo在進行服務呼叫時,可能由於各種原因(伺服器宕機/網路超時/併發數太高等),呼叫中就會出現RpcException,呼叫失敗。

服務降級就是指在由於非業務異常導致的服務不可用時(上面舉得例子),可以返回預設值,避免異常影響主業務的處理。

dubbo服務降級配置

mock 配置方式

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

mock配置在呼叫方,服務降級不需要對服務方配置產生修改。下面舉個例子說明,mock的配置:

/**介面定義*/
public interface FooService {

    public void doSomething1();

    public String doSomething2(String str);

}

/**實現類*/
public class FooServiceImpl implements FooService {

    public void doSomething1() {
        System.out.println("service invoke: doSomething1");
    }

    public String doSomething2(String str) {
        System.out.println("service invoke: doSomething2 ," + str);
        return "service invoke: doSomething2";
    }
}

服務提供端 dubbo.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://code.alibabatech.com/schema/dubbo        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- 提供方應用資訊,用於計算依賴關係 -->
    <dubbo:application name="hello-world-app" />

    <!-- 使用multicast廣播註冊中心暴露服務地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />

    <!-- 用dubbo協議在20880埠暴露服務 -->
    <dubbo:protocol name="dubbo" port="20880" />

    <!-- 宣告需要暴露的服務介面 -->
    <dubbo:service interface="com.test.service.FooService" ref="fooServerImpl" timeout="10000" />

    <!-- 和本地bean一樣實現服務 -->
    <bean id="fooServerImpl" class="com.test.serviceimpl.FooServerImpl" />

</beans>

服務呼叫方dubbo.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://code.alibabatech.com/schema/dubbo        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- 消費方應用名,用於計算依賴關係,不是匹配條件,不要與提供方一樣 -->
    <dubbo:application name="dubbo-consumer"  />

    <dubbo:registry address="zookeeper://127.0.0.1:2181" />

    <!-- 生成遠端服務代理,可以和本地bean一樣使用demoService -->
    <dubbo:reference id="fooService" interface="com.test.service.FooService"  timeout="10000" check="false" mock="return null">
    </dubbo:reference>

</beans>

測試在呼叫端呼叫服務兩個方法,當服務端正常啟動時,程式獲得正常返回值;當服務提供方沒有啟動(模擬服務不可用狀態),呼叫方依然正常執行,呼叫doSomething2獲取返回值時null。

mock實現介面方式

上面在<dubbuo:reference> 中配置mock="retrun null" 的配置,在服務降級時會對service中的所有方法做統一處理,即都返回null。但是有的時候我們需要一些方法在服務不可用時告訴我們一些其他資訊,以便做其他處理。如更新/刪除等。要有較好的區分,可以通過以下的方式。

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

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

public class FooServiceMock implements FooService {
    public void doSomething1() {
        throw new RuntimeException("fail!");
    }

    public String doSomething2(String str) {
        return null;
    }
}

dubbo服務降級具體實現

通過Dubbo的Filter對Dubbo進行擴充套件,從而使得每次服務發起呼叫都可以得到監控,從而可以監控每次服務的呼叫。

對自動判斷服務提供端是否宕機:通過一個記錄器對每個方法出現RPC異常進行記錄,並且可以配置在某個時間段內連續出現都少個異常可判定為服務提供端出現了宕機,從而進行服務降級。

自動恢復遠端服務呼叫:通過配置檢查服務的頻率來達到定時檢查遠端服務是否可用,從而去除服務降級。

判斷降級相關配置

降級配置分配為應用級別,介面級別,方法級別 。dubbo相關引數配置在dubbo.properties中,預設是在classpath根目錄,也可以通過-Ddubbo.properties.file來指定該檔案路徑。

應用級別

dubbo.reference.default.break.limit:該引數是配置一個方法在指定時間內出現多少個異常則判斷為服務提供方宕機  dubbo.reference.default.retry.frequency:該引數配置重試頻率,比如配置100,則表示沒出現一百次異常則嘗試一下遠端服務是否可用  dubbo.reference.circuit.break:服務降級功能開關,預設是false,表示關閉狀態,可以配置為true

介面級別

dubbo.reference.fullinterfacename.break.limit:同上面dubbo.reference.default−break−limit,指定某個介面dubbo.reference.fullinterfacename.break.limit:同上面dubbo.reference.default−break−limit,指定某個介面dubbo.reference.{fullinterfacename}.retry.frequency:同上面  dubbo.reference.${fullinterfacename}.circuit.break:服務降級功能開關,預設是false,表示關閉狀態,可以配置為true

方法級別

dubbo.reference.fullinterfacename.fullinterfacename.{methodName}.break.limit:同上面dubbo.reference.default-break-limit,指定某個介面的某個方法  dubbo.reference.fullinterfacename.fullinterfacename.{methodName}.retry.frequency:同上面dubbo.reference.default-retry-frequency,指定某個介面的某個方法  dubbo.reference.fullinterfacename.fullinterfacename.{methodName}.circuit.break:服務降級功能開關,預設是false,表示關閉狀態,可以配置為true