首先分析hbase中对于master协议的调用:
在ConnectionImplementation的方法getKeepAliveMasterService被调用时,会通过MasterServiceStubMaker.makeStub()方法构建成员变量masterServiceState.stub。
 
在MasterServiceStubMaker.makeStub()方法中,通过间接调用rpcClient.createBlockingRpcChannel来构建protobuf的中BlockingStub所需要的channel。该channel的实际类型是BlockingRpcChannelImplementation,他实现了BlockingRpcChannel接口的callBlockingMethod。在具体方法中的调用是通过rpcClient.callBlockingMethod来实现的。
 
 
AbstractRpcClient.callMethod
该方法由AbstractRpcClient.callBlockingMethod间接调用。
在其内部,首先构造了一个Call对象,实现对发送数据的封装以及返回时对回调函数的调用。
然后构建ConnectionId。
通过getConnection获取一个已存在的或新构建的NettyRpcConnection(默认实现)。
最后调用NettyRpcConnection中的sendRequest。
通过调用HBaseRpcController中的notifyOnCancel实现对内部构建的CancellationCallback.run的调用。如果channel为null,会对netty客户端的重新构建。
然后调用wirte方法实现对信息的发送。
 
hbase中对于Admin,Client协议的调用方式也都与此类似。
 
接下来,我们来介绍hbase服务端对于客户端请求的接受:
在NettyRpcServer的初始化过程中,实现了对netty服务端的构建。其中,会将NettyRpcServerRequestDecoder加入到pipeline。
而NettyRpcServerRequestDecoder正是实现对客户端请求的处理。
在NettyRpcServerRequestDecoder的channelRead方法,依次调用了NettyServerRpcConnection.process,ServerRpcConnection.processOneRpc,ServerRpcConnection.processRequest。
在ServerRpcConnection.processRequest方法中,主要构建了一个ServerCall,用于接下来对远程方法的服务端调用。
接下来调用SimpleRpcScheduler.dispatch,将CallRunner.callTask放入相应的队列中。
然后,在RpcExecutor中一开始创建的一批Handler中,会不断地从队列中取值。也就是调用Handler.run。接着回调CallRunner.run,最后调用RpcServer.call实现对
远程方法的本地调用Message result = call.getService().callBlockingMethod(md, controller, param)。
 
 相比hadoop RPC的调用,hbase融入了netty的调用,实现上比hadoop的稍微复杂一点。
 
本人原创,使用请标明源链接。
 
小编以后每周会更新hbase的源码信息,大家可以把需要的方向私信我的邮箱15935152719@163.com。 
 

HBase之RPC调用流程简介的更多相关文章

  1. photon Unity RPC 调用流程

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/51425225 作者:car ...

  2. OpenStack Trove组件WSGI和RPC调用流程(参考调用的整个过程)

    参考博文:https://blog.csdn.net/bill_xiang_/article/details/72909927

  3. hbase之RPC详解

    Hbase的RPC主要由HBaseRPC.RpcEngine.HBaseClient.HBaseServer.VersionedProtocol 5个概念组成. 1.HBaseRPC是hbase RP ...

  4. 【转】 Android的NDK开发(1)————Android JNI简介与调用流程

    原文网址:http://blog.csdn.net/conowen/article/details/7521340 ****************************************** ...

  5. Android的NDK开发(1)————Android JNI简介与调用流程

    1.JNI简介 JNI全称为Java Native Interface(Java本地调用).从Java1.1开始,JNI成为java平台的一部分,它允许Java代码和其他语言写的代码(如C&C ...

  6. 在这个应用中,我使用了 MQ 来处理异步流程、Redis 缓存热点数据、MySQL 持久化数据,还有就是在系统中调用另外一个业务系统的接口,对我的应用来说这些都是属于 RPC 调用,而 MQ、MySQL 持久化的数据也会存在于一个分布式文件系统中,他们之间的调用也是需要用 RPC 来完成数据交互的。

    在这个应用中,我使用了 MQ 来处理异步流程.Redis 缓存热点数据.MySQL 持久化数据,还有就是在系统中调用另外一个业务系统的接口,对我的应用来说这些都是属于 RPC 调用,而 MQ.MySQ ...

  7. RabbitMQ学习笔记5-简单的RPC调用

    利用空的queue名字("")让rabbitMQ生成一个唯一的队列名称,同时指定队列是:临时的(auto-delete).私有的(exclusive). 在发送的RPC调用消息里设 ...

  8. rpc调用过程

    在openstack中,各个组件之间的调用遵循RESTful风格,而组件内部各服务之间的相互调用采用rpc远程调用,比如nova-conductor和nova-compute rpc原理: 首先了解什 ...

  9. python接口自动化(三十五)-封装与调用--流程类接口关联(详解)

    简介 流程相关的接口,主要用 session 关联,如果写成函数(如上篇),s 参数每个函数都要带,每个函数多个参数,这时候封装成类会更方便.在这里我们还是以博客园为例,带着小伙伴们实践一下. 接口封 ...

随机推荐

  1. 利用idea解决git代码冲突问题

    问题描述:在开发过程中,如果你开发的代码与其他人造成冲突,在不处理的情况下会无法拉取,并且提交容易造成代码丢失: 解决方法: [此方法是同事郭富城的分享] 1,由于冲突,我们每次拉取都会失败,这时我们 ...

  2. Finance API文档

    0. 公共部分 请求url {apiRoot}/{method}?ver={version}&appkey={appkey}&sign={sign} 参数名 说明 示例 apiRoot ...

  3. sql语句性能优化

    需要的准备知识 1最左前缀匹配 mysql会一直向右匹配直到遇到范围查询(>.<.between.like)就停止匹配, 对于where条件 a = 1 and b> 2 and c ...

  4. css选择器的优先级算法

    1. 引言 浏览器CSS匹配顺序: 浏览器CSS匹配不是从左到右进行查找,而是从右到左进行查找. 比如#divBox p span.red{color:red;}, 浏览器的查找顺序如下: 先查找ht ...

  5. Linux常用的工具软件安装

    一. linux简单介绍 linux的优势 可靠的安全性,良好的稳定性,完善的网络功能 跨平台的硬件支持,丰富的软件支持,多用户多任务 Linux的发行版本 Redhat 红帽子,最大稳定 CentO ...

  6. 小白的CTF学习之路3——二进制数据基础与运算(下)

    处理了二进制的整数运算,下面我们来进行令人绝望的浮点数运算 我们先来看一下float事列程序: #include<"stdio.sh"> int main() { fl ...

  7. python编程之如何在Windows上安装python

    一.安装python 首先检查你的系统里是否安装了python,开始菜单里点击运行输入cmd打开一个命令窗口,或键盘快捷键windows+R打开,在窗口中输入python并回车,如果出现了Python ...

  8. uni-app 顶部导航点击更换图标

    更换顶部导航的iconfont.ttf图标,先在配置文件配置好按钮: pages.json文件 "buttons": [ { "text": "\ue ...

  9. Python_day7

    sys模块 import sys def _add(a, b): return a + b def _sub(a, b): return a - b def _mul(a, b): return a ...

  10. IE兼容问题 动态生成的节点IE浏览器无法触发

    ie下click()不能操作文档中没有的节点,所以你可以在click()前添加下面的语句 document.body.appendChild( input ); input.style.display ...