系统间通信3:RPC的基本概念

2023-05-16

本文引用 : https://yinwj.blog.csdn.net/article/details/49453303

1. 概述

经过了详细的信息格式、网络IO模型的讲解,并且通过JAVA RMI的讲解进行了预热。从这篇文章开始我们将进入这个系列博文的另一个重点知识体系的讲解:RPC。在后续的几篇文章中,我们首先讲解RPC的基本概念,一个具体的RPC实现会有哪些基本要素构成,然后我们详细介绍一款典型的RPC框架:Apache Thrift。

2. PRC概述

2.1 什么是RPC

RPC(Remote Procedure Call Protocol)远程过程调用协议。一个通俗的描述是:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。比较正式的描述是:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。那么我们至少从这样的描述中挖掘出几个要点:

  • RPC是协议:既然是协议就只是一套规范,那么就需要有人遵循这套规范来进行实现。目前典型的RPC实现包括:Dubbo、Thrift、GRPC、Hetty等。这里要说明一下,目前技术的发展趋势来看,实现了RPC协议的应用工具往往都会附加其他重要功能,例如Dubbo还包括了服务管理、访问权限管理等功能。
  • 网络协议和网络IO模型对其透明:既然RPC的客户端认为自己是在调用本地对象。那么传输层使用的是TCP/UDP还是HTTP协议,又或者是一些其他的网络协议它就不需要关心了。既然网络协议对其透明,那么调用过程中,使用的是哪一种网络IO模型调用者也不需要关心。
  • 信息格式对其透明:我们知道在本地应用程序中,对于某个对象的调用需要传递一些参数,并且会返回一个调用结果。至于被调用的对象内部是如何使用这些参数,并计算出处理结果的,调用方是不需要关心的。那么对于远程调用来说,这些参数会以某种信息格式传递给网络上的另外一台计算机,这个信息格式是怎样构成的,调用方是不需要关心的。
  • 应该有跨语言能力:为什么这样说呢?因为调用方实际上也不清楚远程服务器的应用程序是使用什么语言运行的。那么对于调用方来说,无论服务器方使用的是什么语言,本次调用都应该成功,并且返回值也应该按照调用方程序语言所能理解的形式进行描述。

那么上面的描述情况可以用下图表示:
在这里插入图片描述

2.2 RPC要素

当然,上图是作为RPC的调用者所观察到的现象(而实际情况是客户端或多或少的还是需要知道一些调用RPC的细节)。但是我们是要讲解RPC的基本概念,所以RPC协议内部是怎么回事就要说清楚:
在这里插入图片描述

  • Client:RPC协议的调用方。就像上文所描述的那样,最理想的情况是RPC Client在完全不知道有RPC框架存在的情况下发起对远程服务的调用。但实际情况来说Client或多或少的都需要指定RPC框架的一些细节。
  • Server:在RPC规范中,这个Server并不是提供RPC服务器IP、端口监听的模块。而是远程服务方法的具体实现(在JAVA中就是RPC服务接口的具体实现)。其中的代码是最普通的和业务相关的代码,甚至其接口实现类本身都不知道将被某一个RPC远程客户端调用。
  • Stub/Proxy:RPC代理存在于客户端,因为要实现客户端对RPC框架“透明”调用,那么客户端不可能自行去管理消息格式、不可能自己去管理网络传输协议,也不可能自己去判断调用过程是否有异常。这一切工作在客户端都是交给RPC框架中的“代理”层来处理的。
  • Message Protocol:在上文我们已经说到,一次完整的client-server的交互肯定是携带某种两端都能识别的,共同约定的消息格式。RPC的消息管理层专门对网络传输所承载的消息信息进行编号和解码操作。**目前流行的技术趋势是不同的RPC实现,为了加强自身框架的效率都有一套(或者几套)私有的消息格式。**例如前文所讲到的RMI框架使用的消息协议为JRMP;后文我们将详细讲解的RPC框架Thrift也有私有的消息协议,“- Transfer/Network Protocol”(当然它还支持一些通用的消息格式,如JSON)。
  • Transfer/Network Protocol:传输协议层负责管理RPC框架所使用的网络协议、网络IO模型。例如Hessian的传输协议基于HTTP(应用层协议);而Thrift的传输协议基于TCP(传输层协议)。传输层还需要统一RPC客户端和RPC服务端所使用的IO模型;
  • Selector/Processor:存在于RPC服务端,由于服务器端某一个RPC接口的实现的特性(它并不知道自己是一个将要被RPC提供给第三方系统调用的服务)。所以在RPC框架中应该有一种“负责执行RPC接口实现”的角色。它负责了包括:管理RPC接口的注册、判断客户端的请求权限、控制接口实现类的执行在内的各种工作。
  • IDL:实际上IDL(接口定义语言)并不是RPC实现中所必须的。但是需要跨语言的RPC框架一定会有IDL部分的存在。这是因为要找到一个各种语言能够理解的消息结构、接口定义的描述形式。如果您的RPC实现没有考虑跨语言性,那么IDL部分就不需要包括,例如JAVA RMI因为就是为了在JAVA语言间进行使用,所以JAVA RMI就没有相应的IDL。

