文章

调用特性(一)之回声测试

调用特性(一)之回声测试

本文基于 Dubbo 2.6.1 版本,望知悉。

1. 概述

本文分享回声测试。我们来看下 《用户指南 —— 回声测试》 的定义:

回声测试用于检测服务是否可用,回声测试按照正常请求流程执行,能够测试整个调用是否通畅,可用于监控。

2. 服务消费者

2.1 EchoService

com.alibaba.dubbo.rpc.service.EchoService ,Echo 服务接口。代码如下:

1
2
3
4
5
6
7
8
9
10
11
public interface EchoService {

    /**
     * echo test.
     *
     * @param message message.
     * @return message.
     */
    Object $echo(Object message);

}

所有服务自动实现 EchoService 接口,只需将任意服务引用强制转型为 EchoService,即可使用。

在 AbstractProxyFactory 中,#getProxy(invoker) 方法,创建服务消费者的 Proxy 对象时,自动实现 EchoService 接口,代码如下:

AbstractProxyFactory

2.2 使用示例

Spring 配置:

1
<dubbo:reference id="memberService" interface="com.xxx.MemberService" />

代码:

1
2
3
4
5
6
7
8
9
// 远程服务引用
MemberService memberService = ctx.getBean("memberService"); 

EchoService echoService = (EchoService) memberService; // 强制转型为EchoService

// 回声测试可用性
String status = echoService.$echo("OK"); 

assert(status.equals("OK"));

3. 服务提供者

服务提供者,是不实现 EchoService 接口,而是通过 EchoFilter 实现。

3.1 EchoFilter

com.alibaba.dubbo.rpc.filter.EchoFilter ,实现 Filter 接口,回声过滤器。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
@Activate(group = Constants.PROVIDER, order = -110000)
public class EchoFilter implements Filter {

    @Override
    public Result invoke(Invoker<?> invoker, Invocation inv) throws RpcException {
        // 方法名为 `$echo` ,参数只有一个
        if (inv.getMethodName().equals(Constants.$ECHO) && inv.getArguments() != null && inv.getArguments().length == 1) {
            return new RpcResult(inv.getArguments()[0]);
        }
        return invoker.invoke(inv);
    }

}
  • 使用 Dubbo SPI Adaptive 机制,自动加载服务提供者,仅限。
  • 如果调用方法是回声调用时,通过方法名($echo) 和方法参数数量为 1,直接返回方法参数。
  • 若果调用方法非回声调用时,调用 Invoker#invoke(invocation) 方法,继续走后面的过滤链。

666. 彩蛋

知识星球

美滋滋。

本文由作者按照 CC BY 4.0 进行授权