dubbo的本地存根的原理是:遠程服務後,客戶端一般只剩下接口,而實現全在服務器端,但提供方有些時候想在客戶端也執行部分邏輯,那麼就在服務消費者這一端提供了一個Stub類,而後當消費者調用provider方提供的dubbo服務時,客戶端生成 Proxy 實例,這個Proxy實例就是咱們正常調用dubbo遠程服務要生成的代理實例,而後消費者這方會把 Proxy 經過構造函數傳給 消費者方的Stub ,而後把 Stub 暴露給用戶,Stub 能夠決定要不要去調 Proxy。會經過代理類去完成這個調用,這樣在Stub類中,就能夠作一些額外的事,來對服務的調用過程進行優化或者容錯的處理。附圖:java
實現步驟:服務器
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. 服務分佈配置ide
<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. 服務消費方的配置this
<dubbo:reference id="userService" interface="org.huxin.dubbo.test.user.service.UserInterface" stub="org.huxin.dubbo.test.UserServiceStub" protocol="dubbo"/>
5.測試代碼spa
@Test public void testGetUserById(){ Integer id = 2 ; UserInterface userService = context.getBean(UserInterface.class) ; User user = userService.getUserById( id) ; System.out.println(user.getName()); }
總結:上述代碼當調用服務出錯時,消費方會返回「異經常使用戶」,起到了容錯的做用。代理