多语言通信基础 07 rpc、http以及restful 之间的区别

首先我们先了解一下TCP/IP协议族吧,这个方便你理解。仔细看看下图,的结构,数字表示端口。

 

1、RPC 和 REST 区别是什么/h2>

你一定会觉得这个问题很奇怪,是的,包括我,但是你在 络上一搜,会发现类似对比的文章比比皆是,我在想可能很多初学者由于基础不牢固,才会将不相干的二者拿出来对比吧。既然是这样,那为了让你更加了解陌生的RPC,就从你熟悉得不能再熟悉的 REST 入手吧。

REST,是Representational State Transfer 的简写,中文描述表述性状态传递(是指某个瞬间状态的资源数据的快照,包括资源数据的内容、表述格式(XML、JSON)等信息。)

REST 是一种软件架构风格。这种风格的典型应用,就是HTTP。其因为简单、扩展性强的特点而广受开发者的青睐。

而RPC 呢,是 Remote Procedure Call Protocol 的简写,中文描述是远程过程调用,它可以实现客户端像调用本地服务(方法)一样调用服务器的服务(方法)。

而 RPC 可以基于 TCP/UDP,也可以基于 HTTP 协议进行传输的,按理说它和REST不是一个层面意义上的东西,不应该放在一起讨论,但是谁让REST这么流行呢,它是目前最流行的一套互联 应用程序的API设计标准,某种意义下,我们说 REST 可以其实就是指代 HTTP 协议。

2、使用方式不同

从使用上来看,HTTP 接口只关注服务提供方,对于客户端怎么调用并不关心。接口只要保证有客户端调用时,返回对应的数据就行了。而RPC则要求客户端接口保持和服务端的一致。

REST 是服务端把方法写好,客户端并不知道具体方法,只需获取资源,所以发起HTTP请求,而服务端接收到请求后根据URI经过一系列的路由才定位到方法上面去获取相应资源。

RPC是服务端提供好方法给客户端调用,客户端需要知道服务端的具体类,具体方法,然后像调用自己的本地方法一样直接调用它。

3、面向对象不同

从设计上来看,RPC,所谓的远程过程调用 ,是面向方法的 ;

REST:所谓的 Representational state transfer ,是面向资源的;

除此之外,还有一种叫做 SOA,所谓的面向服务的架构,它是面向消息的,这个接触不多,就不多说了。

4、序列化协议不同

接口调用通常包含两个部分,序列化和通信协议。

通信协议,上面已经提及了,REST 是 基于 HTTP 协议,而 RPC 可以基于 TCP/UDP,也可以基于 HTTP 协议进行传输的。

常见的序列化协议,有:json、xml、hession、protobuf、thrift、text、bytes等,REST 通常使用的是 JSON或者XML,而 RPC 使用的是 JSON-RPC,或者 XML-RPC。

通过以上几点,我们知道了 REST 和 RPC 之间有很明显的差异。

然后第二个问题如下:

为什么要采用RPC/h2>

那到底为何要使用 RPC,单纯的依靠RESTful API不可以吗什么要搞这么多复杂的协议,渣渣们表示真的学不过来了。

关于这一点,以下几点仅是我的个人猜想,仅供交流:

RPC 和 REST 两者的定位不同,REST 面向资源,更注重接口的规范,因为要保证通用性更强,所以对外最好通过 REST。而 RPC 面向方法,主要用于函数方法的调用,可以适合更复杂通信需求的场景。RESTful API客户端与服务端之间采用的是同步机制,当发送HTTP请求时,客户端需要等待服务端的响应。当然对于这一点是可以通过一些技术来实现异步的机制的。采用RESTful API,客户端与服务端之间虽然可以独立开发,但还是存在耦合。比如,客户端在发送请求的时,必须知道服务器的地址,且必须保证服务器正常工作。而 rpc + ralbbimq中间件可以实现低耦合的分布式集群架构。

说了这么多,我们该如何选择这两者呢总结了如下两点,供你参考:

REST 接口更加规范,通用适配性要求高,建议对外的接口都统一成 REST。而组件内部的各个模块,可以选择 RPC,一个是不用耗费太多精力去开发和维护多套的HTTP接口,一个RPC的调用性能更高(见下条)从性能角度看,由于HTTP本身提供了丰富的状态功能与扩展功能,但也正由于HTTP提供的功能过多,导致在 络传输时,需要携带的信息更多,从性能角度上讲,较为低效。而RPC服务 络传输上仅传输与业务内容相关的数据,传输数据更小,性能更高。

为什么一定要rpc,不能只学http协议和restful协议吗/h2>

2. 自定义协议可以优化数据的传输,例如更大的压缩比。

如果我们只是开发web 站或者一些服务的使用者, 那么我们用restful看起来已经足够了,但是rpc的这种模式在大量的服务中都有,比如redis协议, rabbitmq的AMQP协议, 聊天软件的协议,也就是说我们想要开发一个redis的客户端,我们只需要用我们喜欢的语言实现redis定义的协议就行了,这对于开发服务来说非常有用,一般这种协议的价值在于我们自己开发的服务之间需要通信的时候 – 那你会问了,自己开发的组件之间协作,直接调用函数不就行了吗- 对了,有些人已经反映过来了 — 分布式系统,分布式系统中非常常用, 比如openstack中。 还有就是微服务!

所以掌握rpc开发,对于进阶和分布式开发就变得非常重要。

http协议1.x一般情况下一个来回就关闭连接,虽然提供了keep-alive可以保持长连接,但是依然不方便,所以就出现了http2.0, http2.0基本上可以当做tcp协议使用了。所以后面讲解到的grpc就会使用http2.0开发。

文章知识点与官方知识档案匹配,可进一步学习相关知识 络技能树首页概览22510 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年3月20日
下一篇 2022年3月20日

相关推荐