简介
通过前几篇博客,深入了解了hadoop rpc调度的一些流程,但是那些都太细节了,没有一个整体的架构情况。知识比较零散,需要一次系统整理和总结。下边是我自己整理的情况,肯定有很多不足之处,希望有人一起学习,一个人读源码还是很痛苦的,有人一起学习才好玩。
rpc client 总结
rpc获取代理对象流程
-
rpc.getProxy() 程序入口,开始获取代理对象,需要传入代理对象接口,接口版本ID,远程服务地址和端口,以及配置
-
获取一个服务代理的封装,这个对象封装了
- protocol 代理对象接口
- proxy 动态代理获取的对象
- supportServerMethodCheck 是否检查服务端是否支持调用的方法
getProxy()返回了这个对象封装的代理对象。
-
获取rpc引擎。这个接口有两个实现类
- WritableRpcEngine 处理用hadoop writable 序列化的rpc请求
- ProtobufRpcEngine 处理用Protobuf序列化的rpc请求
这里我们只分析了WritableRpcEngine对象,这个类主要成员变量: - CLIENTS - client缓存
主要方法: - getProxy() 通过动态代理获取代理对象并且封装成ProtocolProxy对象 - getServer() 获取服务对象 - getClient() 获取client对象
这里主要通过getProxy()方法获取ProtocolProxy对象。但是在通过动态代理获取proxy时 这里偷偷new了一个Invoker对象,这是个前边忽略了的对象,这个对象主要用在当客户调用方法是,被调用的方法会通过整理,调用到Invoker.invoke()方法。下边我们详细分析一下这个对象。 4. Invoker对象
主要成员变量 - private Client.ConnectionId remoteId - private Client client; - private boolean isClosed = false; - private final AtomicBoolean fallbackToSimpleAuth;
主要方法 - invoke方法
通过client调用call方法发送rpc请求
server端服务过程
1. listener 接受rpc请求
2. handle 处理请求
3. responder 返回请求结果
这个三个类都实现了runnable接口,以线程的方式运行,handler可能有多个线程同时处理请求。