Dubbo探索(六)

1、本地假裝api

Mock一般用於服務降級,好比某驗權服務,當服務提供方所有掛掉後,客戶端不拋出異常,而是經過Mock數據返回受權失敗。Mock是Stub的一個子集,便於服務提供方在客戶端執行容錯邏輯,因常常須要在出現RpcException(好比網絡失敗,超時等)時進行容錯,而在出現業務異常(好比登陸用戶名密碼錯誤)時不須要容錯,若是用Stub,可能就須要捕獲並依賴RpcException類,而用Mock就能夠不依賴RpcException,由於它的約定就是隻有出現RpcException時才執行。緩存

實現:服務器

1) 在api中實現UserService接口,並按約定命名爲UserServiceMock。此處咱們實現出現RpcException時,返回僞造數據,進行容錯。網絡

/**
 * Version: 3.0
 * Author: pattywgm
 * Time: 17/6/5 下午4:24
 * Desc: 容錯處理
 */
public class UserServiceMock implements UserService {
    /**
     * provider出現RpcException時,返回mock數據,進行容錯處理
     *
     * @return
     */
    public List<UserVo> findAllUsers() {
        List<UserVo> userVos = new ArrayList<UserVo>();
        userVos.add(new UserVo("000001", "默認用戶", 22, "***********"));
        return userVos;
    }

    public UserVo findUserById(String id) {
        return new UserVo("000001", "默認用戶", 22, "***********");
    }
}

2)在dubbo-consumer.xml中配置併發

<dubbo:reference id="userService" group="db" interface="com.patty.dubbo.api.service.UserService"
                     timeout="10000" retries="3" mock="true" check="false">
</dubbo:reference>

設置 mock="true",表示啓用容錯處理,當出現RpcException時,服務端會在客戶端執行容錯邏輯,Mock的方法會被調用。ide

3)若是服務的消費方常常須要try-catch捕獲異常,如:spa

Offer offer = null;
try {
    offer = offerService.findOffer(offerId);
} catch (RpcException e) {
   logger.error(e);
}

請考慮改成Mock實現,並在Mock中return null。線程

若是隻是想簡單的忽略異常,在2.0.11以上版本可用:code

<dubbo:service interface="com.foo.BarService" mock="return null" />

 

2、延遲暴露xml

若是你的服務須要Warmup時間,好比初始化緩存,等待相關資源就位等,可使用delay進行延遲暴露,設置delay="5000"表示延遲5s暴露服務,delay="-1"表示延遲到Spring初始化完成後,再暴露服務,這樣作能夠避免Spring2.x初始化死鎖問題。

 

3、併發控制

1) 服務端併發

<dubbo:service interface="com.foo.BarService" executes="10" /> 表示限制服務的各個方法,服務器端併發執行(或佔用線程池線程數)不能超過10個。也能夠指定特定方法的併發數,在<dubbo: method>中配置

2)客戶端併發

<dubbo:service interface="com.foo.BarService" actives="10" /> 表示限制服務的各個方法,客戶端併發執行(或佔用鏈接的請求數)不能超過10個。也能夠指定特定方法的併發數,在<dubbo: method>中配置。 actives屬性也可在<dubbo: reference>中配置,而且若是<dubbo:service>和<dubbo:reference>都配了actives,<dubbo:reference>優先

 

4、鏈接控制

限制服務器端接受的鏈接不能超過10個:(以鏈接在Server上,因此配置在Provider上)

<dubbo:provider protocol="dubbo" accepts="10" />

or

<dubbo:protocol name="dubbo" accepts="10" />

限制客戶端服務使用鏈接鏈接數:(若是是長鏈接,好比Dubbo協議,connections表示該服務對每一個提供者創建的長鏈接數)

<dubbo:reference interface="com.foo.BarService" connections="10" />

or

<dubbo:service interface="com.foo.BarService" connections="10" />

accepts是指定服務端的最大可接受鏈接數, connections則是指定客戶端對每一個提供者的最大鏈接數,rmi、http、hessian等短鏈接協議表示限制鏈接數,dubbo等長鏈接協表示創建的長鏈接個數。

 

5、延遲鏈接

延遲鏈接,用於減小長鏈接數,當有調用發起時,再建立長鏈接,至關於一種懶加載的模式,只對使用長鏈接的dubbo協議生效。

<dubbo:protocol name="dubbo" lazy="true" />

 

6、粘滯鏈接

粘滯鏈接用於有狀態服務,儘量讓客戶端老是向同一提供者發起調用,除非該提供者掛了,再連另外一臺。粘滯鏈接將自動開啓延遲鏈接,以減小長鏈接數。

<dubbo:protocol name="dubbo" sticky="true" />
相關文章
相關標籤/搜索