当前位置: 首页 > 科技观察

微服务调用为什么要用RPC框架,Http不是更简单吗?

时间:2023-03-18 16:11:11 科技观察

背??景在一次采访对话中,我们谈到了业务实现的技术架构。无论系统大小,一般都是微服务架构,那么一个问题就产生了。为什么选择使用RPC来进行服务间的调用呢?http不也可以实现服务之间的通信吗?为什么不?或者RPC比http好在哪里?什么是RPC提到RPC(RemoteProcedureCall),就不能不提到分布式,分布式正是促使RPC诞生的领域。假设你有一个Calculator及其实现类CalculatorImpl,那么在单个应用中,需要调用Calculator的add方法进行加法运算,直接在方法中使用即可,因为在同一个地址空间,或者在同一块内存中,这称为本地函数调用。现在,系统转变为分布式应用程序。接口调用和实现在两个子系统中。服务A中没有CalculatorImpl类,那么它如何调用服务B中CalculatorImpl的add方法呢?可以模仿B/S架构,在调用方式上,服务B暴露一个Restful接口,然后服务A通过调用这个Restful接口间接调用CalculatorImpl的add方法。这样一来,就已经很接近RPC了。但是,每次调用这种都需要写一系列代码发起http请求吗?比如httpClient.sendRequest...之类的,能不能再简单点,像本地的方法调用一样,发起远程调用,让用户感知不到远程调用的过程。屏蔽工作可以通过使用代理方式生成一个代理对象来解决,代理对象内部是通过httpClient实现RPC远程过程调用。这是很多RPC框架要解决的问题和解决思路,比如阿里的Dubbo。总结起来,RPC要解决两个问题:1.解决分布式系统中服务之间的调用问题。2、远程调用的时候,一定要和本地调用一样方便,让调用者感知不到远程调用的逻辑。RPC是一种技术的概念名词。RPC=RemoteProduceCall是一种技术的概念名词。HTTP是一种协议。RPC可以通过HTTP来实现,也可以通过Socket本身实现的一套协议来实现。所以话题可以换一种理解,为什么RPC有HTTP以外的实现方式,为什么有必要?毕竟除了HTTP实现,私有协议并不通用。RPC框架的优点是接口不多,系统间交互少。在这种情况下,它是解决信息孤岛初期经常使用的一种通信方式;优点是简单、直接、开发方便。如果是大型网站,内部子系统多,接口多,那么RPC框架的好处就会显现出来:首先是长链接,不用像HTTP一样每次握手三遍。减少了网络开销;其次,RPC框架一般都有一个注册中心,具有丰富的监控和管理;发布、下线接口、动态扩展等对于调用者来说都是非感知的统一操作。***是安全。rpc是一个概念,http也是rpc的一种实现方式。在复杂度上,dubbo/hessian使用起来超级简单。至于为什么要用dubbo/hessian,有几点:一是调用简单,真正提供了类似于调用本地方法一样调用接口的功能。二是参数的返回值简单明了。jar包中直接定义了参数和返回值,不需要二次解析。三是轻量级,没有冗余信息。第四,易于管理,基于dubbo注册中心。RPC可以解耦服务RPC:RemoteProcedureCall。RPC的核心不在于使用什么协议。RPC的目的是让你在本地调用一个远程方法,但是这个调用对你来说是透明的,你不知道被调用的方法部署在哪里。RPC可以解耦服务,这才是使用RPC的真正目的。RPC的原理主要是采用动态代理方式。至于http协议,它只是一种传输协议。简单的实现可以参考springremoting,复杂的实现可以参考dubbo。rpc=socket+dynamicproxyserver通信的原理是一个socket服务器A和另一个socket客户端B。现在如果要通信的话,可以直接以流方式写或者读。这样可以进行通信,但是有一个问题。如何了解更多信息?比如需要发送的流的大小,编码,IP等。这样就有了协议,协议就是规范,就是发送的流携带了很多内容。那么回到刚才的问题。发送的内容是文本类型,客户端要序列化,所以常用的有json、xml等,如果想把内容变小,那就是二进制。将文本转换为二进制传输。说到rpc和http接口,就别想得太复杂了。rpc协议更简单,内容更小,所以效率更高。什么是rpc?它是套接字加动态代理。总结起来,学习技术应该是知其然,知其所以然。我们要明白什么场景、什么业务需要它,它能解决其他技术不能或不方便解决的问题。RPC是一个软件结构概念,是构建分布式应用程序的理论基础。就像为什么你家可以用发电厂的电?因为电是可以传输的。至于是用铜线还是铁线还是其他类型的线,就是用http还是其他协议的问题。这取决于场景和性能要求。java中最基础的就是RMI技术,它是java原生的应用层分布式技术。可以肯定的是,在传输性能上,RMI的性能优于HTTP。那为什么这项技术很少被使用呢?那是因为使用这项技术有很多限制。首先要保证传输的两端都必须用java实现,并且两端需要有相同的对象类型和代理接口,并且不需要容器,但是增加了编程的难度,在应用内部的各个子系统中还是能看到他的身影。例如,EJB就是基于rmi技术的。这与现在的bs架构软件有很大的不同。使用http,服务器必须位于http容器中,减少了网络传输的开发,只需要专注于业务开发。因此,在构建软件时,不能根据需求来选择技术。