我是一段不羁的公告!
记得给艿艿这 3 个项目加油,添加一个 STAR 噢。
https://github.com/YunaiV/SpringBoot-Labs
https://github.com/YunaiV/onemall
https://github.com/YunaiV/ruoyi-vue-pro

精尽 Dubbo 源码分析 —— 调用特性(一)之回声测试

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

1. 概述

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

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

2. 服务消费者

2.1 EchoService

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

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 配置:

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

代码:

// 远程服务引用
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 接口,回声过滤器。代码如下:

@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. 彩蛋

知识星球

美滋滋。

总访客数 && 总访问量