知识点
相关文章
更多最近更新
更多HDFS源码分析——RPC Client实现
2019-03-28 13:25|来源: 网络
通俗来讲RPC(Remote Procedure Call)就是调用远程的过程或者方法,既然涉及到远程,必然会有C/S架构,即client和server。下面首先来看一下Client端的实现。
为实现远程方法调用,最重要的就是跟远程服务器进行连接,然后不断的传输客户端想要调用的方法,包括方法的参数等。为此Client有两个最重要的变量与之一一对应,Connection和Call。其中,Connection代表与远程服务器之间的连接;Call是一个方法调用的抽象。Connection有一个队列,保存所有需要到该Connection对应的服务器进行调用的方法。因为一个Client可能同时需要到多个服务器进行方法调用,如HDFS一次文件操作,不但需要跟NameNode进行通信,还需要与DataNode进行通信;因此,Client会包含一个Connection的队列。为了区分不同的Connection,Client定义了另外一个Class ConnectionId来标识不同的连接。
下面我看一下Call的实现,Call具体是比较简单的,如下代码:
private class Call {
int id; // call id
Writable param; // parameter
Writable value; // value, null if error
IOException error; // exception, null if value
boolean done; // true when call is done
protected Call(Writable param) {
this.param = param;
synchronized (Client.this) {
this.id = counter++;
}
}
......
下面jurisdiction解析一下其不同成员变量的意义,id是在同一个connection上不同方法调用的标识;param是client传向服务器端的数据,一会具体分析;value是返回结果。其中我们具体分析一下param,在Call中param的具体实现是Class Invocation,Invocation具体代表了一个方法,其实现如下:
private static class Invocation implements Writable, Configurable {
private String methodName;
private Class[] parameterClasses;
private Object[] parameters;
private Configuration conf;
......
其中,methodName代表远程调用的方法的名字;parameterClasses代表传入方法参数的类型;parameters代表传入方法参数的值。
如此结合另外一篇文件《Hadoop RPC整个使用流程——以DataNode 向NameNode注册为例》(见 http://www.linuxidc.com/Linux/2012-09/70999.htm )则整个RPC的过程就比较容易理解了。
相关问答
更多-
这是个 序列化异常的问题。你可以查一下自己的代码,是不是实现 Serialization 接口的这个类存在问题。
-
jquery 源码 分析[2022-08-08]
看完之后对对象和原型的理解帮助会非常大。 但最好等用jquery比较熟悉之后再看源码,那么会对理解比较有好处,也会比较容易看懂。 最好从jquery核心处开始看,看懂$.fn.init以及基本方法之后再看别的$.extend的时候就比较容易了。 -
Linux源码情景分析[2023-08-23]
关于内核的书不在多,而是要精,强烈推荐 《Linux内核设计与实现》,英文名Linux Kernel Development,机械工业出版社,¥35, 美国Robert Love著,陈莉君译。 此书是当今首屈一指的入门最佳图书。作者是为2.6内核加入了抢占的人,对调度部分非常精通,而调度是整个系统的核心,因此本书是很权威的。对没怎么深入内核的人来说,这是强烈推荐的一本书。 -
calamari-client.怎么运行源码[2024-01-05]
安装部署 获取calamari相关代码 # git clone https://github.com/ceph/calamari.git # git clone https://github.com/ceph/calamari-clients.git # git clone https://github.com/ceph/Diamond 生成calamari-server安装包 # yum install gcc gcc-c++ postgresql-libs python-virtualenv # cd ... -
Windows有它自己的RPC版本。 它仅在Windows盒子之间正常工作。 为了互操作性,您需要查看CORBA或WCF。 Windows has its own version of RPC. It works fine between Windows boxes only. For interoperability you need to look at CORBA or WCF.
-
获取RPC客户端的进程名称(Get Process Name for RPC Client)[2023-08-29]
要获取RPC客户端的进程名称,必须使用RpcServerInqCallAttributes查询进程ID,使用进程ID获取进程句柄的OpenProcess ,以及使用进程句柄获取完整进程名称的QueryFullProcessImageName 。 To get the process name for an RPC client, you must use RpcServerInqCallAttributes to query the process ID, OpenProcess with the proc ... -
打开www.google.com 写“下载javax.xml.rpc库” 下载jar文件。 将jar文件放在eclipse的plugin文件夹中。 右键单击您的java项目 - >构建路径 - >添加库 - >从插件文件夹中浏览jar。 open www.google.com write "download javax.xml.rpc library" download jar file. Place the jar file in plugin folder of eclipse. Right click ...
-
JSON :: RPC :: Client由旧版本的JSON-RPC提供 。 JSON-RPC版本1.00突破了与先前版本的兼容性,不再包含该模块。 您必须安装旧版本才能使此代码正常工作(或更新代码以使用新API)。 你可以在这里获得JSON-RPC 0.96(最后一个兼容版本) 。 您可以将旧版本安装在私有位置,仅用于此代码。 JSON::RPC::Client was provided by an older version of JSON-RPC. Version 1.00 of JSON-RPC b ...
-
您可以使用socket.setTimeout()方法。 from thrift.transport.THttpClient import THttpClient socket = THttpClient(server_url) socket.setTimeout(SERVICE_TIMEOUT_IN_mS) transport = TTransport.TBufferedTransport(socket) protocol = TBinaryProtocol.TBinaryProtocol(transpor ...
-
调用Go RPC TCP Service时,Ruby Socket Client挂起(Ruby Socket Client hanging when calling Go RPC TCP Service)[2023-03-31]
好的,所以我需要在我的代码中进行的实际修复如下: 传入的args需要是自定义类型,因此您可以导出它,并且需要导出该类型中的字段本身... type Args struct { Foo string Bar string } 但更重要的是,在Ruby方面,您需要以满足此要求的格式发送JSON - > https://golang.org/src/net/rpc/jsonrpc/client.go#L45 < - happy 这样做...... b = { :method => "Comp ...