dubbo的本地存根(Stub)

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

  

總結:上述代碼當調用服務出錯時,消費方會返回「異經常使用戶」,起到了容錯的做用。代理

相關文章
相關標籤/搜索