dubbo的本地存根(Stub)


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());  
		
	}

  

總結:上述代碼當調用服務出錯時,消費方會返回“異常用戶”,起到了容錯的作用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM