开发者学堂课程【阿里巴巴分布式服务框架 Dubbo 快速入门:本地存根】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/624/detail/9470
本地存根
服务的消费者 consumer 要调用服务提供者 provider 的功能,它们是远程调用,而功能的实现都在 provider 这一段,consumer 相当于只有远程的接口,每次需要调用,都要连接 provider 来调用实现,有时想真正调用之前,可能需要做一些参数验证,做一些缓存,这样就可以编写一个本地存根。
远程引用的接口在服务消费者本地也有本地代码,本地存根代码调用之前,需做一些判断或做一些小功能,若满足需要的要求,再去运用远程代理对象调远程服务,若不满足,就可以不调用。
上述需要怎么做?
我们只需要在消费方写一个远程接口的本地存根实现,必须有一个有参构造器,有参构造器传入远程接口的代理实现,这是 dubbo 默认传进来的。
当判断执行通过以后,再来调用代码,这段代码相当于调用远程服务真正的功能。
代码为
//构造函数传入真正的远程代理对象
public (BarService barService ){
this.barService=barService;
}
public String
sayHello
(String name){
//此代码在客户端执行,你可以在客户端做 ThreadLocal 本地缓存,或预先验证参数是否合法,等等
try{
return barService.sayHello(name);
}catch(Exception e){
//你可以容错,可以做任何 AOP 拦截事项
Return“容错数据”;
进行实验:
Order-service 的实现,想要调 user-service,在本地名称先写 UserserviceStub,并在本地存根实现 user-service 接口。
在 USerservice 接口实现后,有一个方法,
// TODO Auto-generated method stub
Private final UserService usrService;
//注入 USerService
并使用有参构造器的方式(如下图)
此时 dubbo 自动创建本地存根对象
*//传入 Userservice 远程代理对象
*@param userService
此时可在本地存根里获取用户地址列表
@Override
public List getUserAddressList(String userId){
//TODO Auto-generated method stub
If(!StringUtils.isEmpty(userId)){
return userService.getUserAddressList(userId);
}
//若 userId 不是空串,进行远程调用
return null;
}
//否则 return 成空的
可以有一个本地存根的实现,可在之前做一些小验证,写好之后需要配置
<!--配置本地存根-->
<dubbo:reference interface=”com.atguigu.gmall.service.UserService”
id=”userService” timeout=”5000” retries=”3” version=”*” stub=”com.atguigu.gmall.service.imp.UserServiceStub”
运行期间,若本地存根代码被调用,代码为
@Override
public List getUserAddressList(String userId){
//TODO Auto-generated method stub
System.out,print(“UserserviceStub……”)
If(!StringUtils.isEmpty(userId)){
return userService.getUserAddressList(userId);
}
进行测试:
运行 main 方法
本地存根确实被调用,调用后才进行调用远程的服务,判断通过了。
本地存根实际在开发中应该放在接口处,接口远程的实现在另外一个工程里,但在调用远程实现前,可把本地存根代码放进来。