当前位置: 首页 > news >正文

RPC知识

一、为什么要有RPC:

        HTTP协议的接口,在接口不多、系统与系统交互较少的情况下,解决信息孤岛初期常使用的一种通信手段;优点就是简单、直接、开发方便,利用现成的HTTP协议进行传输。

        但是,如果是一个大型的网站,内部子系统较多、接口非常多的情况下,RPC框架的好处就显示出来了,首先就是长链接,不必每次通信都要像HTTP一样,去3次握手,减少了网络开销;其次RPC框架一般都有注册中心,有丰富的监控管理:发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。还有就是安全性。

        RPC一般配合Netty框架、Spring自定义注解来编写轻量级框架,其实Netty内部是封装了Socket,较新的JDK的IO一般是NIO,即非阻塞IO,在高并发网站中,RPC的优势会很明显。

二、什么是RPC:

        RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。简言之,RPC使得程序能够像访问本地系统资源一样,去访问远端系统资源。

        比较关键的一些方面包括:通讯协议、序列化、资源(接口)描述、服务框架、性能、语言支持等。

三、PRC架构组件:

一个基本的RPC架构至少包含4个组件:

  • 1. 客户端(Client):服务调用方(服务消费者)。
  • 2. 客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端。
  • 3. 服务端存根(Server Stub):接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理。
  • 4). 服务端(Server):服务的真正提供者。

具体调用过程:

  • 1. 服务消费者(client客户端)通过调用本地服务的方式调用需要消费的服务;
  • 2. 客户端存根(client stub)接收到调用请求后,负责将方法、入参等信息序列化(组装)成能够进行网络传输的消息体;
  • 3. 客户端存根(client stub)找到远程的服务地址,并且将消息通过网络发送给服务端;
  • 4. 服务端存根(server stub)收到消息后进行解码(反序列化操作);
  • 5. 服务端存根(server stub)根据解码结果调用本地的服务进行相关处理;
  • 6. 本地服务执行具体业务逻辑;
  • 7. 将处理结果返回给服务端存根(server stub);
  • 8. 服务端存根(server stub)将返回结果重新打包成消息(序列化)并通过网络发送至消费方;
  • 9. 客户端存根(client stub)接收到消息,并进行解码(反序列化);
  • 10. 服务消费方得到终结果;

        RPC框架的实现目标是将图中2-10步(2-9步)完好地封装起来,也就是把调用、编码/解码的过程给封装起来,让用户感觉上像调用本地服务一样的调用远程服务。

四、RPC和SOA、SOAP、REST的区别:

1. REST:

        它是HTTP协议的一种直接应用,默认基于JSON作为传输格式,使用简单、学习成本低、效率高,但是安全性较低。

2. SOAP:

        SOAP是一种数据交换协议规范,是一种轻量的、简单的、基于XML的协议的规范。SOAP是一个重量级的协议,基于XML、SOAP在安全方面是通过使用XML-Security和XML-Signature两个规范组成了WS-Security,WS-Security实现了安全控制,当前已经得到了各个厂商的支持 。

优点:易用、灵活、跨语言、跨平台。

3. SOA:

        面向服务架构,它可以根据需求,通过网络,对松散耦合的粗粒度应用组件,进行分布式部署、组合和使用。服务层是SOA的基础,可以直接被应用调用,从而有效控制系统中与软件代理交互的人为依赖性。

        SOA是一种粗粒度、松耦合服务架构,服务之间通过简单、精确定义接口进行通讯,不涉及底层编程接口和通讯模型。SOA可以看作是B/S模型、XML(标准通用标记语言的子集)/Web Service技术之后的自然延伸。

4. REST和SOAP、RPC有何区别呢?

        没什么太大区别,他们的本质都是提供可支持分布式的基础服务, 大的区别在于他们各自的的特点所带来的不同应用场景。

