由Dubbo回声测试学到的

最近在看Dubbo的用户手册,看到了回声测试一小节的说明如下,请注意图片中的红框中的部分:

红色部分说:只需要将任意服务引用强制转换为EchoService,即可使用。

看到这里我想起了java中关于强制转换的一个限制:必须有继承关系,就是说两个类之间要能够进行类型转换,必须有继承关系才可以。 可是很明显,我们写的Dubbo服务接口是与EchoService接口没有任何集成关系的,这是如何实现的呢?

带着这个问题,去群里问了一下群主,群主给了如下截图:

1、

2、

3、

4、

可以看到,Dubbo在为我们写的服务创建动态代理的时候,是在传入的接口中人为的增加了“EchoService.class”接口的,也就是说,通过创建动态代理的时候向接口中增加一个接口,来保证强制转换的合法性。

这样就解决了强制转换的问题,但是又一个问题来了,EchoService接口中的方法是怎么实现的呢?因为我们写的接口是没有实现这个接口的,所以EchoService接口类中定义的方法也必然没有实现,虽然通过动态代理让我们的实现类实现了这个接口,但实际运行的时候还是会报错。

EchoService是这样定义的:

很奇怪的是,这里面的方法名字是写成了 $echo 的形式。

这个方法我们没有实现,那么如何保证在执行的时候能够执行呢?这是因为Dubbo提供了很多Filter,针对这个EchoService提供了一个EchoFilter实现:

可以看到,在方法里,直接判断当前执行的方法是不是$echo,如果是,则直接将参数返回,结束执行过程,否则继续执行后面的Filter。

为了验证一下,我也写了一点代码:

首先,也有一个EchoService接口,与Dubbo的一模一样。

public interface EchoService {
Object $echo(Object message);
}

然后自己定义了一个MyService接口和它的一个实现类MyServiceImpl。

接口类:

public interface MyService {
public void sayHello();
}

实现类:

public class MyServiceImpl implements MyService {
@Override
public void sayHello() {
System.out.println("MyServiceImpl:hello");
}
}

我要实现的功能是,将我的MyService实例对象转为EchoService对象 ,并调用其$echo方法。

运行代码如下:

public static void main(String[] args) {
//首先定义一个MyService实例
MyService myservice = new MyServiceImpl();
//获取该实例所实现的接口
Class<?>[] interfaces2 = myservice.getClass().getInterfaces();
//将EchoService接口添加到Class<?>数组中
Class<?>[] interfaces = new Class<?>[interfaces2.length + 1];
interfaces[0] = EchoService.class;
for (int i = 0; i < interfaces2.length; i++) {
interfaces[i + 1] = interfaces2[i];
}
//创建代理对象
Object obj = Proxy.newProxyInstance(Thread.currentThread()
.getContextClassLoader(), interfaces, new MyInvocationHandler(
myservice));
//正常调用
MyService ms = (MyService) obj;
ms.sayHello();
//强制转为EchoServic对象并调用方法
EchoService ec = (EchoService) obj;
Object data = ec.$echo("aaaaa");
System.out.println(data);
}

注意,我实现了一个MyInvocationHandler:这个类是java动态代理必须的。

public class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object target) {
super();
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println(method.getName());
//处理EchoService方法,从而实现回声定位功能
if(method.getName().equals("$echo")){
return args[0];
}
return method.invoke(target, args);
}
}

运行一下,发现没有问题!

时间: 2024-11-13 08:05:01

由Dubbo回声测试学到的的相关文章

dubbo之回声测试

回声测试 回声测试用于检测服务是否可用,回声测试按照正常请求流程执行,能够测试整个调用是否通畅,可用于监控. 所有服务自动实现 EchoService 接口,只需将任意服务引用强制转型为 EchoService,即可使用. Spring 配置: <dubbo:reference id="memberService" interface="com.xxx.MemberService" /> 代码: // 远程服务引用 MemberService membe

淘宝SOA框架dubbo学习(6)--回声测试

