RPC框架

什么是 RPC 框架

RPC 框架: 远程过程调用协议 RPC (Remote Procedure Call Protocol), 允许像调用本地服务一样调用远程服务。


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


比如:一个方法定义可能是这样的:Employee getEmployeeByName(String fullName)那么:

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

第二: 要解决寻址的问题, 也就是说,A 服务器上的应用怎么告诉底层的 RPC 框架,如何连接到 B 服务器 (如主机或 IP 地址)以及特定的端口, 方法的名称是什么,这样才能完成调用。比如基于 Web 服务协议栈的 RPC, 就要提供一个 endpoint URI,或者是从 UDDI 服务上查找。如果是 RMI (后面会提到)调用的话,还需要一个 RMI Registry 来注册服务的地址。

第三: 当 A 服务器上的应用发起远程过程调用时, 方法的参数需要通过底层的网络协议,如 TCP 传递到 B 服务器,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是 序列化(Serialize) 或者 编组(marshal),通过寻址和传输将序列化的二进制发送给 B 服务器。

第四: B服务器收到请求后,需要对参数进行 反序列化 (序列化的逆操作),恢复为内存中的表达方式,然后 找到对应的方法 (寻址的一部分)进行本地调用,然后得到返回值。

第五: 返回值还要发送回服务器 A 上的应用, 也要经过序列化的方式发送,服务器 A 接到后,再反序列化 ,恢复为内存中的表达方式,交给 A 服务器上的应用。在这里插入图片描述


总结归纳为以下步骤:

1. 远程服务之间建立通讯协议。

2. 寻址:服务器(如主机或 IP 地址)以及特定的端口,方法的名称是什么。

3. 通过序列化和反序列化进行数据传递。

4. 将传递过来的数据通过 java 反射原理定位接口方法和参数。

5. 暴露服务:用 map 将寻址的信息暴露给远方服务(提供一个 endpoint URI 或者一个前端展示页面)。

6. 多线程并发请求服务。



什么是 RPC

1. 提到 RPC ,就躲不开提到分布式,这个促使 RPC 诞生的领域。


2. 假设你有一个 Calculator ,以及它的实现类 CalculatorImpl ,那么单体应用时,要调用 Calculator 的 add 方法来执行一个加运算,你可以在方法中直接使用,因为在同一个地址空间,或者说在同一块内存中,这个称为本地函数调用。
在这里插入图片描述


3. 现在将系统改造为分布式应用,接口调用和实现分别在两个子系统内。
服务 A 里边并没有 CalculatorImpl 这个类,那它要怎样调用服务 B 的 CalculatorImpl 的 add 方法呢?可以模仿 B/S 架构的调用方式,在 B 服务暴露一个 Restful 接口,然后 A 服务通过调用这个 Restful 接口来间接调用 CalculatorImpl 的 add 方法。


4. 这样就已经和RPC很接近了。 不过,像这种每次调用时,是不是都需要写一串发起 Http 请求的代码呢? 比如 httpClient.sendRequest…之类的,能不能简单一下, 像本地方法调用一样,去发起远程调用,让使用者感知不到远程调用的过程。在这里插入图片描述


5. 屏蔽的工作,可以使用代理模块解决,生成一个代理对象,而这个代理对象的内部,就是通过 httpClient 来实现 RPC 远程过程调用的。

这就是很多 RPC 框架要解决的问题和解决问题的思路,比如阿里的 Dubbo。



总结一下,RPC要解决的两个问题:

1. 解决分布式系统中,服务之间的调用问题。

2. 远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。



RPC是一种技术的概念名词

RPC = Remote Produce Call 是一种技术的概念名词, ==== HTTP是一种协议,RPC可以通过 HTTP 来实现,也可以通过Socket ==== 自己实现一套协议来实现.所以题目可以换一种理解,为何 RPC 还有除 HTTP 之外的实现法,有何必要,毕竟除了HTTP实现外,私有协议不具备通用性.



RPC框架的好处

1. Http 接口是在接口不多、系统与系统交互较少的情况下,解决信息孤岛初期常使用的一种通信手段;

2. 优点就是简单、直接、开发方便。

3. 如果是一个大型的网站,内部子系统较多、接口非常多的情况下,RPC 框架的好处就显示出来了:

3.1 首先就是长链接,不必每次通信都要像 Http 一样去3次握手什么的,减少了网络开销;

3.2 其次就是 RPC 框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。

4. 最后就是安全性。



RPC 是一种概念,Http 也是 RPC 实现的一种方式。

1. 论复杂度,dubbo/hessian用起来是超级简单的。

2. 至于为什么用dubbo/hessian,有几点:

2.1 一是调用简单,真正提供了类似于调用本地方法一样调用接口的功能 。

2.2 二是参数返回值简单明了 参数和返回值都是直接定义在jar包里的,不需要二次解析。

2.3 三是轻量,没有多余的信息。

2.4 四是便于管理,基于dubbo的注册中心。



RPC能解耦服务

1. RPC:远程过程调用。RPC 的核心并不在于使用什么协议。RPC 的目的是让你在本地调用远程的方法,而对你来说这个调用是透明的,你并不知道这个调用的方法是部署哪里的。

2. 通过RPC能解耦服务,这才是使用 RPC 的真正目的。RPC的原理主要用到了动态代理模式,至于 Http 协议,只是传输协议而已。简单的实现可以参考 spring remoting,复杂的实现可以参考 Dubbo。



RPC = socket + 动态代理

1. 服务器通讯原理就是一台 socket 服务器 A,另一台 socket 客户端 B,现在如果要通讯的话直接以流方式写入或读出。这样能实现通讯,但有个问题。如何知道更多信息?

2. 比如需要发送流大小,编码,Ip 等。这样就有了协议,协议就是规范,就是发送的流中携带了很多的内容。那回到刚刚的问题。发送的内容就是文本类型,客户端就得序列化,那么常用的就有 json,xml 之类,如果想把内容变得更小,那就有二进制了。把文本变成二进制传递。

3.说到 RPC 与 Http 接口,不要太复杂了。RPC 协议更简单内容更小,那么来说效率是要高一点


RPC 是什么? 就是 Socket 加动态代理



总结

1. 学技术应该是知其然知其所以然,我们得明白什么场景,或者什么业务需要它,它能解决其他技术不能解决或者不方便解决的问题。


2. RPC 是一个软件结构概念,是构建分布式应用的理论基础。就好比为啥你家可以用到发电厂发出来的电?是因为电是可以传输的。至于用铜线还是用铁丝还是其他种类的导线,也就是用 Http 还是用其他协议的问题了。这个要看什么场景,对性能要求怎么样。


3. 在 java 中的最基本的就是 RMI 技术,它是 java 原生的应用层分布式技术。我们可以肯定的是在传输性能方面,RMI 的性能是优于 Http 的。


4. 那为什么很少用到这个技术?那是因为用这个有很多局限性,首先它要保证传输的两端都要要用 java 实现,且两边需要有相同的对象类型和代理接口,不需要容器,但是加大了编程的难度,在应用内部的各个子系统之间还是会看到他的身影,比如 EJB 就是基于 RMI 技术的。


5. 这就与目前的 B/S 架构的软件大相径庭。用 Http 必须要服务端位于 Http 容器里面,这样减少了网络传输方面的开发,只需要关注业务开发即可。所以在架构一个软件的时候,一定要根据需求选定技术。



原文地址:https://www.cnblogs.com/111testing/p/11296880.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值