RPC服务是指跨网络的服务调用,客户端发出服务请求,经过网络传输到服务端。服务端解析该请求,调用本地方法获取结果,然后将结果作为响应包通过网络发送回客户端,这样客户端在调用远程方法时就会像调用本地方法一样简单。
RPC调用时有两个问题需要解决,其一是client端与server端采用何种方式通信,其二是请求信息和结果以何种格式在网络上传输,也就是RPC通信协议和RPC通信框架。通信协议需要client端和server端约定好请求参数的类型、参数顺序以及相应结果的类型等等,通信框架则定义了两端通信的方式,可选的包括TCP/UDP通信,HTTP等。除此之外,RPC框架还需要解决server端服务调用超时、client端的重试、服务端限流和server端的调度等问题。
HBase中的master/regionserver/client等组件在RPC中的关系如下图中所示:
其中,client与master之间的通信主要是hbase的DML操作,包括table schema的更改,table region的迁移合并、region server的上线和下线以及集群负载均衡、Table的快照管理等功能;client与regionserver之间的通信用于实现数据读写请求,如get、multiGet、mutate、scan、bulkLoadHfile、执行coprocessor等;master与region server之间的通信用于region server向master汇报自身的状态,包括自身管理的region和自身的当前状态等等。
下面分别从客户端和服务端的角度分析hbase中rpc调用的实现。在客户端中,hbase的rpc服务可以拆分为两个主要流程,分别是请求构建和请求处理。下面我们以hbase的get请求为例,以求清晰解释客户端的rpc流程。首先讲解请求是如何构建的。