首先分析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. selenium+java定位163/126邮箱元素显示定位失败解决

    开始在没有进入iframe时,用任何方法定位163/126邮箱登录页面的元素都不可能定位到,eclipse工作台会显示Unable to locate element:…… 这种情况我遇到了两种原因: ...

  2. Android.mk学习

    2019-03-31 学习变量 $(call my-dir) /usr/bin2/android-ndk-r16/build/core $(CLEAR_VARS) /usr/bin2/android- ...

  3. SHELL脚本学习-练习写一个脚本4

    #编写一个脚本时,自动生成”#!/bin/bash”这一行和相关注释信息. 把以下的代码保存为一个sh文件,比如test.sh , 新建脚本是使用  bash test.sh newfile 即可. ...

  4. 老赵点滴地址:http://blog.zhaojie.me/2009/05/a-simple-actor-model-implementation.html

    老赵点滴地址:http://blog.zhaojie.me/2009/05/a-simple-actor-model-implementation.html

  5. python搭建服务器时nginx的有关问题

    最近在学习Python服务器搭建的内容,网上大多是Windows环境下的,由于我使用的是Mac,为了不想装双系统折腾,就只好一步步采坑了.比较基础的我一步步记录下来, 1.安装nginx: brew ...

  6. HTML标签有序标签和无序标签

    1.<ul>标签定义无序列表,所谓无序,是指以●.○.▽.▲等开头的,没有顺序的列表项目 1.1  设置无序列表的类型—type             无序列表的默认符号是圆点(● ). ...

  7. Unity3D编辑器扩展(一)——定义自己的菜单按钮

    Unity3D 引擎的编辑器拥有很强的扩展性,用的好可以帮我们省很多事情.在这里记录下如何去扩展 Unity3D 的编辑器,定制属于我们自己的开发环境. 本篇主要讲解在 Unity3D 引擎的各个窗口 ...

  8. require()  module.export    Object.keys()

    import API from"../../api/api.js";   var data = require('../../utils/data.js').songs;   // ...

  9. python_flask 基础巩固 (DEBUG模式)

    默认情况下flask不会开启DEBUG模式,开启DEBUG模式后,flask会在每次保存代码的时候自动的重新载入代码,并且如果代码有错误,会在终端进行提示. 开启DEBUG模式有四种方式: 1.直接在 ...

  10. nginx的锁

    一.原理 nginx的锁是基于共享内存实现的,这点跟redis中利用一个存储(也就是一个键值对)来实现锁的原理是一致的,每一项操作通过检查锁对象的lock域是否为0,来判断能否获取锁并尝试获取锁. 二 ...