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.mfbz.cn/a/713228.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python-基础篇-函数-在py中的长相

文章目录 整体长相长相要求 整体长相 怎么自定义函数? 要知道怎么定义函数,就要知道函数的组成部分是怎样的。 def 函数名(参数1,参数2....参数n):函数体return 语句这就是 Python 函数的组成部分。 长相要求 所以自定义函数&#xff0c…

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

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

【loguru】【notifiers】配置ERROR级别邮件发送通知

完整代码 from loguru import logger from notifiers import get_notifier# 获取电子邮件通知器 notifier get_notifier("email")# 配置电子邮件通知参数 email_params {"username": "xxxxx163.com", # 发送邮件的用户名,我这里用…

时机:产品成功的关键因子

在商业世界里,产品成功与否往往与许多因素有关:优秀的创意、强大的团队、充足的资金等。然而,在这些因素之外,一个常被忽视但至关重要的因素就是“时机”。正如古语所言:“人为可做,天时难造”,…

LabVIEW电子类实验虚拟仿真系统

开发了基于LabVIEW开发的电子类实验虚拟仿真实验系统。该系统通过图形化编程方式,实现了复杂电子实验操作的虚拟化,不仅提高了学生的操作熟练度和学习兴趣,而且通过智能评价模块提供即时反馈,促进教学和学习的互动。 项目背景 在…

目标检测——可见光和红外船舶图像配对数据集

引言 亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。 …

webpack逆向

声明:个人总结记录一下,避免忘记 1、webpack 类型 单文件 直接可以在文件顶部找到加载器 多文件 顶部找不到加载器 如图所示 多文件的这话,全局搜所 69725 找到类似n(69725) ,单点n进去,可以找到加载器 2、调用 通过赋值的方…

金属3D打印技术革新模具制造业

在当今竞争激烈的制造业领域,模具制造业正面临着诸多挑战。冷却时间长、模具温度控制困难、制造周期长以及成本高昂等问题,一直是制约模具制造业发展的瓶颈。然而,随着金属3D打印技术的快速发展,模具制造业迎来了前所未有的机遇。…

SpringAI快速上手

一、导入依赖 镜像&#xff08;导入maven依赖&#xff09; <repositories><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>…

宿舍用电管理模块一进三出的升级改造

宿舍用电管理模块一进三出石家庄光大远通电气有限公司产品在高校日常管理工作中,宿舍管理是一项重要工作。宿舍管理内容复杂,而且涉及学生的日常生活,意义重大。其中,学生宿舍内漏电,超负荷用电,违规用电等现象一直是困扰后勤管理的普遍问题。随着学生日常生活方式以及生活用品…

光功率计传感器

光探测仪表: 激光功率计探头按照不同的原理和材料分为热电堆型、光电二极管型以及包含两种传感器的综合探头, 激光能量计则有热释电传感器和热电堆传感器探头 热释电效应传感器: 热释电传感器的工作原理主要是基于热释电效应。当物体处于不同温度时,会发射出不同强度的红…

【RabbitMQ】异步消息及Rabbitmq安装

https://blog.csdn.net/weixin_73077810/article/details/133836287 https://www.bilibili.com/video/BV1mN4y1Z7t9/ 同步调用和异步调用 如果我们的业务需要实时得到服务提供方的响应&#xff0c;则应该选择同步通讯&#xff08;同步调用&#xff09;。 如果我们追求更高的效…

怎样快速清理电脑里的所有软件 怎么删除干净电脑软件

苹果电脑内的软件来源主要有两个&#xff0c;一是系统预装&#xff0c;二是用户自行下载。但并不是所有应用程序都是高频使用状态&#xff0c;甚至好多是从未打开过的“屏幕装饰”。小编今日独家攻略&#xff0c;内存告急如何快速清理电脑里的所有软件&#xff0c;怎么删除干净…

upload-labs第八关教程

upload-labs第八关教程 一、源代码分析代码审计 二、绕过分析点绕过上传eval.php使用burp suite进行抓包修改放包&#xff0c;查看是否上传成功使用中国蚁剑进行连接 一、源代码分析 代码审计 $is_upload false; $msg null; if (isset($_POST[submit])) {if (file_exists(U…

第一篇:容器化的未来:从Docker的革命到云原生架构

容器化的未来&#xff1a;从Docker的革命到云原生架构 1. 引言 在当今快速演进的技术领域&#xff0c;容器化技术已经成为云计算和微服务架构的重要组成部分。该技术以其高效的资源利用率、快速的部署能力和卓越的隔离性能&#xff0c;彻底改变了软件开发和部署的方式。容器化…

机器学习:GANs网络在图像和视频技术中的应用前景

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

【漏洞复现】六零导航页 _include_file.php 任意文件上传漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

西门子学习笔记15 - 位逻辑操作的学习

1、点动操作&#xff08;按下按钮就启动松开就停止&#xff09; 2、自锁电路&#xff08;可以自己保持的状态除非常闭停止按下&#xff09; 3、取反操作&#xff08;顾名思义就是反过来1就变成0&#xff0c;0就变成1&#xff09; 4、置为复位&#xff08;置位之后如果不复位的话…

Elixir学习笔记——进程(Processes)

在 Elixir 中&#xff0c;所有代码都在进程内运行。进程彼此隔离&#xff0c;彼此并发运行并通过消息传递进行通信。进程不仅是 Elixir 中并发的基础&#xff0c;而且还提供了构建分布式和容错程序的方法。 Elixir 的进程不应与操作系统进程混淆。Elixir 中的进程在内存和 CPU…

餐厅点餐系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;商品管理&#xff0c;用户管理&#xff0c;店家管理&#xff0c;广告管理 店家账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;商品管理&#xff0c;广告管…