dubbo的本地存根的原理是:遠程服務后,客戶端通常只剩下接口,而實現全在服務器端,但提供方有些時候想在客戶端也執行部分邏輯,那么就在服務消費者這一端提供了一個Stub類,然后當消費者調用provider方提供的dubbo服務時,客戶端生成 Proxy 實例,這個Proxy實例就是我們正常調用dubbo遠程服務要生成的代理實例,然后消費者這方會把 Proxy 通過構造函數傳給 消費者方的Stub ,然后把 Stub 暴露給用戶,Stub 可以決定要不要去調 Proxy。會通過代理類去完成這個調用,這樣在Stub類中,就可以做一些額外的事,來對服務的調用過程進行優化或者容錯的處理。附圖:
實現步驟:
1. 定義一個服務接口和服務實現類
public interface UserInterface { public User getUserById(Integer id) ; }
public class UserService implements UserInterface { public User getUserById(Integer id) { User user = new User() ; user.setId(id); user.setName("hu"); return user; } }
2. 服務分布配置
<dubbo:service interface="org.huxin.dubbo.test.user.service.UserInterface" ref="userService" protocol="dubbo" retries="0"/> <bean id="userService" class="org.huxin.dubbo.test.user.service.impl.UserService" />
3.服務消費者的Stub類
public class UserServiceStub implements UserInterface { //必須定義這個接口,以便接收dubbo在調用遠程服務生成的服務代理類 private UserInterface userLocalService ; //這個構造函數必須要提供,dubbo框架會在消費者這一方調用這個方法 public UserServiceStub(UserInterface userLocalService ) { this.userLocalService = userLocalService ; } public User getUserById(Integer id) {
User user = null ;
try {
if (id == 1) {
user = this.userLocalService.getUserById(id) ;
}else {
user = new User();
user.setName("系統用戶");
}
}catch(Exception e) {
user = new User();
user.setName("異常用戶");
}
return user ;
} }
4. 服務消費方的配置
<dubbo:reference id="userService" interface="org.huxin.dubbo.test.user.service.UserInterface" stub="org.huxin.dubbo.test.UserServiceStub" protocol="dubbo"/>
5.測試代碼
@Test public void testGetUserById(){ Integer id = 2 ; UserInterface userService = context.getBean(UserInterface.class) ; User user = userService.getUserById( id) ; System.out.println(user.getName()); }
總結:上述代碼當調用服務出錯時,消費方會返回“異常用戶”,起到了容錯的作用。