RPC定义
远程调用:跨进程的功能调用
RPC是远程过程调用(Remote Procedure Call)的缩写形式。
RPC是远程(不同进程)过程(方法的)调用(Remote Procedure Call)的缩写形式
RPC Remote Procedure Call 远程过程调用
同一台计算机上的多个进程、多个JVM或者多台计算机之间的进程
一种通过网络从远程计算机程序上获取服务,而不需要了解具体代码网络技术实现的一种协议
RPC核心包括四个部分,底层一般使用 TCP/UDP协议进行数据传输。
常用的通信协议有TCP、UDP、HTTP等 ,常见的序列化协议有JSON、Protobuf、Thrift等、加密协议、数据压缩等。
常见的RPC框架有Google的gRPC、Facebook的Thrift、阿里的Dubbo。
RPC发展到现在实现的方式非常多样,从RMI ->Web Service-> HTTP JSON -->SOA ->Dubbo
当然基于Socket NIO通信或Netty也可以手写一个RPC框架,很easy的,在大数据领域Hadoop源码里主要是使用Hadoop RPC进行通信。大数据的Spark-1.6之前,Spark 的RPC是基于Akaa来实现的。Akka 是一个基于scala语言的异步的消息框架。Spark-1.6 后,Spark 借鉴Akka的设计自己实现了一个基 于Netty的RPC框架。
在京东一般普遍使用Dubbo框架进行SOA服务开发,当然了京东是在阿里开源Dubbo基础上开发改造封装了一套JSF的框架,中文名叫杰服的服务框架便于服务治理。
SOA
Service-Oriented Architecture 面向服务架构.
面向:围绕发布服务项目
里面”服务”:对外提供接口(服务)的项目
SOA是一种架构,只要项目结构中有一个对外发布服务的项目,并且其他项目调用这个项目的服务,这种架构设计就是SOA架构
RPC
解释:有一台计算机发布服务后,其他计算机通过网络访问这个计算机发布的服务。其他计算机只能使用服务,但是不知道服务的具体实现过程。
为什么服务化?
- 前台和后台在代码中出现大量重复代码
- 很多项目都可以直接操作数据库,而数据是企业的核心。不应该让所有人都随意访问。
- 随着平台的增加,增加了Android,IOS等,添加和前台项目和后台项目同级别的项目,项目越多,重复代码越多。
变成服务化:
RPC
另一种解释: 有一台计算机发布服务后,其他计算机通过网络访问这个计算机发布的服务。其他计算机只能使用服务,但是不知道服务的具体实现过程。
当然现在微服务从Dubbo到SSM轻量级微服务(SpringBoot+Spring+Mybatis)到SpringCloud、SpringCloudAlibaba生态,进而到容器化、云原生化发展。
HttpJSON的RPC也层出不穷,如HTTP HttpURLConnection、HttpClient、RestTemplate、OpenFeign等进化。
Hadoop RPC
RPC 基础概述
RPC(Remote Procedure Call)远程过程调用协议,一种通过网络从远程计算机上请求服务,而不需要了解底层网络技术的协议。
RPC 是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。
逻辑:Client
应用程序
内部组成:获取一个 Client
工作机制:抽象(把调用关系 抽象一个 网络请求)
调用关系:result = serverInstance(instanceProxy 本地代理).serverMethod(param)
网络请求:Response response(result) = connect(hostname,port).sendRequest(Request(ServerClass.class, "serverMethod", Param(参
数)))
期望效果:还是按照调用语义去用,只不过底层做了转换,帮我们发了请求,接收了响应,处理成方法的返回,而且这个事儿,全部在底层完成。对于上层用户来说,没有任何的感知
逻辑:Server
服务实例 serverInstance
运行在 Server 的内部
在实现 RPC 的时候,需要考虑的一些典型的问题: 通讯,寻址,序列化,粘包拆包等
Hadoop 作为一款成熟稳定,功能复杂强大的分布式系统,底层必然涉及到大量组件之间的相互通信。一款高性能,可扩展,可维护的 RPC 网络通信框架,必然是Hadoop 大厦之根基。所以请看,现行 Hadoop 项目的结构:
Hadoop common:RPC 网络通信框架,各种工具包等
Hadoop HDFS:分布式文件系统(C/S 结构的主从架构 分布式系统)
Hadoop MapReduce:分布式计算应用程序编程框架
Hadoop YARN:分布式资源调度系统(C/S 结构的主从架构 分布式系统)
首先通过 Hadoop RPC 的两种实现,分别提供一个简单案例,供大家来体验一下有了 RPC 之后,关于分布式系统开发的简洁快速。系统开发者,再也不需要将精力集中在组件之间数据传送的网络通信细节,只需要关注系统的业务实现即可。
Hadoop RPC 框架中的序列化机制实现有两种:
- Avro Writable 接口实现,简单易懂
- Google Protobuf 跨语言实现,跨语言,高扩展,高效率
手写一个Hadoop RPC
第一种:Avro Writable 案例实现
pom依赖
协议
服务端代码
客户端代码
总结我们对Hadoop RPC的认识:
- 1. RPC指的是不同进程的调用,分为客户端和服务端,并且是客户端调用服务端的方法,方法的执行在服务端。
- 2. 如果要想实现hadoop RPC的调用,需要一个协议,说白了协议其实就是一个接口,里面要求必须要有versionID字段
- 3. 服务端必须要实现协议(接口)
- 4. 凡是JPS命令能看到的服务,都是RPC的服务端
- 5. 如何构建一个Hadoop RPC
大胆的猜测一下:
猜测namenode的代码是如何写?
jps -> namenode -> rpc server
DataNode RPC怎么实现呢?
底层还是socket通信机制。如NIO或Netty实现。当然手写一个RPC有时候还需要反射机制,底层会有反射机制代码。
第二种:Google Protobuf 案例实现RPC
代码包结构
第一步:定义协议MyResourceTracker
第二步:定义Protobuf 文件:
第三步:对protobuf 文件,进行编译生成Java 文件,关于如何安装protobuf 在此不做介绍。具体的编译命令:
第四步:对MyResourceTracker 通信协议进行具体的逻辑实现
第五步:编写proto 的协议接口
第六步:编写proto 的协议接口实现
第七步:编写RPC Server 实现
第八步:编写RPC Client 实现
最后运行Main方法测试:
至此,两种方式实现手写一个HadoopRPC剖析结束。