五、RPC框架需要解决的问题?

  • 1. 如何确定客户端和服务端之间的通信协议?
  • 2. 如何更高效地进行网络通信?
  • 3. 服务端提供的服务如何暴露给客户端?
  • 4. 客户端如何发现这些暴露的服务?
  • 5. 如何更高效地对请求对象和响应结果进行序列化和反序列化操作?

六、RPC的实现基础?

  • 1. 需要有非常高效的网络通信,比如一般选择Netty作为网络通信框架;
  • 2. 需要有比较高效的序列化框架,比如谷歌的Protobuf序列化框架;
  • 3. 可靠的寻址方式(主要是提供服务的发现),比如可以使用Zookeeper来注册服务等等;
  • 4. 如果是带会话(状态)的RPC调用,还需要有会话和状态保持的功能;

七、RPC使用了哪些关键技术?

1. 动态代理:

        在生成Client Stub(客户端存根)和Server Stub(服务端存根)是,需要用到Java动态代理技术,可以使用JDK提供的原生的动态代理机制,也可以使用开源的:CGLib代理,Javassist字节码生成技术。

2. 序列化和反序列化:

        在网络中,所有的数据都将会被转化为字节进行传送,所以,为了能够使参数对象在网络中进行传输,需要对这些参数进行序列化和反序列化操作。

        目前比较高效的开源序列化框架:如Kryo、FastJson和Protobuf等。

3. 网络通信模型:

        出于并发性能的考虑,传统的阻塞式 IO 显然不太合适,因此我们需要异步的IO,即 NIO。Java 提供了 NIO 的解决方案,Java 7 也提供了更优秀的 NIO.2 支持。可以选择Netty或者MINA来解决NIO数据传输的问题。

4. 服务注册中心:

        可选:Redis、Zookeeper、Consul 、Etcd。一般使用ZooKeeper提供服务注册与发现功能,解决单点故障以及分布式部署的问题(注册中心)。

八、主流RPC框架有哪些

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基金 ,现在是Aapache下的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的实现原理架构图:

        PRC的基本原理图,请大家一定记住!两台服务器A、B,一个应用部署在A服务器上,想要调用B服务器上应用提供的/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。

        比如说,A服务器想调用B服务器上的一个方法:User getUserByName(String userName)

1. 建立通信:

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

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

        通常这个连接可以是按需连接(需要调用的时候就先建立连接,调用结束后就立马断掉),也可以是长连接(客户端和服务器建立起连接之后保持长期持有,不管此时有无数据包的发送,可以配合心跳检测机制定期检测建立的连接是否存活有效),多个远程过程调用共享同一个连接。

2. 服务寻址:

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

        通常情况下我们需要提供B机器(主机名或IP地址)以及特定的端口,然后指定调用的方法名称以及入参出参等信息,这样才能完成服务的一个调用。可靠的寻址方式(主要是提供服务的发现)是RPC的实现基石,比如可以采用Redis或者Zookeeper来注册服务等等。

2.1 从服务提供者的角度看:

        当服务提供者启动时,需要将自己提供的服务,注册到指定的注册中心,以便服务消费者能够通过服务注册中心进行查找。当服务提供者由于各种原因,致使提供的服务停止时,需要向注册中心注销停止的服务。服务的提供者需要定期向服务注册中心发送心跳检测,服务注册中心如果一段时间未收到来自服务提供者的心跳后,认为该服务提供者已经停止服务,则将该服务从注册中心上去掉。

2.2 从调用者的角度看:

        服务的调用者启动的时,根据自己订阅的服务,向服务注册中心查找服务提供者的地址等信息。当服务调用者消费的服务上线或者下线时,注册中心会告知该服务的调用者。服务调用者下线的时候,则取消订阅。

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机器上的应用进行相关处理(一般是业务逻辑处理操作)。

5. 总结:

        通常,经过以上四个步骤之后,一次完整的RPC调用算是完成了,另外可能因为网络抖动等原因需要重试等。

