遠程服務後,客戶端通常只剩下接口,而實現全在服務器端,但提供方有些時候想在客戶端也執行部分邏輯,比如:做 ThreadLocal 緩存,提前驗證參數,調用失敗後偽造容錯數據等等,此時就需要在 API 中帶上 Stub,客戶端生成 Proxy 實例,會把 Proxy 通過構造函數傳給 Stub,然後把 Stub 暴露給用戶,Stub 可以決定要不要去調 Proxy。
1. 定義一個服務接口和服務實現類
public interface UserInterface {
public User getUserById(Integer id) ;
}
@Service(version = "1.0.0", stub = "com.jikeh.stub.UserServiceStub")
public class UserService implements UserInterface {
public User getUserById(Integer id) {
User user = new User() ;
user.setId(id);
user.setName("hu");
return user;
}
}
2.服務消費者的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 {
user = userLocalService.getUserById(id) ;
}catch(Exception e) {
//降級
user = new User();
user.setName("異常用戶");
}
return user ;
}
}
3.測試代碼
@Reference(version = "1.0.0")
private UserServiceStub userService;
public static void main(String[] args) {
User user = userService.getUserById(1) ;
System.out.println(user.getName());
}
閱讀更多 極客慧 的文章