由于用例比较简单,直接上代码吧! import org.springframework.context.support.ClassPathXmlApplicationContext; import com.alibaba.dubbo.demo.DemoService; import com.alibaba.dubbo.rpc.service.EchoService; public class Consumer {     /**      * @param args      * @throws

分享一个百万数量级的测试学习用的mysql数据集

TEST_DB 带有集成测试套件的示例数据库,用于测试应用程序和数据库服务器 此存储库已从Launchpad迁移. 请参阅MySQL文档中的用法 它来自哪里 原始数据由西门子企业研究中心的Fusheng Wang和Carlo Zaniolo创建.数据采用XML格式.http://timecenter.cs.aau.dk/software.htm Giuseppe Maxia制作了关系模式,Patrick Crews以关系格式导出数据. 该数据库包含大约300,000个员工记录,其中包含280万个

如何使用Dubbo 2.7.0和Spring boot实现FAT测试(Feature Acceptance Test)

在一个调用链非常长的功能中,如果想修改其中的一个特性,并进行测试,而又不影响该环境的其他用户使用现有功能.特性,例如: 1. A.B.C.D之间通过Dubbo实现远程调用 2. 这些模块可能有一个或者多个实例 3. 此环境由多个人员(包括开发.测试)同时使用 此时若想修改B中的某个功能,增加一个特性(称为FAT1),并且也注册到此环境中,则会发生如下问题: 当其他的用户从使用此功能时,从A发起的调用可能会由于Dubbo带的负载均衡算法等原因,在带有FAT1和不带有FAT1的实例间来回切换,最后的

More about dubbo

一.前言 dubbo 作为分布式服务框架支持丰富的配置和扩展方式,其中包括:通讯协议.并发控制.多版本服务.结果缓存.泛化引用\实现.回声测试.上下文信息.事件通知.路由规则(可用于实现读写分离)等多方面内容,官方User Guide(http://alibaba.github.io/dubbo-doc-static/Home-zh.htm)中已经包含了非常详细的解释和使用说明,不再重复描述.参照之前的博文<基于开源Dubbo分布式RPC服务框架的部署整合>(http://www.cnblog

dubbo 配置解析

1.dubbo 常用配置 <dubbo:service/> 服务配置,用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心.eg.<dubbo:service ref="demoService" interface="com.singsui.dubbotest.provider.DemoService" /> <dubbo:reference/> 引用服务配置,用于创建一个远程服务代理,

Dubbo -- 系统学习 笔记 -- API参考手册

API参考手册 配置API 注解API 模型API 上下文API 服务API API参考手册 Dubbo的常规功能,都保持零侵入,但有些功能不得不用API侵入才能实现. API汇总如下: 配置API com.alibaba.dubbo.config.ServiceConfig com.alibaba.dubbo.config.ReferenceConfig com.alibaba.dubbo.config.ProtocolConfig com.alibaba.dubbo.config.Regis

dubbu 官方参考手册~备案(防止哪天阿里一生气把dubbo给删除了)

首页  ||  下载  ||  用户指南  ||  开发者指南  ||  管理员指南  ||  培训文档  ||  常见问题解答  ||  发布记录  ||  发展路线  ||  社区 English | 中文 用户指南 入门 背景 需求 架构 用法 快速启动 服务提供者 服务消费者 依赖 必需依赖 缺省依赖 可选依赖 成熟度 功能成熟度 策略成熟度 配置 Xml配置 属性配置 注解配置 API配置 示例 启动时检查 集群容错 负载均衡 线程模型 直连提供者 只订阅 只注册 静态服务 多协议 多

dubbo用户指南

用户指南 入门 背景 需求 架构 用法 快速启动 服务提供者 服务消费者 依赖 必需依赖 缺省依赖 可选依赖 成熟度 功能成熟度 策略成熟度 配置 Xml配置 属性配置 注解配置 API配置 示例 启动时检查 集群容错 负载均衡 线程模型 直连提供者 只订阅 只注册 静态服务 多协议 多注册中心 服务分组 多版本 分组聚合 参数验证 结果缓存 泛化引用 泛化实现 回声测试 上下文信息 隐式传参 异步调用 本地调用 参数回调 事件通知 本地存根 本地伪装 延迟暴露 并发控制 连接控制 延迟连接 粘