相关文章:

RPC知识

一、为什么要有RPC: HTTP协议的接口,在接口不多、系统与系统交互较少的情况下,解决信息孤岛初期常使用的一种通信手段;优点就是简单、直接、开发方便,利用现成的HTTP协议进行传输。 但是,如果是一个大型的网…...

【爬虫】requests 结合 BeautifulSoup抓取网页数据

一、BeautifulSoup使用步骤 BeautifulSoup 是一个用于从 HTML 或 XML 文件中提取数据的 Python 库。以下是如何使用 BeautifulSoup 来解析 HTML 并提取信息的基本步骤: 1、安装: 如果你还没有安装 BeautifulSoup,你可以使用 pip 来安装它。…...

安全测试框架 二

使用安全测试框架进行测试,可以遵循以下步骤进行,以确保测试的全面性和系统性: 一、明确测试目标和需求 确定测试的范围和重点,明确要测试的系统或应用的安全性方面的关键点和重要性。根据业务需求和安全标准,制定详…...

安徽京准-NTP网络授时服务器助力助力甘南州公共资源交易

安徽京准-NTP网络授时服务器助力助力甘南州公共资源交易 安徽京准-NTP网络授时服务器助力助力甘南州公共资源交易 2024年5月中旬,我安徽京准科技生产研发的NTP时钟服务器成功投运甘南州公共资源交易中心,为该中心的计算机网络系统及其他各业务子系统提供…...

大数据—什么是大数据?

大数据是指所涉及的资料量规模巨大到无法透过主流软件工具,在合理时间内达到撷取、管理、处理、并整理成为帮助企业经营决策更积极目的的资讯。想要更加全面地了解大数据的概念,可以从以下几个维度进行介绍: 大数据的定义: 基本…...

德克萨斯大学奥斯汀分校自然语言处理硕士课程汉化版(第十一周) - 自然语言处理扩展研究

自然语言处理扩展研究 1. 多语言研究2. 语言锚定3. 伦理问题 1. 多语言研究 多语言(Multilinguality)是NLP的一个重要研究方向,旨在开发能够处理多种语言的模型和算法。由于不同语言在语法、词汇和语义结构上存在差异,这成为一个复杂且具有挑战性的研究…...

支持向量机(SVM)中核函数的本质意义

本质上在做什么? 内积是距离度量,核函数相当于将低维空间的距离映射到高维空间的距离,并非对特征直接映射。 为什么要求核函数是对称且Gram矩阵是半正定? 核函数对应某一特征空间的内积,要求①核函数对称;②…...

SpringBoot使用jasypt实现数据库信息的脱敏,以此来保护数据库的用户名username和密码password(容易上手,详细)

1.为什么要有这个需求? 一般当我们自己练习的时候,username和password直接是爆露出来的 假如别人路过你旁边时看到了你的数据库账号密码,他跑到他的电脑打开navicat直接就是一顿连接,直接疯狂删除你的数据库,那可就废…...

Python日志配置策略

1 三种情况下都能实现日志打印: 被库 A 调用,使用库 A 的日志配置。被库 B 调用,使用库 B 的日志配置。独立运行,使用自己的日志配置。 需要实现一个灵活的日志配置策略,使得日志记录器可以根据调用者或运行环境自动…...

想学编程,什么语言最好上手?

Python是许多初学者的首选,因为它的语法简洁易懂,而且有丰富的资源和社区支持。我这里有一套编程入门教程,不仅包含了详细的视频 讲解,项目实战。如果你渴望学习编程,不妨点个关注,给个评论222,…...

binlog和redolog有什么区别

在数据库管理系统中,binlog(binary log)和 redolog(redo log)是两种重要的日志机制,它们在数据持久性和故障恢复方面扮演着关键角色。虽然它们都用于记录数据库的变化,但它们的目的和使用方式有…...

Linux笔记--ubuntu文件目录+命令行介绍

