没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
该文档分析了 Dubbo 框架中 RPC 调用的整个流程,并基于源代码按照执行 时序进行说明,源码版本为2.5.4开发版。 涉及的关键点包括:Invocation、Invoker、Directory、路由、负载均衡、集群容错、过滤器以及监控模块等的代码级分析。 绝对原创,Eclipse下Debug跟踪源代码,可以作为 Dubbo 框架二次开发的参考。
资源详情
资源评论
资源推荐

Dubbo 的 RPC 调用过程解析
说明:
该文档分析了 Dubbo 框架中 RPC 调用的整个流程,并基于源代码按照执行
时序进行说明。
涉及的关键点包括:Directory、路由、负责均衡、集群容错、过滤器 Filter
以及监控模块等。
可以作为 Dubbo 框架二次开发的参考。
RPC 调用在客户端(即 Consumer 端)触发,其配置文件 applicationContext.xml
文件中会有如下的定义:
<dubbo:reference id="xxxService" interface="xxx.xxx.Service"/>
这一行定义会为服务接口 xxx.xxx.Service 在本地生成一个远程代理,在
Dubbo 中这个代理用 com.alibaba.dubbo.common.bytecode.proxy0 的实例来表示,
另外,由于这个代理存在于本地,因此就可以像本地 bean 一样调用该服务,具
体的通信过程由代理负责。
这个代理实例中仅仅包含一个 handler 对象(InvokerInvocationHandler 类的实
例), handler 中则包含了 RPC 调用中非常核心的一个接口 Invoker<T>的实现,
Invoker 接口的的的定义如下:
public interface Invoker<T> extends Node {
Class<T> getInterface();
//调用过程的具体表示形式
Result invoke(Invocation invocation) throws RpcException;
}
Invoker<T>接口的核心方法是 invoke(Invocation invocation),方法的参数
Invocation 是一个调用过程的抽象,也是 Dubbo 框架的核心接口,该接口中包含
如何获取调用方法的名称、参数类型列表、参数列表以及绑定的数据,定义代码
如下:
public interface Invocation {
//调用的方法名称
String getMethodName();
//调用方法的参数的类型列表
Class<?>[] getParameterTypes();
//调用方法的参数列表
Object[] getArguments();
//调用时附加的数据,用 map 存储
Map<String, String> getAttachments();
//根据 key 来获取附加的数据
String getAttachment(String key);
//getAttachment(String key)的拓展,支持默认值获取
String getAttachment(String key, String defaultValue);
//获取真实的调用者实现
Invoker<?> getInvoker();
}
Invocation 接口和 Invoker<T>接 口 是配套使用的 , 二 者 相 互 依 存 , 从
Invoker<T>的调用方法定义 invoke(Invocation invocation)就可以看出这一点。如
果是 RPC 调用时,Invocation 的具体实现就是 RPCInvocation,该方法会抛出
RpcException,该异常意味着调用失败,

代理中的 handler 实例中包含的 Invoker<T> 接 口 实 现 者 是
MockClusterInvoker,其中 MockClusterInvoker 仅仅是一个 Invoker 的包装,并且
也实现了接口 Invoker<T>,其只是用于实现 Dubbo 框架中的 mock 功能,我们可
以从他的 invoke 方法的实现中看出,代码如下:
public Result invoke(Invocation invocation) throws RpcException {
Result result = null;
/*这一行代码用于获取该服务是否提供 mock 功能,如果提供,则 url 中会包
含 mock 关键字*/
String value = directory.getUrl().getMethodParameter(invocation.
getMethodName(), Constants.MOCK_KEY, Boolean.FALSE.toString()).trim();
if (value.length() == 0 || value.equalsIgnoreCase("false")){
//没有 mock 的过程,直接调用
result = this.invoker.invoke(invocation);
} else if (value.startsWith("force")) {
//日志记录代码部分省略
//force:direct mock,这里用于处理强制 mock 的情况,不执行远程调用
result = doMockInvoke(invocation, null);
} else {
//fail-mock,这里处理失败后 mock 的情况,即出现调用异常时执行 mock
try {
result = this.invoker.invoke(invocation);
}catch (RpcException e) {
if (e.isBiz()) {
throw e;
} else {
//省略日志记录部分的代码
//这里执行 mockInvoke 的逻辑,在本地伪装结果
result = doMockInvoke(invocation, e);
}
}
}
return result;
}
需要注意的是,MockClusterInvoker 实现了 Invoker<T>接口,但它没有真正
地实现 invoke 的 逻 辑 , 只 是 包 装 了 一 个 Invoker 的 真 实 实现,从
MockClusterInvoker 的定义代码部分就可以看出,代码如下:
public class MockClusterInvoker<T> implements Invoker<T>{
private final Directory<T> directory ;
private final Invoker<T> invoker;
public MockClusterInvoker(Directory<T> directory, Invoker<T> invoker) {
this.directory = directory;
this.invoker = invoker;
}
}
其中真实的 Invoker 实现包含了集群容错的功能,因此可以得知 Dubbo 的集
群容错是在 Invoker 中实现的,Invoker 接口的实现者包括如下:

