深度解析dubbo过滤器之回声测试
本文基于dubbo v2.6.1
1.什么是回声测试
我这里引用官方的解释:
回声测试用于检测服务是否可用,回声测试按照正常请求流程执行,能够测试整个调用是否通畅,可用于监控。
我们可以看出来这个回声测试其实就是检测服务是否可用的,看看调用是否畅通。
2. 回声测试使用
我这里使用注解的方式使用一下这个回声测试,如果想了解xml配置的方式可以看下官方文档的案例:xml方式官方案例
2.1 服务提供者编码
我这里有一个服务提供者,然后暴露接口IHelloProviderService,
public interface IHelloProviderService {
String getName(Integer id);
}
实现类可以随便写写,别忘了加dubbo 的@Service 注解就行
@org.springframework.stereotype.Service
@Service
public class IHelloProviderServiceImpl implements IHelloProviderService {
@Override
public String getName(Integer id) {
return "test";
}
}
2.2 服务调用者编码
服务调用者这边使用@Reference注解来生成接口的代理。
@RestController
public class TestController {
@Reference(check = false,interfaceClass = IHelloProviderService.class)
private EchoService echoService;
@RequestMapping("/tests")
public String test(){
Object aaa = echoService.$echo("aaa");
System.out.println(aaa);
return null;
}
}
我这里使用的是EchoService类型,然后代理的接口是IHelloProviderService,可以看下这个EchoService,这个接口是dubbo提供的,就一个echo方法,所有我们在获取这个接口实现类的时候可以在 EchoService类型与你的业务接口类型 间相互转换,这里使用注解的方式可能不好理解,使用xml的方式会好理解些。
关于这个实现原理我们在后面解析的时候会说到。
2.3 调用测试
使用postman或者浏览器请求一下,然后可以看到打印出来我们请求的参数,这里dubbo就是将你请求参数原封不动返回给你。
3. 原理解析
3.1 服务调用者端
在服务调用者端,我们在生成某个接口的代理类的时候,dubbo会自动给你的代理类 implements 一个EchoService 接口,然后重写里面的$ehco()方法,多说无益,直接看下dubbo 生成的代理类(这里我们还是将之前讲解Proxy的那张图拿过来)。
我们可以看到生成的代理类,不光实现类业务接口,也实现了EchoService,所以我们在获取这个代理类的时候转成EchoService类型就可以跟普通方法一样调用了。
3.2 服务提供者端
服务提供者这端是使用的Filter进行拦截的,dubbo在服务提供者端提供了一个EchoFilter来处理回声调用,我们可以看下这个Filter的源码。
当调用过来的时候,会被EchoFilter拦截到走到invoke方法中,这个invocation里面其实是封装着调用信息,比如说调用方法,参数类型,参数值,一些附带信息等等。
在invoke方法中,首先 判断,如果 调用方法名字是“$echo”,然后参数不是null,只有一个参数,他就认为是个回声测试调用,直接封装Result 将你传过来的参数返回。
本文地址:https://blog.csdn.net/yuanshangshenghuo/article/details/107701885