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" />