欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

深度解析dubbo过滤器之回声测试

程序员文章站 2022-03-10 10:53:13
本文基于dubbo v2.6.1文章目录1.什么是回声测试2. 回声测试使用2.1 服务提供者编码2.2 服务调用者编码2.3 调用测试3. 原理解析3.1 服务调用者端3.2 服务提供者端1.什么是回声测试我这里引用官方的解释:回声测试用于检测服务是否可用,回声测试按照正常请求流程执行,能够测试整个调用是否通畅,可用于监控。我们可以看出来这个回声测试其实就是检测服务是否可用的,看看调用是否畅通。2. 回声测试使用我这里使用注解的方式使用一下这个回声测试,如果想了解xml配置的方式可以...

本文基于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提供的,就一个echoecho方法,然后在生成代理类的时候代理类实现业务接口的同时也会实现这个接口,重写里面echo方法,所有我们在获取这个接口实现类的时候可以在 EchoService类型与你的业务接口类型 间相互转换,这里使用注解的方式可能不好理解,使用xml的方式会好理解些。
关于这个实现原理我们在后面解析的时候会说到。
深度解析dubbo过滤器之回声测试

2.3 调用测试

使用postman或者浏览器请求一下,然后可以看到打印出来我们请求的参数,这里dubbo就是将你请求参数原封不动返回给你。
深度解析dubbo过滤器之回声测试

3. 原理解析

3.1 服务调用者端

在服务调用者端,我们在生成某个接口的代理类的时候,dubbo会自动给你的代理类 implements 一个EchoService 接口,然后重写里面的$ehco()方法,多说无益,直接看下dubbo 生成的代理类(这里我们还是将之前讲解Proxy的那张图拿过来)。
深度解析dubbo过滤器之回声测试
我们可以看到生成的代理类,不光实现类业务接口,也实现了EchoService,所以我们在获取这个代理类的时候转成EchoService类型就可以跟普通方法一样调用了。

3.2 服务提供者端

服务提供者这端是使用的Filter进行拦截的,dubbo在服务提供者端提供了一个EchoFilter来处理回声调用,我们可以看下这个Filter的源码。
深度解析dubbo过滤器之回声测试
当调用过来的时候,会被EchoFilter拦截到走到invoke方法中,这个invocation里面其实是封装着调用信息,比如说调用方法,参数类型,参数值,一些附带信息等等。
在invoke方法中,首先 判断,如果 调用方法名字是“$echo”,然后参数不是null,只有一个参数,他就认为是个回声测试调用,直接封装Result 将你传过来的参数返回。

本文地址:https://blog.csdn.net/yuanshangshenghuo/article/details/107701885