基于框架的rpc通信技术原理解析

lfs2640666960 lfs2640666960     2023-02-20     143

关键词:

RPC的由来

随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。

  •  单一应用架构
  •  当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。
  •  此时,用于简化增删改查工作量的 数据访问框架(ORM) 是关键。
  •  垂直应用架构
  •  当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。
  •  此时,用于加速前端页面开发的 Web框架(MVC) 是关键。
  •  分布式服务架构
  •  当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。
  •  此时,用于提高业务复用及整合的 分布式服务框架(RPC),提供统一的服务是关键。

例如:各个团队的服务提供方就不要各自实现一套序列化、反序列化、网络框架、连接池、收发线程、超时处理、状态机等“业务之外”的重复技术劳动,造成整体的低效。

所以,统一RPC框架来解决提供统一的服务。

以下我将分别从如下四个方面详解RPC。

一:RPC的实现原理

二:PRC架构组件

三:RPC调用过程

四:RPC主流框架

技术分享图片

一:RPC的实现原理

技术分享图片

也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。

比如说,A服务器想调用B服务器上的一个方法:

Employee getEmployeeByName(String fullName)

整个调用过程,主要经历如下几个步骤:

1、建立通信

首先要解决通讯的问题:即A机器想要调用B机器,首先得建立起通信连接。

主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。

2、服务寻址

要解决寻址的问题,也就是说,A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称名称是什么。

通常情况下我们需要提供B机器(主机名或IP地址)以及特定的端口,然后指定调用的方法或者函数的名称以及入参出参等信息,这样才能完成服务的一个调用。

可靠的寻址方式(主要是提供服务的发现)是RPC的实现基石,比如可以采用redis或者zookeeper来注册服务等等。

技术分享图片
  1.  从服务提供者的角度看:当提供者服务启动时,需要自动向注册中心注册服务;
  2.  当提供者服务停止时,需要向注册中心注销服务;
  3.  提供者需要定时向注册中心发送心跳,一段时间未收到来自提供者的心跳后,认为提供者已经停止服务,从注册中心上摘取掉对应的服务。
  4.  从调用者的角度看:调用者启动时订阅注册中心的消息并从注册中心获取提供者的地址;
  5.  当有提供者上线或者下线时,注册中心会告知到调用者;
  6.  调用者下线时,取消订阅。

3、网络传输

3.1、序列化

当A机器上的应用发起一个RPC调用时,调用方法和其入参等信息需要通过底层的网络协议如TCP传输到B机器,由于网络协议是基于二进制的,所有我们传输的参数数据都需要先进行序列化(Serialize)或者编组(marshal)成二进制的形式才能在网络中进行传输。然后通过寻址操作和网络传输将序列化或者编组之后的二进制数据发送给B机器。

3.2、反序列化

当B机器接收到A机器的应用发来的请求之后,又需要对接收到的参数等信息进行反序列化操作(序列化的逆操作),即将二进制信息恢复为内存中的表达方式,然后再找到对应的方法(寻址的一部分)进行本地调用(一般是通过生成代理Proxy去调用,
通常会有JDK动态代理、CGLIB动态代理、Javassist生成字节码技术等),之后得到调用的返回值。

4、服务调用

B机器进行本地调用(通过代理Proxy)之后得到了返回值,此时还需要再把返回值发送回A机器,同样也需要经过序列化操作,然后再经过网络传输将二进制数据发送回A机器,而当A机器接收到这些返回值之后,则再次进行反序列化操作,恢复为内存中的表达方式,最后再交给A机器上的应用进行相关处理(一般是业务逻辑处理操作)。

通常,经过以上四个步骤之后,一次完整的RPC调用算是完成了。

二:PRC架构组件

一个基本的RPC架构里面应该至少包含以下4个组件:

1、客户端(Client):服务调用方(服务消费者)

2、客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端

3、服务端存根(Server Stub):接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理

4、服务端(Server):服务的真正提供者

中途插一句

文章写了一半了,觉得不错的小伙伴可以给我点点关注,另外想要了解更多Java面试知识点的,也可以关注我一下,我后续也会整理更多关于这一块的知识点分享出来,另外顺便给大家推荐一个Java的交流学习社区:586446657,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,相信对于已经工作和遇到技术瓶颈的码友,在这里会有你需要的内容。

