调用特性(一)之回声测试
调用特性(一)之回声测试
本文基于 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 接口,代码如下:
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 进行授权

