通俗易懂的 Dubbo 教程(九) 服務降級

2021-10-05 13:09:59 字數 2957 閱讀 1959

當伺服器壓力比較大的時候,我們可以通過服務降級,遮蔽掉一些非關鍵服務,給它們定義乙個降級後的返回策略,從而降低核心業務的壓力。

通俗的說,服務降級就是在遠端呼叫失敗(例如超時)之後,直接採用降級措施,返回乙個我們已經定義好的提示。例如,在12306搶票高峰時,明明票還有,但查詢列表總是空的,過了高峰之後再次查詢,又會恢復正常,這可能是因為超時或者網路問題導致查詢失敗,最後不得不採用了服務降級進行處理,給我們返回乙個已經定義好的值。

dubbo 中有乙個 mock 的配置,我們可以通過這個配置實現服務降級。其中,mock 的配置有兩種:

通過 boolean 值指定是否實行服務降級,其中預設為 false,當配置為 true 時,預設通過在服務名後面加上 mock 字尾的類來指定降級後的返回值

直接 return null,統一返回空

需要注意的是,mock 只會在非業務異常的時候執行,比如超時,又或者是網路異常。

首先我們來看一下不做服務降級會是什麼後果,我們在服務提供者中故意令其超時,由於 dubbo 預設超時時間為1s,我們就令其睡眠兩秒,**如下:

package edu.szu.producer.serviceimpl;

import com.alibaba.dubbo.config.annotation.service;

import edu.szu.api.service.nameservice;

import org.springframework.stereotype.component;

@component

@service

public

class

nameserviceimpl

implements

nameservice

catch

(interruptedexception e)

return

"遠端呼叫的值:"

+ name;

}}

然後執行服務提供者與服務消費者,果不其然,直接報錯。

然後我們新增 return null 的降級設定,**如下,看看其效果

package edu.szu.consumer.serviceimpl;

import com.alibaba.dubbo.config.annotation.reference;

import edu.szu.api.service.nameservice;

import edu.szu.consumer.service.changeservice;

import org.springframework.stereotype.component;

@component

public

class

changeserviceimpl

implements

changeservice

}

顯然它會直接返回空,這需要我們做進一步的處理。需要注意的是,當我們將 mock 設定為 return null 時,它不會進行遠端呼叫,而是直接返回乙個空就行了。

在某些情況下,直接返回空對我們的使用者不太友好,這時我們可以給使用者返回乙個我們之前定義好的值。首先我們在 api 模組中指定乙個服務降級的處理策略,其中這個處理類名預設為在服務名上加上 mock 字尾,且應該與服務介面在同路徑下。

package edu.szu.api.service;

public

class

nameservicemock

implements

nameservice

}

然後在消費者中配置 mock 屬性為 true。

package edu.szu.consumer.serviceimpl;

import com.alibaba.dubbo.config.annotation.reference;

import edu.szu.api.service.nameservice;

import edu.szu.consumer.service.changeservice;

import org.springframework.stereotype.component;

@component

public

class

changeserviceimpl

implements

changeservice

}

然後我們發起一次遠端呼叫,由於呼叫超時,顯然是失敗的,但由於我們進行了服務降級,會返回我們指定的返回值。

另外,該方法與直接 return null 不同的是,如果我們的遠端呼叫成功了,不會執行服務降級,會返回遠端呼叫的結果,而 return null 事實上根本不進行遠端呼叫就直接返回空了。

當然,我們也可以通過 admin 控制台來實現服務降級。

我們發現對服務可以進行遮蔽與容錯操作,其中,遮蔽表示對服務不發起遠端呼叫,直接返回空就行了;而容錯則表示在對該服務的方法呼叫失敗後,再返回空,這兩個是不同的。

通俗易懂的 Dubbo 教程(四) 超時

有時遠端呼叫的服務執行時間太慢,消費端不想等待,這該怎麼辦?沒事,dubbo 給我們提供了乙個超時機制,超過指定的時間,直接返回乙個超時異常即可。下面我們來測試一下,在提供者中我們讓其睡眠兩秒再返回,消費者一切設定正常。component service public class nameservi...

通俗易懂的 Dubbo 教程(六) 多版本

當乙個介面的實現出現不相容公升級時,我們可以用版本號過渡,版本號不同的服務相互間不引用。那麼我們應該如何進行版本遷移呢?我們可以採取以下步驟 在低壓力時間段,先公升級一半提供者為新版本 再將所有消費者公升級為新版本 然後將剩下的一半提供者公升級為新版本 我們可以利用 dubbo 的多版本實現灰度發布...

通俗易懂的C STL

泛型程式設計 generic programming 是一種語言機制,通過它可以實現乙個標準的容器庫。像類一樣,泛型也是一種抽象資料型別,但是泛型不屬於物件導向,它是物件導向的補充和發展。泛型程式設計在c 上的應用主要體現在兩方面 函式模板和類模板。接下來舉個栗子 csdn部落格 anyway,模板...