三:RPC调用过程

技术分享图片

1、服务消费者(client客户端)通过本地调用的方式调用服务

2、客户端存根(client stub)接收到调用请求后负责将方法、入参等信息序列化(组装)成能够进行网络传输的消息体

3、客户端存根(client stub)找到远程的服务地址,并且将消息通过网络发送给服务端

4、服务端存根(server stub)收到消息后进行解码(反序列化操作)

5、服务端存根(server stub)根据解码结果调用本地的服务进行相关处理

6、本地服务执行具体业务逻辑并将处理结果返回给服务端存根(server stub)

7、服务端存根(server stub)将返回结果重新打包成消息(序列化)并通过网络发送至消费方

8、客户端存根(client stub)接收到消息,并进行解码(反序列化)

9、服务消费方得到最终结果

四:有哪些主流的RPC框架

简单介绍其中几种比较典型的:

  1. RMI
  2. Hessian
  3. protobuf-rpc-pro
  4. Thrift
  5. Avro
  6. Dubbo

1.RMI

利用java.rmi包实现,基于Java远程方法协议(Java Remote Method Protocol) 和java的原生序列化。

2.Hessian

是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。 基于HTTP协议,采用二进制编解码。

3.protobuf-rpc-pro

是一个Java类库,提供了基于 Google 的 Protocol Buffers 协议的远程方法调用的框架。基于 Netty 底层的 NIO 技术。支持 TCP 重用/ keep-alive、SSL加密、RPC 调用取消操作、嵌入式日志等功能。

4.Thrift

是一种可伸缩的跨语言服务的软件框架。它拥有功能强大的代码生成引擎,无缝地支持C + +,C#,Java,Python和PHP和Ruby。thrift允许你定义一个描述文件,描述数据类型和服务接口。依据该文件,编译器方便地生成RPC客户端和服务器通信代码。

最初由facebook开发用做系统内个语言之间的RPC通信,2007年由facebook贡献到apache基金 ,现在是apache下的opensource之一 。支持多种语言之间的RPC方式的通信:php语言client可以构造一个对象,调用相应的服务方法来调用java语言的服务,跨越语言的C/S RPC调用。底层通讯基于SOCKET。

5.Avro

出自Hadoop之父Doug Cutting, 在Thrift已经相当流行的情况下推出Avro的目标不仅是提供一套类似Thrift的通讯中间件,更是要建立一个新的,标准性的云计算的数据交换和存储的Protocol。支持HTTP,TCP两种协议。

6.Dubbo

Dubbo是 阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。


一篇文章了解rpc框架原理

1.RPC框架的概念RPC(RemoteProcedureCall)–远程过程调用,通过网络通信调用不同的服务,共同支撑一个软件系统,微服务实现的基石技术。使用RPC可以解耦系统,方便维护,同时增加系统处理请求的能力。上面是一个简单的软... 查看详情

rpc原理解析

