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调用算是完成了,另外可能因为网络抖动等原因需要重试等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/853603.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[大模型]XVERSE-7B-chat FastAPI 部署

XVERSE-7B-Chat为XVERSE-7B模型对齐后的版本。 XVERSE-7B 是由深圳元象科技自主研发的支持多语言的大语言模型(Large Language Model),参数规模为 70 亿,主要特点如下: 模型结构:XVERSE-7B 使用主流 Deco…

HAL库开发--STM32的HAL环境搭建

知不足而奋进 望远山而前行 目录 文章目录 前言 下载 安装 解压 安装 添加开发包 修改仓库路径 下载软件开发包(慢,不推荐) 解压已有软件开发包(快,推荐) 总结 前言 在嵌入式系统开发中&#x…

线上教育培训办公系统系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,教师管理,学生管理,运营事件管理 教师账户功能包括:系统首页,个人中心,学生管理,作业管理,电…

Java版+ SaaS应用+接口技术RESTful API 技术开发的智慧医院HIS系统源码 专注医院管理系统研发 支持二开

Java版 SaaS应用接口技术RESTful API WebSocket WebService技术开发的智慧医院HIS系统源码 专注医院管理系统研发 支持二开 医院住院管理系统(Hospital Information System简称HIS)是一门医学、信息、管理、计算机等多种学科为一体的边缘科学&#xff…

LabVIEW与Matlab联合编程的途径及比较

​ LabVIEW和Matlab联合编程可以通过多种途径实现,包括调用Matlab脚本节点、使用LabVIEW MathScript RT模块、利用ActiveX和COM接口,以及通过文件读写实现数据交换。每种方法都有其独特的优势和适用场景。本文将详细比较这些方法,帮助开发者…

给文件夹加密的最简单方法

安当TDE透明加密针对文件夹数据加密的保护方案主要包括以下几个方面: 1. 透明加密机制: 用户无需关心数据的加密和解密过程,操作文件夹时就像处理普通数据一样。加密和解密操作在后台自动进行,对用户和应用程序透明。 2. 高性能加…

python文件操作(Windows路径,内置os库)+ 正则表达式(语法与re库)

文章目录 前言1 Windows路径(1)绝对路径 (Absolute Path)(2)相对路径 (Relative Path)一、python文件的读写操作1 读写(1)打开文件file = open(test1.txt,r,encoding=utf-8) --- 打开文件(2)读取文件内容content = file.read() --- 读取全部内容,返回字符串lines = re…

【QT5】<知识点> QT常用知识(更新中)

目录 一、更改文本颜色和格式 二、QT容器类 三、字符串与整数、浮点数之间的转换 四、QString常用功能 五、SpinBox的属性介绍 六、滑动、滚动、进度条和表盘LCD 七、时间、日期、定时器 一、更改文本颜色和格式 动态设置字体粗体:QFont对象的setBold方法动态…

java第二十四课 —— super 关键字 | 方法重写

super 关键字 基本介绍 super 代表父类的引用,用于访问父类的属性、方法、构造器。 基本语法 访问父类的属性,但不能访问父类的 private 属性。 super.属性名; 访问父类的方法,不能访问父类的 private 方法。 super.方法名(参数列表); 访…

个人网站制作 Part 27 添加网站导航搜索功能 | Web开发项目添加页面缓存

文章目录 🚀 添加网站导航搜索功能🔨使用搜索服务🔧步骤 1: 选择搜索服务🔧步骤 2: 注册Algolia账户🔧步骤 3: 获取Algolia搜索配置 使用Vue.js🔧步骤 4: 安装Algolia搜索库🔧步骤 5: 创建搜索组…

DNS域名解析----分离解析、多域名解析、父域与子域

1 理论部分 1.1 分离解析 DNS的分离解析,是指根据不同的客户端提供不同的域名解析记录。来自不同地址的客户机请求解析同一域名时,为其提供不同的解析结果。也就是内外网客户请求访问相同的域名时,能解析出不同的IP地址,实现负载…

【机器学习】机器学习中的人工神经元模型有哪些?

线性神经元 线性神经元(Linear Neuron)是一种基本的人工神经元模型,特点是其输出是输入的线性组合。线性神经元是神经网络中最简单的一种形式,适用于处理线性关系的问题。数学模型如下, y w ⋅ x b ∑ i 1 n w i x…

springboot原理篇-配置优先级

springboot原理篇-配置优先级(一) springboot项目一个支持三种配置文件 application.propertiesapplication.ymlapplication.yaml 其中,优先级的顺序是: application.properties > application.yml > application.yaml 也…

块级元素与行内元素详解

在网页设计与开发中,元素根据其在页面布局中的表现可分为两大类:块级元素(Block-level Elements)和行内元素(Inline Elements)。理解它们的特性和使用规则对于构建结构清晰、布局合理的网页至关重要。 块级…

HashMap详解(含动画演示)

目录 HashMap1、HashMap的继承体系2、HashMap底层数据结构3、HashMap的构造函数①、无参构造②、有参构造1 和 有参构造2 (可以自定义初始容量和负载因子)③、有参构造3(接受一个Map参数)JDK 8之前版本的哈希方法:JDK 8版本的哈希方法 4、拉链法解决哈希冲突什么是拉…

正解 x86 Linux 内存管理

1,机器解析的思路 发现网络上大量的教程,多是以讹传讹地讲解 Linux 内存管理; 都是在讲: 逻辑地址 -> 线性地址 -> 物理地址 这个转换关系是怎么发生的。 上面这个过程确实是程序运行时地址的翻译顺序; …

使用消息队列(MQ)实现MySQL持久化存储与MySQL server has gone away问题解决

在现代应用程序开发中,消息队列(MQ)扮演着重要的角色。它们可以帮助我们解决异步通信和解耦系统组件之间的依赖关系。而其中一个常见的需求是将消息队列中的数据持久化到数据库中,以确保数据的安全性和可靠性。在本文中&#xff0…

【AI学习】Together AI的新研究:Together MoA(Mixture of Agents)

第一次听说Mixture of Agents,原来Agent也能混合,有意思! 介绍 Together AI的最新研究“Together MoA”(Mixture of Agents,代理混合)是一种创新的方法,旨在通过结合多个开源大型语言模型&…

【尚庭公寓SpringBoot + Vue 项目实战】公寓管理(十一)

【尚庭公寓SpringBoot Vue 项目实战】公寓管理(十一) 文章目录 【尚庭公寓SpringBoot Vue 项目实战】公寓管理(十一)1、业务介绍2、逻辑模型介绍3、接口开发3.1、保存或更新公寓信息3.2、根据条件分页查询详细信息3.3、根据ID获…

读AI新生:破解人机共存密码笔记02进化

1. 人工智能的标准模型 1.1. 机器优化人类提供的固定目标 1.1.1. 是一条死胡同 1.1.1.1. 当你走进死胡同时,你最好掉头返回,找出走错的地方 1.2. 问题不在于我们可能无法做好构建人工智能系统的工作&…