大话RPC和手写一个Hadoop RPC

RPC(远程过程调用)是一种通过网络进行进程间通信的技术,常用于服务化架构中。文章介绍了RPC的基本概念、组成部分、常用协议和框架,如gRPC、Thrift和Dubbo,并探讨了HadoopRPC的实现,包括Avro和GoogleProtobuf的序列化机制。通过示例展示了如何手写HadoopRPC,强调了RPC在简化分布式系统开发中的作用。
摘要由CSDN通过智能技术生成

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剖析结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值