首先分析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. 学习java之路 简单日历查询代码

    /** * 31天的 1, 3, 5, 7, 8, 10 ,12 30天的 4, 6,9,11 28天(平年) 2 29天(闰年) 2 */ class Demo{ public static voi ...

  2. 使用Jmeter进行http接口做功能、性能测试

    在测试移动APP时,会有很多接口需要做测试,我在这里介绍一下对HTTP接口做功能.性能的测试.首先我们会从开发人员拿到接口数据.     一.测试需求描述 1. 本次测试的接口为http服务端接口 2 ...

  3. HTML的Tomcat

    修改D:\software\apache-tomcat-8.0.44\webapps\ROOT\WEB-INF\web.xml: <?xml version="1.0" en ...

  4. PyCharm 安装教程(Windows)

    python教程 http://www.runoob.com/python3/python3-basic-syntax.html PyCharm 是一款功能强大的 Python 编辑器,具有跨平台性, ...

  5. maven 不能使用 snapshot 的解决方式

    最近项目需要用到snapshot的包来进行构建过程,但是怎么都下不了构建的snapshot包.查询了相关资料,发现网上的资料不全,特总结下: 我使用的是nexus来作为代理中央库proxy. 检查步骤 ...

  6. JavaScript基础视频教程总结(081-090章)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  7. nice coding (与其亡羊补牢,不如未雨绸缪)

    一.需求前 架构规范 建模规范 编码规范(流程控制,方法抽取,日志打印等) <Effective Java> <Design Patterns> 二.需求中 1. 明确需求(别 ...

  8. Python TypeError: 'module' object is not callable 原因分析

    今天尝试使用pprint进行输出,语句为 >>>import pprint >>>pprint(people) 结果报错,TypeError: 'module' o ...

  9. 《java从入门到精通》学习记录

    目录 <Java从入门到精通>学习记录 3 基础的基础部分: 3 一. 常量与变量 3 1. 掌握: 3 (1) .常量与变量的声明方式: 3 (2) .变量的命名规则: 3 (3) .变 ...

  10. 洛谷P1776--宝物筛选(单调队列+多重背包)

    https://www.luogu.org/problemnew/show/P1776 单调队列+多重背包的讲解https://www.cnblogs.com/JoeFan/p/4165956.htm ...