这些实现者都是 Dubbo 推荐的几种容错实现,可以在配置文件中进行选
择,默认的是 FailoverClusterInvoker 实现,即失败重试。
现在,进入 FailoverClusterInvoker 的实现中,可以发现其核心方法
invoke(Invocation invocation) 是继承自 AbstractClusterInvoker<T> 抽象类。
AbstractClusterInvoker<T>中的 invoke(Invocation invocation)方法的实现代码如
下:
public Result invoke(final Invocation invocation) throws RpcException {
checkWheatherDestoried();
LoadBalance loadbalance;
List<Invoker<T>> invokers = list(invocation);
if (invokers != null && invokers.size() > 0) {
//这里省略了获取 loadbalance 实例的实现代码,具体思路就是用拓展类加载器根据配置加载
loadbalance 实例
} else {
loadbalance = ExtensionLoader.getExtensionLoader(LoadBalance.class).
getExtension(Constants.DEFAULT_LOADBALANCE);
}
RpcUtils.attachInvocationIdIfAsync(getUrl(), invocation);
return doInvoke(invocation, invokers, loadbalance);
}
调用过程中首先通过方法 list(invocation) 获取 Invoker 的列表
List<Invoker<T>>,这个列表可以对应到服务提供者的列表。其中,list(invocation)
方法的实现代码如下:
protected List<Invoker<T>> list(Invocation invocation) throws RpcException {
List<Invoker<T>> invokers = directory.list(invocation);
return invokers;
}
AbstractClusterInvoker 的 list(invocation)方法中会用到另一个比较关键的接
口 Directory,它是 Dubbo 框架中用于封装服务提供者列表的一个数据结构。
Directory 的定义代码如下:
public interface Directory<T> extends Node {
Class<T> getInterface();
List<Invoker<T>> list(Invocation invocation) throws RpcException;
}
Directory 接口的核心方法是 list(Invocation invocation) ,该方法的参数是一
个 Invocation 对象,该 Invocation 对象表示的是一次(远程)调用过程,在上面
已经说明过了,其 中包含了调用的方法名称、参数类型列表、参数列表以及附加
的数据集合,list 方法返回一个调用者的列表 List<Invoker<T>> ,其中 directory
接口的实例实例是 RegistryDirectory 类的对象, RegistryDirectory 的
list(invocation)方法继承自 AbstractDirectory,具体实现如下:
剩余15页未读,继续阅读






格式:pdf 资源大小:2.8MB 页数:35





















格式:sql 资源大小:709.1KB




大蜜蜂不知道
- 粉丝: 5
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 全国计算机等级测验一级教案.docx
- 物联网:一场渐进式变革.docx
- PLC的交流异步电机转速闭环控制系统设计方案.doc
- 轻松入门 Julia:图像与计算机视觉基础指南
- 微课教学模式在Oracle数据库课程中的应用.docx
- 广电网络公司对BRAS系统需求分析.docx
- 大数据时代下计算机信息处理技术.docx
- 【ppt模板】商务科技5G时代信息通信模板.pptx
- 物联网对计算机通信影响探究.docx
- 高层楼电梯PLC自动控制系统的设计(修复的).docx
- 浅析计算机网络安全与防火墙技术.docx
- 基于深度学习的计算机视觉
- 操作系统课程实施方案报告B张路生.doc
- 计算机网络安全技术影响因素及控防策略探究.docx
- 自动化系届工程学院毕业设计.xls
- 大数据视域下的应用文写作教学方法研究.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制

评论5