本地存根和本地伪装就是在消费方部署一个实现了目标接口的伪服务。用于在调用真正服务之前,之后的处理工作。其职能有点类似于Spring 的AOP。
为什么要使用本地存根和本地伪装
本地存根
通常情况下,我们调用接口之前都会生成一个请求对象。并且对请求对象中的必传字段以及类型做一定的校验,如果不满足调用接口条件,可能需要抛出异常或者其他处理方式。所以本地存根的作用可以认为是预处理信息。
本地伪装
如果请求条件达到了调用接口的要求,但是调用失败了。这个时候又如何处理?可以通过本地伪装的方式,mock一个对象返回。可以认为是服务消费方自己做的一个容错处理机制类。
通过上边两点,我们可以清楚的知道stub service和mock service发挥的作用类似于spring aop。所以,本着约定大于配置的要求。优先选择stub和mock而非spring sop。
实现步骤如下
1 在服务消费者工程中,写一个类,实现 接口
package cn.taobao.consumer_springboot_1.beidichungen;
import cn.taobao.Service.NewsService;
import cn.taobao.pojo.News;
import org.springframework.util.StringUtils;
import java.util.Date;
import java.util.List;
/**
* NewsService的本地存根实现
*/
public class newsServiceStub implements NewsService {
private final NewsService newsService;
/**
* 有参构造 dubbo会自动将远程NewsService注入进来
* @param newsService
*/
public newsServiceStub(NewsService newsService)
{
this.newsService=newsService;
}
@Override
public List<News> getNewsList() {
List<News> newsList = newsService.getNewsList();
return newsList;
}
/**
* 在远程调用前可以进行判断
* @param id
* @return
*/
@Override
public News getNewsById(Integer id) {
// 如果id不为空则进行远程调用 否则不调
if(!StringUtils.isEmpty(id))
{
News newsById = newsService.getNewsById(id);
return newsById;
}
return new News(0,"没有id时---本地存根---","没有 没有时的内容",new Date());
}
}
2 进行存根配置
在客户端调用远程服务的注解上添加stub,值为我们客户端实现的远程服务类的全路径名
如@Reference(version = "*",stub = "cn.taobao.consumer_springboot_1.beidichungen.newsServiceStub")