Hadopp作为分布式存储系统,为了便于各个节点之间的通信和交互,基于IPC进程间通信模型,实现了一套高效的轻量级RPC框架,这套RPC框架底层采取了javaNIO,java动态代理以及protobuf等基础技术。
RPC:Remote Procedure Call Protocol
远程过程调用协议,RPC基于TCP/UDP网络协议来传递RPC请求以及响应消息。
RPC采用客户端/服务端模式,客户端发送带参数请求,服务端会保持睡眠状态知道有调用请求到达为止。
1 RPC框架的结构:
-
通信模块
-
客户端Stub程序
-
服务端Stub程序
-
请求程序
-
服务程序

通信模块:
传输RPC请求和响应的网络通信模块,可以基于TCP/UDP协议,可以是同步/异步;Hadoop实现了ipc.Client类和ipc.Server类提供的基于TCP/IP Socket的网络通信功能,客户端可以通过Client类将序列化的请求发送到远程服务器,服务器会通过Server类接收来自客户端的请求。
客户端Stub程序
客户端的Stub可以看做是一个代理对象,它会将请求程序的RPC调用序列化,并调用Client.call()方法将这个请求发送给远程服务器,这些实现对客户端调用程序是完全透明的。
备注:默认序列化工具是protobuf
a
服务器端Stub程序
在服务器端,Stub程序会将远程客户端发送的调用请求和参数反序列化,根据调用信息触发对应的服务程序,然后将服务程序返回的响应信息序列化并发会客户端。
请求程序
请求程序会像调用本地方法一样调用客户端Stub程序,然后接受Stub程序返回的响应信息。
服务程序
服务器会接受来自Stub程序的调用请求,执行对应的逻辑,并返回执行结果。
2 使用Hadoop RPC框架的几个步骤:
-
定义RPC协议
-
实现PRC协议
-
客户端获取代理对象
获取一个RPC协议的代理对象,通过Java动态代理机制,这个RPC请求会由一个代理对象处理,这个对象会将RPC调用信息和参数序列化,然后通过Client.call()方法将这个请求发送给远程服务器 -
服务器构造并启动RPC Server
构造一个Server对象,使用这个对象来响应客户端的RPC请求。
3 Hadoop RPC实现
Hadoop RPC框架主要由三个类组成:
-
RPC类:
对外提供一个使用Hadoop RPC框架的接口 -
Client类:
用于实现RPC客户端功能,内部类有:Call 、Connection -
Server类:
采用了多线程多Reator的设计模式,Server内部类有:Listener、Reader、Handler、Responder
用于实现PRC服务端功能,使用了线程池、JavaNIO、Reactor模式
Reactor模式:是一种广泛应用于在服务器端的设计模式,由单线程单Reator、多线程单Reator、多线程多Reator两种,处理流程是:应用程序向一个中间人注册IO事件,当中间人监听到这个IO事件后,会通知并唤醒应用程序处理这个事件。这个中间人其实就是一个不断等待循环的线程,它会接受所有应用程序的注册,并检查注册的IO事件是否就绪,如就绪则通知程序进行处理。
Boy-20180725
网友评论