Dubbo过滤器 - EchoFilter

概述

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

EchoService

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 即可使用。关于创建服务消费端的代理对象时,自动实现 EchoService 接口可以参考 回声探测接口实现 。服务提供者是不实现 EchoService 接口,而是通过 EchoFilter 来处理回声探测请求。

那为什么 $echo 方法可以请求到服务端?首先消费方可以将请求发送到服务端,服务端接收到消息后进行解码后叫请求交给系列 ChannelHandler ,最终执行到 Protocol 层面的 Handler ,而查找 Invoker 是通过 group/path:version:port 和具体方法无关,虽然服务端没有该方法,但是是先触发的 Filter ,执行到这里就结束了,并不会再交给服务端的服务处理了。

EchoFilter

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

@Override
public Result invoke(Invoker<?> invoker, Invocation inv) throws RpcException {
// 如果是回声探测方法 $echo(message) ,直接返回方法参数。
// 方名为 $echo,方法参数仅有一个 --> 回声探测方法
if (inv.getMethodName().equals(Constants.$ECHO) && inv.getArguments() != null && inv.getArguments().length == 1) {
return new RpcResult(inv.getArguments()[0]);
}
// 非回声探测调用,继续走后面的流程
return invoker.invoke(inv);
}
}