文件目录 命令行介绍 当我们在ubuntu中命令行处理位置输入ls后会显示出其所有目录,那么处理这些命令的程序就是shell,它负责接收用户的输入,并根据输入找到其他程序并运行 命令行格式 linux的命令一般由三部分组成:command命令、…...

71、最长上升子序列II

最长上升子序列II 题目描述 给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少。 输入格式 第一行包含整数N。 第二行包含N个整数,表示完整序列。 输出格式 输出一个整数,表示最大长度。 数据范围 1 ≤ N ≤ 100000…...

解决必剪电脑版导出视频缺斤少两的办法

背景 前几天将电脑重置了,今天想要剪辑一下视频,于是下载了必剪,将视频、音频都调整好,导出,结果15分钟的视频只能导出很短的时长,调整参数最多也只能导出10分钟,My God! 解决 首…...

新人学习笔记之(常量)

一、什么是常量 1.常量:在程序的执行过程中,其值不能发生改变的数据 二、常量的分类 常量类型说明举例整型常量整数、负数、0123 456实型常量所有带小数点的数字1.93 18.2字符常量单引号引起来的字母、数字、英文符号S B字符串常量双引号引起来的&…...

Lua解释器裁剪

本文目录 1、引言2、文件功能3、选择需要初始化的库4、结论 文章对应视频教程: 已更新。见下方 点击图片或链接访问我的B站主页~~~ Lua解释器裁剪,很简单~ 1、引言 在嵌入式中使用lua解释器,很多时候会面临资源紧张的情况。 同时&#xff0c…...

web前端设计nav:深入探索导航栏设计的艺术与技术

web前端设计nav:深入探索导航栏设计的艺术与技术 在web前端设计中,导航栏(nav)扮演着至关重要的角色,它不仅是用户浏览网站的指引,更是网站整体设计的点睛之笔。本文将从四个方面、五个方面、六个方面和七…...

分析解读NCCL_SHM_Disable与NCCL_P2P_Disable

在NVIDIA的NCCL(NVIDIA Collective Communications Library)库中,NCCL_SHM_Disable 和 NCCL_P2P_Disable 是两个重要的环境变量,它们控制着NCCL在多GPU通信中的行为和使用的通信机制。下面是对这两个环境变量的详细解读&#xff1…...

使用 Python 进行测试(6)Fake it...

总结 如果我有: # my_life_work.py def transform(param):return param * 2def check(param):return "bad" not in paramdef calculate(param):return len(param)def main(param, option):if option:param transform(param)if not check(param):raise ValueError(…...

Flink Watermark详解

Flink Watermark详解 一、概述 Flink Watermark是Apache Flink框架中为了处理乱序和延迟事件时间数据而引入的一种机制。在流处理中,由于数据可能不是按照事件产生的时间顺序到达的,Watermark被用来告知系统在该时间戳之前的数据已经全部到达&#xff…...

LeetCode538.把二叉搜索树转换为累加树

class Solution { public:int sum 0; TreeNode* convertBST(TreeNode* root) { if (root){convertBST(root->right);sum root->val;root->val sum;convertBST(root->left);}return root;}};...

关于编程思想

面向过程思想 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了 JS就是典型的面向过程的编程语言 优点: 性能比面向对象编程高,适合跟硬件联系很紧密的东西…...

521. 最长特殊序列 Ⅰ(Rust单百解法-脑筋急转弯)

题目 给你两个字符串 a 和 b,请返回 这两个字符串中 最长的特殊序列 的长度。如果不存在,则返回 -1 。 「最长特殊序列」 定义如下:该序列为 某字符串独有的最长 子序列 (即不能是其他字符串的子序列) 。 字符串 s …...

【YashanDB知识库】PHP使用OCI接口使用数据库绑定参数功能异常