一定要说明一点,不同的RPC框架实现都有一定设计差异。例如生成Stub的方式不一样,IDL描述语言不一样、服务注册的管理方式不一样、运行服务实现的方式不一样、采用的消息格式封装不一样、采用的网络协议不一样。但是基本的思路都是一样的,上图中的所列出的要素也都是具有的。

2.3 典型的RPC框架介绍

  • JAVA RMI:是不是觉得前文中我们介绍RMI所提到几个关键概念在RPC中都找得到一些影子。是的,RPC最早就是由SUN提出,并在后来由IETF ONC修订。RMI就是一个典型的RPC实现,只不过RMI不支持跨语言性,所以RMI中也没有IDL存在的必要。但是RMI真心快,并且由于没有IDL的存在,在构建一套完整的RPC实现时要比其他RPC框架少了一些步骤,所以使用起来也比较简单。如果您的业务需求中并不存在跨语言的考虑,并且基本上主要系统都是用JAVA实现,那么RMI绝对是您一个可以考虑的方案。
  • GRPC:GRPC是一个高性能、通用的开源RPC框架,由Google主要面向移动应用开发并基于HTTP/2协议(注意是HTTP/2协议,不是我们常使用的HTTP 1_1。HTTP/2协议详细的介绍可以参见官方地址:https://http2.github.io/)标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。为了支持GRPC的跨语言性,GRPC有一套独立存在IDL语言。不过由于GRPC是Google的开源产品,在信息格式封装方面Google主要还是推广的自己的ProtoBuf,所以GPRC是不支持其他信息格式的(至少ProtoBuf效率是大家有目共睹的)。关于GRPC详细的使用介绍,可以参见官方地址:https://github.com/grpc/grpc
  • Thrift:Thrift是Facebook的一个开源项目,后来进入Apache进行孵化。Thrift也是支持跨语言的,所以它有自己的一套IDL。目前它支持几乎所有主流的编程语言:C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi and other languages。Thrift可以支持多种信息格式,除了Thrift私有的二进制编码规则和一种LVQ(类似于TLV消息格式)的消息格式,还有常规的JSON格式。Thrift的网络协议建立在TCP协议基础上,并且支持阻塞式IO模型和多路IO复用模型。我们将在后文详细讲解Apache Thrift的使用。Thrift也是目前最流行的RPC框架之一,从网络上各种性能测试情况开,Thrift的性能都是领先的。Thrift的官网地址为:http://thrift.apache.org/
  • Hetty:Hetty是一款构建于Netty和Hessian基础上的高性能的RPC框架。Hetty的网络协议基于HTTP,由于采用了Netty,所以Hetty支持阻塞式IO模型和多路IO复用模型。Hetty的消息格式采用私有的二进制流格式。
  • 其他的RPC框架:除了上诉的RPC协议的实现外,还有:Wildfly、Hprose等等。Hprose是一款国人主导的RPC实现,感兴趣的读者可以去看看(http://www.hprose.com/)。另外基于RPC的定义,Xfire,CXF这些Web Service框架也属于RPC:WSDL描述文件就是他们的IDL,通过WSDL为不同的编程语言生成Stub、通过不同的Web服务器管理具体服务实现的运行过程、HTTP是它们的通信协议、XML是它们的消息格式。

3. RPC框架的性能依据

在这里插入图片描述
在物理服务器性能相同的情况下,以下几个因素会对一款RPC框架的性能产生直接影响:

  • 所支持的网络IO模型:您的RPC服务器可以只支持传统的阻塞式同步IO,也可以做一些改进让您的RPC服务器支持非阻塞式同步IO,或者在您的服务器上实现对多路IO模型的支持。这样的RPC服务器的性能在高并发状态下,会有很大的差别。特别是单位处理性能下对内存、CPU资源的使用率。
  • 基于的网络协议:一般来说您可以选择让您的RPC使用应用层协议,例如HTTP或者之前我们提到的HTTP/2协议,或者使用TCP协议,让您的RPC框架工作在传输层。工作在哪一层网络上会对RPC框架的工作性能产生一定的影响,但是对RPC最终的性能影响并不大。但是至少从各种主流的RPC实现来看,没有采用UDP协议做为主要的传输协议的。
  • 选择的消息封装格式:选择或者定义一种消息格式的封装,要考虑的问题包括:消息的易读性、描述单位内容时的消息体大小、编码难度、解码难度、解决半包/粘包问题的难易度。当然如果您只是想定义一种RPC专用的消息格式,那么消息的易读性可能不是最需要考虑的。消息封装格式的设计是目前各种RPC框架性能差异的最重要原因,这就是为什么几乎所有主流的RPC框架都会设计私有的消息封装格式的原因。
  • 实现的服务处理管理方式:在高并发请求下,如何管理注册的服务也是一个性能影响点。您可以让RPC的Selector/Processor使用单个线程运行服务的具体实现(这意味着上一个客户端的请求没有处理完,下一个客户端的请求就需要等待)、您也可以为每一个RPC具体服务的实现开启一个独立的线程运行(可以一次处理多个请求,但是操作系统对于“可运行的最大线程数”是有限制的)、您也可以线程池来运行RPC具体的服务实现(目前看来,在单个服务节点的情况下,这种方式是比较好的)、您还可以通过注册代理的方式让多个服务节点来运行具体的RPC服务实现。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

系统间通信3:RPC的基本概念 的相关文章

  • 数字签名-数字证书-ca认证

    数字签名是什么 xff1f 作者 xff1a 阮一峰 今天 xff0c 我读到一篇好文章 它用图片通俗易懂地解释了 xff0c 34 数字签名 34 xff08 digital signature xff09 和 34 数字证书 34 xf
  • Cocos2d-android游戏引擎-介绍

    一 游戏引擎概念 什么是游戏引擎 游戏引擎是指一些已编写好的可编辑游戏系统或者一些交互式实时图像应用程序的核心组件 这些系统为游戏设计者提供各种编写游戏所需的各种工具 xff0c 其目的在于让游戏设计者能容易和快速地做出游戏程式而不用由零开
  • JAVA语言的三种技术架构

    J2EE Java 2 Platform Enterprise Edition 企业版 是为开发企业环境下的应用程序提供的一套解决方案 该技术体系中包含的技术如Servlet Jsp等 xff0c 主要针对Web应用程序开发 J2SE Ja
  • java中数组排序Arrays.sort(arr)

    import java util 选择排序 class SwitchTest public static void main String args int arr 61 3 5 6 23 45 2 排序前 printArray arr 排
  • java中什么时候使用静态static,工具类的创建

    什么时候使用静态 xff1f 要从两方面下手 xff1a 因为静态修饰的内容有成员变量和函数 什么时候定义静态的变量 类变量 呢 xff1f 当对象中出现共享数据时 xff0c 该数据被静态所修饰 对象中的特有数据要定义成非静态存在于堆内存
  • java面向对象-包package-包与包之间访问-导入包import

    包 package 1 对类文件进行分类管理 2 给类提供多层命名空间 3 写在程序文件的第一行 4 类名的全称是 包名 类名 5 包也是一种封装形式 带包的java文件编译命令 编译 xff1a javac d PackageDemo j
  • String-练习3

    3 xff0c 获取一个字符串在另一个字符串中出现的次数 34 abkkcdkkefkkskk 34 思路 xff1a 1 xff0c 定义个计数器 2 xff0c 获取kk第一次出现的位置 3 xff0c 从第一次出现位置后剩余的字符串中
  • Java基础加强-java5的枚举

    枚举类 xff08 1 xff09 为什么需要枚举 xff1f 一些方法在运行时 xff0c 它需要的数据不能是任意的 xff0c 而必须是一定范围内的值 xff0c 此类问题在JDK5以前采用自定义带有枚举功能的类解决 xff0c Jav
  • Android核心基础-6.Android 耗时操作

    1 什么是ANR 在应用程序的主线程中执行一段耗时的代码 就有可能出现ANR异常 耗时的代码未执行结束时 界面会卡住 用户对界面进行了操作 10秒之后耗时代码如果还未结束 就会出现ANR异常 我们的布局文件中有个TextView和一个按钮B
  • 第9章-WebSocket、Socket.IO和DerbyJS的实时应用程序-9.2.Socket.IO和Express.js

    大多数的实时Web应用程序中 xff0c 服务器和客户端之间的通信发生在响应报文里 xff0c 或者是对用户行为的响应 xff0c 或者是从服务器获取数据更新的结果 安装Socket IO npm install socket io 64
  • 鸟哥的Linux私房菜-第二部分-Linux文件、目录与磁盘格式

    第6章 Linux的文件权限与目录配置
  • 使用中断方法实现UART不定长数据接收

    使用中断方法实现UART不定长数据接收 基础知识CubeMx配置函数说明代码实现 硬件平台 xff1a NUCLEO STM32F411RE 基础知识 嵌入式开发中 xff0c UART串口通信协议是我们常用的通信协议之一 xff0c 全称
  • 鸟哥的Linux私房菜-第二部分-Linux文件、目录与磁盘格式

    第7章 Linux文件与目录管理
  • 鸟哥的Linux私房菜-第二部分-Linux文件、目录与磁盘格式

    第8章 Linux磁盘与文件系统管理
  • windows连接远程ubuntu服务器进行本地代码编辑,服务器端运行代码

    windows连接远程服务器进行本地代码编辑 xff0c 服务器端运行代码 概述工具准备putty 基本使用Xming 使用看图片编辑文档 vscode相关将服务器代码保存到本地一份使用git使用pscp命令 xff08 putty带的 x
  • IMU加速度、磁力计校正--椭球拟合

    本文为博主 声时刻 原创文章 xff0c 未经博主允许不得转载 联系方式 xff1a shenshikexmu 64 163 com 问题 考虑到IM xff35 中 xff0c x y z轴的度量单位并不相同 xff0c 假设各轴之间相互
  • IMU校正以及姿态融合

    本文为博主 声时刻 原创文章 xff0c 未经博主允许不得转载 联系方式 xff1a shenshikexmu 64 163 com 缘起 有缘在简极科技兼职两年 接触了IMU xff0c 我去的时候那家公司还是一个要把IMU放进足球的公司
  • socket can 编程

    Socket can 文档原名称 can txt 位于 linux 3 2 0 m3352 Documentation networking can txt CAN 控制器局域网络协议族之 Readme 文件 aka Socket CAN
  • HiEV洞察 | 特斯拉HW4.0再爆猛料,高精定位、雷达均有变动

    作者 查理斯 编辑 王博 特斯拉 HW4 0 消息传出后 xff0c 有人爆料说在硬件层面发生了巨大变化 xff0c 引发行业轰动 大家都在猜测HW4 0 具体做了哪些改动 2月16日 xff0c Twitter用户greentheonly
  • VRPN介绍及使用

    VRPN 介绍及使用 VRPN 简介 Virtual Reality Peripheral Network xff08 VRPN xff09 由一系列的类库组成 xff0c 它也提供一系列的服务在虚拟现实系统中实现应用程序与外围物理设备 x

随机推荐

  • 基于bert模型的文本分类研究:“Predict the Happiness”挑战

    1 前言 在2018年10月 xff0c Google发布了新的语言表示模型BERT Bidirectional Encoder Representations from Transformers 根据他们的论文所言 xff0c 在文本分类
  • Bert演变总结

  • Tof,结构光,三角测距,RGBD,双目,激光雷达,毫米波雷达一文总结(一)

    Tof xff0c 结构光 xff0c 三角测距 xff0c RGBD xff0c 双目 xff0c 激光雷达 xff0c 毫米波雷达一文总结 距离测量算法解析TOF 飞行时间测距法超声波毫米波雷达激光雷达 最近在做一些无人车相关的工作 x
  • OCR-PIL.Image与Base64 String的互相转换

    1 基本环境 py2 python2 7 13py3 python3 6 2PIL pip 2 3 install pillow PIL库已不再维护 xff0c 而pillow是PIL的一个分支 xff0c 如今已超越PIL 2 Conve
  • Java中恒等条件判断:“equals”和“==”

    1 起因 xff1a 字符串恒等判断 String is reference type String str1 61 new String 34 hello 34 String str2 61 new String 34 hello 34
  • SQL小结

    1 SQL模糊查询 like 效率低 xff0c 容易全盘扫描 查找Name中包含字符 39 M 39 的数据 select ename from table where ename like 39 M 39 查找Name中第二个字母为 3
  • golang中的flag模块小结

    1 flag常用函数 无论是c语言还是golang语言或是其他语言 xff0c 启动应用程序时都可以带一些参数 xff0c 然后系统根据传入的参数进行特点的工作 如 xff1a main mode online model bert ch
  • Redis批量操作详解及性能分析

    通过mget批量执行指令可以节约网络连接和数据传输开销 xff0c 在高并发场景下可以节约大量系统资源 本文中 xff0c 我们更进一步 xff0c 比较一下redis提供的几种批量执行指令的性能 1 为什么需要批量执行redis指令 众所
  • NDCG:推荐系统/搜索评价指标

    本文转载自 胖喵 博主 xff0c 详细请看https www cnblogs com by dream p 9403984 html 1 CG xff1a 累计增益 CG xff0c cumulative gain xff0c 只考虑到了
  • 特征共线性问题

    多重共线性是使用线性回归算法时经常要面对的一个问题 在其他算法中 xff0c 例如决策树或者朴素贝叶斯 xff0c 前者的建模过程时逐渐递进 xff0c 每次都只有一个变量参与 xff0c 这种机制含有抗多重共线性干扰的功能 xff1b 后
  • 常见回归和分类损失函数比较

    文章转自知乎作者wdmad xff0c 更多内容建议阅读原文 xff1a https zhuanlan zhihu com p 36431289 本博文属于阅读笔记 xff0c 融合了个人观点 1 损失函数 损失函数的一般表示为 L y f
  • 获取keras中间层输出、模型保存与加载

    1 获取keras中间层输出 model summary and plot import keras from keras models import Model from keras utils import plot model Doc
  • HashMap底层实现和原理

    本文是在阅读知乎老刘作品后的整理 内容基于JDK1 7进行分析 xff0c 1 8做的改动文章末尾进行讲解 1 基本要义 1 1 概述 Hashmap在Map派生中的位置 HashMap基于Map接口实现 xff0c 元素以键值对的方式存储
  • 大疆激光雷达Livox Avia开箱及测试

    大疆激光雷达Livox Avia 箱子 从左至右为 xff1a 大疆激光雷达Livox Avia xff0c 电源转接插座 xff0c 内六角形L型扳手 xff0c 镜头清洁布 xff0c 螺钉包 xff0c 说明书 xff0c 1 5米航
  • Go协程与协程池

    1 Golang协程 golang和其它语言最大区别莫过于goroutine xff0c 也就是go的协程 xff0c example如下 xff1a package main import 34 fmt 34 import 34 time
  • Go协程池设计思路(Task-Job-Worker)

    1 铺垫 xff1a Go 的接收器Receiver 在go语言中 xff0c 没有类的概念 xff0c 但是可以给类型 xff08 结构体 xff0c 自定义类型 xff09 定义方法 所谓方法就是定义了接受者的函数 接受者定义在func
  • 系统间通信1:阻塞与非阻塞式通信A

    版权声明 xff1a 本文引用https yinwj blog csdn net article details 48274255 从这篇博文开始 xff0c 我们将进入一个新文章系列 这个文章系列专门整理总结了目前系统间通信的主要原理 手
  • 系统间通信1:阻塞与非阻塞式通信B

    版权声明 xff1a 本文引用https yinwj blog csdn net article details 48274255 接上篇 xff1a 系统间通信1 xff1a 阻塞与非阻塞式通信A 4 3 NIO通信框架 目前流行的NIO
  • 系统间通信2:通信管理与远程方法调用RMI

    本文引用 https yinwj blog csdn net article details 49120813 RMI Remote Method Invocation xff0c 远程方法调用 RPC Remote Procedure C
  • 系统间通信3:RPC的基本概念

    本文引用 https yinwj blog csdn net article details 49453303 1 概述 经过了详细的信息格式 网络IO模型的讲解 xff0c 并且通过JAVA RMI的讲解进行了预热 从这篇文章开始我们将进