1.RPC原理解析1.1什么是RPCRPC(RemoteProcedureCallProtocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP/IP或UDP,为通信程序之间携... 查看详情

zookeeper--基于watcher原理实现带注册中心的rpc框架(代码片段)

一、带版本控制的注册中心RPC框架  server端  //注册中心接口publicinterfaceIRegisterCenter publicvoidregister(StringserviceName,StringserviceAddress); //实现类packagezoorpc.zk;importorg.apache.curator.framework.CuratorFramework;importorg.apache.curator.framework.Curat... 查看详情

rpc原理

今天开始聊一些微服务的实践,第一块,RPC框架的原理及实践,为什么说要搞定微服务架构,先搞定RPC框架呢?一、需求缘起服务化的一个好处就是,不限定服务的提供方使用什么技术选型,能够实现大公司跨团队的技术解耦,... 查看详情

grpc原理

...,其底层仍是rpc框架,例如阿里的Dubbo目前业内主要使用基于多语言的RPC框架来构建微服务,是一种比较好的技术选择,例如netflix,API服务编排层和后端微服务之间采用微服务rpc进行通信-支持Cjavajs-git地址https://github.com/grpc/grpc-j... 查看详情

rpc原理及实现

...RPC的实现和调用框架。(1)RMI实现,利用java.rmi包实现,基于Java远程方法协议(JavaRemoteMethodProtocol)和java的原生序列化。(2)Hessian,是一个轻量级的remotingonhttp工具,使用简单的方法提供了RMI的功能。基于HTTP协议,采用二进制编... 查看详情

网络i/o编程模型24基于netty编写rpc通信框架

一RPC协议1.1RPC协议RPC:remote procedure  call:远程过程调用,是一个计算机通信协议。允许一台机器程序调用另外一台机器的应用。用户无需关心细节,调用本地方法一样的调用远程方法。常见的RPC框架:阿里... 查看详情

vip_osp--基于thrift的rpc框架的基本原理

...司(VIP)从2015年开始在内部推动Venus框架的使用,这是一款基于ApacheThrift远程调用框架二次开发的高性能、高可扩展的、服务治理的RPC框架。服务端使用IDL进行服务的定义,客户端集成服务的SDK即可调用服务端的服务,开发简单,... 查看详情

简述rpc原理实现(代码片段)

...诸多优势,这里就不一一列举了,今天围绕的话题是服务框架,为了推行服务化,必然需要一套易用的服务框架,来支撑业务技术架构升级。 服务框架服务架构的核心是服务调用 查看详情

rpc框架总述

...le等。下面重点介绍三种:gRPC:是Google公布的开源软件,基于***的HTTP2.0协议,并支持常见的众多编程语言。RPC框架是基于HTTP协议实现的,底层使用到了Netty框架的支持。Thrift:是Facebook的开源RPC框架,主要是一个跨语言的服务开... 查看详情

hdfs(二)底层通信原理——rpc及动态代理

...者和被调用者二地之间的连接和通信。其基本通信模型是基于client/server进程间相互通信模型,如图1所示。                                  &nbs... 查看详情

rpc(remoteprocedurecall基于服务调用)和restful(representationalstatetransfer基于资源)通信协议异同?常见rpc和restful框架(代码片段

...RPC与RESTful有什么区别?RPC与RESTful有什么相同点?基于服务调用的架构和基于资源的架构有什么区别?Java代码演示基于服务调用的SOAP示例基于资源的RESTful示例常用的RPC框架有哪些?常用的restful框架有哪些?RP... 查看详情

手写简易版rpc框架,理解远程过程调用原理(代码片段)

一、RPC基础知识1.1、RPC是什么RPC【RemoteProcedureCall】是指远程过程调用,是一种进程间通信方式,是一种技术思想,而不是规范。它允许程序调用另一个地址空间(网络的另一台机器上)的过程或函数,而... 查看详情

手写简易版rpc框架,理解远程过程调用原理(代码片段)

一、RPC基础知识1.1、RPC是什么RPC【RemoteProcedureCall】是指远程过程调用,是一种进程间通信方式,是一种技术思想,而不是规范。它允许程序调用另一个地址空间(网络的另一台机器上)的过程或函数,而... 查看详情

protobuf源码解析与netty+rpc实战(代码片段)

...源码出发,脱离grpc框架研究protobuf的框架。在此基础上,基于protobuf+netty手写一个rpc框架,熟悉rpc的设计思路。2.逐步深入protobuf2.1protobuf工作流程protobuf全称是protocolbuffers,它是一个序列化/反序列化框架 查看详情

rpc

...是使用RPC Hadoop中的RPCHadoop中各个节点之间的交互都是基于RPC的,底层原理同上面所描述的。hadoopRPC在上面的基础上做了高度的封装,对本地调用者仅仅暴露一个代理类,通过这个代理 查看详情

一文搞懂rpc原理(代码片段)

RPC原理解析什么是RPCRPC(RemoteProcedureCallProtocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP/IP或UDP,为通信程序之间携带信... 查看详情

android源码解析rpc系列(一)---binder原理

...次Binder的安全性比较好,好在哪里,在下还不是很清楚,基于安全性和传输的效率考虑,选择了Binder。Binder的英文意思是粘结剂,Binder对象是一个可以跨进程引用的对象,它的实体位于一个进程中,这个进程一般是Server端,该对... 查看详情