【问题分类】驱动使用 【关键字】OCI、驱动使用、PHP 【问题描述】 PHP使用OCI8连接yashan数据库,使用绑定参数获取数据时,出现报错 如果使用PDO_OCI接口连接数据库,未弹出异常,但是无法正确获取数据 【问题原因分析】 开启O…...

深入分析 Android BroadcastReceiver (三)

文章目录 深入分析 Android BroadcastReceiver (三)1. 广播消息的优缺点及使用场景1.1 优点1.2 缺点 2. 广播的使用场景及代码示例2.1. 系统广播示例:监听网络状态变化 2.2. 自定义广播示例:发送自定义广播 2.3. 有序广播示例:有序广播 2.4. …...

在java中使用Reactor 项目中的一个类Mono,用于表示异步单值操作

Mono 是 Reactor 项目中的一个类,用于表示异步单值操作。Reactor 是一个响应式编程库,广泛应用于 Java 中的异步编程和非阻塞 I/O 操作。Mono 可以类比为一个可能(或将来)包含零个或一个值的异步计算结果。与 Flux(另一…...

LabVIEW故障预测

在LabVIEW故障预测中,振动信号特征提取的关键技术主要包括以下几个方面: 时域特征提取:时域特征是直接从振动信号的时间序列中提取的特征。常见的时域特征包括振动信号的均值、方差、峰值、峰-峰值、均方根、脉冲指数等。这些特征能够反映振动…...

掌握JavaScript中的`async`和`await`:循环中的使用指南

引言 在JavaScript的异步编程中,async和await提供了一种更接近同步代码的写法,使得异步逻辑更加清晰易懂。然而,当它们与循环结合时,一些常见的陷阱和误区可能会出现。本文将通过代码示例,指导你如何在循环中正确使用…...

java第二十三课 —— 继承

面向对象的三大特征 继承 继承可以解决代码复用,让我们的编程更加靠近人类思维,当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子…...

不可不知的Java SE技巧:如何使用for each循环遍历数组

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…...

做网站做app什么专业/google推广公司哪家好

前言 找工作还是需要大家不要紧张,有我们干这一行的接触人本来就不多 难免看到面试官会紧张,主要是因为怕面试官问的问题到不上来,那时候不要着急 ,答不上了的千万不然胡扯一些,直接就给面试官说这块我还没接触到&…...

电商怎么做链接/seo网站外链工具

python 示例文件错误属性 (File errors Property) errors Property is an inbuilt property of File object (IO object) in Python, it is used to get the Unicode error handler along with the Unicode. errors Property是Python中File对象(IO对象)的内置属性,用…...

常熟网站建设哪家好/上海培训机构排名榜

3.1 Caching模式 Caching(缓存)模式描述了如何通过用完资源后不立刻释放资源来避免对资源的昂贵的重新获取。资源会维持它们的标识,并保留在某种可以快速访问的存储器中。它们可以被重用,从而避免了重新获取。 1.问题 对相同资源的…...

阿里云万网网站/餐饮品牌全案策划

需要利用Adobe illustrator(AI)可以快速方便的提取图片的轮廓线并形成矢量图形,同时AI支持导出为dxf和dwg格式,可以再导入CAD或Solidworks、Inventor等建模软件制作三维模型。软件:Adobe illustrator(无版本…...

wordpress更换域名所有页面404/企业网站的搜索引擎推广与优化

概述:Spark 程序开发,调试和运行,intellij idea开发Spark java程序。 分两部分,第一部分基于intellij idea开发Spark实例程序并在intellij IDEA中运行Spark程序.第二部分,将开发程序提交到Spark local或者hadoop YARN…...

重庆网站推广哪家好/拓客引流推广

JetCache学习笔记 - lwh147 - 博客园JetCache学习笔记和问题记录https://www.cnblogs.com/lwh147/p/15176574.html 在分布式系统中,使用redis的原子性操作实现分布式锁,不过在自己编辑代码的时候,会出现一些代码上的问题,这个工具…...