HTTP和RPC的区别_rpc和http的区别-程序员宅基地

技术标签: rpc  网络  http  测试开发  

HTTP接口和RPC接口都是生产上常用的接口,顾名思义,HTTP接口使用基于HTTP协议的URL传参调用,而RPC接口则基于远程过程调用。

RPC(即Remote Procedure Call,远程过程调用)HTTP(HyperText Transfer Protocol,超文本传输协议),两者前者是一种方法,后者则是一种协议。两者都常用于实现服务,在这个层面最本质的区别是RPC服务主要工作在TCP协议之上(也可以在HTTP协议),而HTTP服务工作在HTTP协议之上。由于HTTP协议基于TCP协议,所以RPC服务天然比HTTP更轻量,效率更胜一筹。

两者都是基于网络实现的,从这一点上,都是基于Client/Server架构

RPC(Remote Procedure Call)服务

RPC服务基本架构包含了四个核心的组件,分别是Client,Server,Clent Stub以及Server Stub
在这里插入图片描述
Client (客户端):服务调用方。
Server(服务端):服务提供方。
Client Stub(客户端存根):存放服务端的地址消息,负责将客户端的请求参数打包成网络消息,然后通过网络发送给服务提供方。
Server Stub(服务端存根):接收客户端发送的消息,再将客户端请求参数打包成网络消息,然后通过网络远程发送给服务方。

RPC效率优势明显,在实际开发中,客户端和服务端在技术方案中约定客户端的调用参数和服务端的返回参数之后就可以各自开发,任何客户端只要按照接口定义的规范发送入参都可以调用该RPC服务,服务端也能按接口定义的规范出参返回计算结果。这样既实现了客户端和服务端之间的解耦,也使得RPC接口可以在多个项目中重复利用。

RPC调用分为同步方式和异步方式。同步调用即客户端等待调用完成并返回结果;异步调用即客户端不等待调用执行完成返回结果,变成单向调用或者通过回调函数等待接收到返回结果的通知。

流行的RPC框架

目前流行的RPC框架有很多,下面介绍常见的三种。

  1. gRPC:gRPC是Google公布的开源项目,基于HTTP2.0协议,并支持常见的众多编程语言。HTTP 2.0协议是基于二进制的HTTP协议的升级版本,gRPC底层使用了Netty框架。
  2. Thrift:Thrift是Facebook的一个开源项目,主要是一个跨语言的服务开发框架。它有一个代码生成器来对它所定义的IDL文件自动生成服务代码框架。Thrift对于底层的RPC通讯都是透明的,用户只需要对其进行二次开发即可,省去了一系列重复的前置基础开发工作。
  3. Dubbo:Dubbo是阿里集团开源的一个极为出名的RPC框架,在很多互联网公司和企业应用中广泛使用。协议和序列化框架都可以插拔是及其鲜明的特色。

HTTP服务

通过HTTP URL调用的服务,浏览器访问本质上也算HTTP服务,不同的是需要客户端浏览器渲染服务端返回的结果。

HTTP服务开发即开发ERESTful风格的服务接口。在接口不多、系统之间交互较少的情况下,是一种信息传递的常用通信手段。HTTP接口的优点是简单、直接、开发方便,利用现成的HTTP协议进行传输。在服务开发的时候,约定一个接口文档,严格定义输入和输出,明确每一个接口的请求方法和需要的请求参数及其格式。

在内部子系统较多、接口较多的情况下,RPC框架的好处就凸显出现了,首先是长连接,不必每次通信都要像HTTP那样三次握手,减少了网络开销;其次是RPC框架一般都有注册中心,有丰富的监控发布方法;RPC接口的发布、下线、动态扩展等对调用方是无感知的、统一化的操作。

Restful

Restful web service是一种常见的rest应用,统一用于命名遵循rest风格的web服务。Restful服务是一种ROA(Resource-Oriented Architecture,面向资源的架构)。举一个例子就可以理解了:

Restful出现之前的HTTP接口:

    http://127.0.0.1/user/query   GET  根据用户id查询用户数据
    http://127.0.0.1/user/save    POST 新增用户
    http://127.0.0.1/user/update POST 修改用户信息
    http://127.0.0.1/user/delete  GET/POST 删除用户信息

Restful式HTTP接口:

    http://127.0.0.1/user  GET  根据用户id查询用户数据
    http://127.0.0.1/user  POST 新增用户
    http://127.0.0.1/user  PUT 修改用户信息
    http://127.0.0.1/user  DELETE 删除用户信息

RPC接口和HTTP接口的区别与联系

RPC接口即相当于调用本地接口一样调用远程服务的接口;HTTP接口是基于http协议的post接口和get接口(等等,2.0版本协议子支持更多)。

传输协议
  • RPC:可以基于TCP协议,也可以基于HTTP协议。
  • HTTP:基于HTTP协议。
传输效率
  • RPC:使用自定义的TCP协议,可以让请求报文体积更小,或者使用HTTP2.0协议,也可以很好地减少报文体积,提高传输效率。
  • HTTP:如果时基于HTTP1.1的协议,请求中会包含很多无用的内容;如果是基于HTTP2.0,那么简单地封装一下还是可以作为一个RPC使用的,这时标准RPC框架更多是服务治理。
性能消耗
  • RPC:可以基于thrift实现高效的二进制传输
  • HTTP:大部分是通过json实现的,字节大小和序列化耗时都比thrift要更消耗性能
负载均衡
  • RPC:基本都自带了负载均衡策略
  • HTTP:需要配置Nginx,HAProxy实现
服务治理(下游服务新增,重启,下线时如何不影响上游调用者)
  • RPC:能做到自动通知,不影响上游
  • HTTP:需要事先通知,修改Nginx/HAProxy配置

RPC主要用于公司内部服务调用,性能消耗低,传输效率高,服务治理方便HTTP主要用于对外的异构环境,浏览器调用,APP接口调用,第三方接口调用等等。

RPC和HTTP都可以用于实现远程过程调用,如何选择
  • 速度上看,RPC比HTTP更快,虽然底层都是TCP,但是http协议的信息往往比较臃肿,不过可以采用gzip压缩
  • 难度上看,RPC实现较为复杂,http相对简单
  • 灵活性上看,HTTP更胜一筹,因为它不关心实现细节,跨平台,跨语言

两者有不同的使用场景:

  • 如果对效率要求更高,并且开发过程使用统一的技术栈,那么RPC还是不错的
  • 如果需要更加灵活跨语言跨平台,显然HTTP更合适

再插一句,最近新兴的微服务概念更加强调独立自治灵活,而RPC限制较多。因此微服务框架中,一般都会采用HTTP的Restful服务,像在公司内部使用hsf协议,对接外部系统使用微服务。

参考文献

Http和RPC区别
https://www.jianshu.com/p/9ccdea882688
RPC接口测试(二) RPC 与HTTP的区别

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Solo95/article/details/122640662

智能推荐

基于opencv的人脸检测与识别(python)(1)-程序员宅基地

文章浏览阅读514次。基于opencv的人脸检测,再使用tensorflow的框架以及keras库通过卷积神经网络对获取的人脸数据进行训练,生成训练模型,并对实时图片进行人脸识别。

Numbers on Tree_k. numbers on tree-程序员宅基地

文章浏览阅读160次。D. Numbers on Treetime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputEvlampiy was gifted a rooted tree. The vertices of the tree are numbered..._k. numbers on tree

软件测试工程师面试题-测试概念篇_面试测试工程师概念性问题有哪些-程序员宅基地

文章浏览阅读901次。转载于:https://www.cnblogs.com/mrwuzs/p/7976534.html_面试测试工程师概念性问题有哪些

0910-12学习记录-OFDM细节描述_ofdm子载波流数-程序员宅基地

文章浏览阅读899次。PPDU编码过程总览编码过程包含了很多细节的步骤,在以下的细节条款有很详细的描述。接下来的总览主要是为了促进对于这些细节的理解。生成PLCP前导码字段,包含10个短训练序列(用来做AGC增益控制,分集选择,时间的同步获取以及在接收端的粗频偏估计)和两个重复的长训练序列(用来做信道估计以及接收端的精准频偏估计)前面有保护间隔(GI)。具体的细节描述在 17.3.3.17.3.3.描述PLCP..._ofdm子载波流数

OSChina 中秋节乱弹 ——加班比抢了我的小鱼干,更让我难过!-程序员宅基地

文章浏览阅读234次。2019独角兽企业重金招聘Python工程师标准>>> ...

SpringBoot引入MyBatis_springboot mybatis jar maven引入-程序员宅基地

文章浏览阅读128次。首先进入spring官网,添加依赖,然后生成项目。打开Idea,然后导入刚才生成的项目文件。测试不用集成组件,要不然下载会下载很长时间。找到maven插件,导入必要的jar包。_springboot mybatis jar maven引入

随便推点

Shell根据文本内容批量修改文件名(附完整代码)_linux shell while批量改名-程序员宅基地

文章浏览阅读3.1k次。Shell根据文本内容批量修改文件名_linux shell while批量改名

“计算机系统概述”学习笔记_程序计数器怎么计算下一条指令的地址-程序员宅基地

文章浏览阅读2.2k次。文章目录机器字长存储器组成运算器组成控制器组成计算机系统的层次结构指令执行过程源程序翻译成可执行文件的过程机器字长计算机进行一次整数运算所能处理的二进制数据的位数。存储器组成组件由大到小(大包含小)依次为:计算机系统=计算机硬件系统+计算机软件系统计算机硬件系统=存储器+控制器+运算器+输入设备+输出设备存储器=主存储器(内存储器)+辅助存储器(外存储器)主存储器=地址寄存器(MAR)+存储体+数据寄存器(MDR)+时序控制逻辑存储体=若干存储单元存储单元=若干存储元件每个存储元件存_程序计数器怎么计算下一条指令的地址

Scala编写JedisPoolUtils工具类_jedis scala-程序员宅基地

文章浏览阅读1.5k次。package com.cloudera.utilsimport redis.clients.jedis.{Jedis, JedisPool, JedisPoolConfig}object JedisPoolUtils extends Serializable { @transient private var pool: JedisPool = null def makePoo..._jedis scala

MySQL 使用AVG聚合函数时,保留两位小数的方法_mysql avg保留两位小数-程序员宅基地

文章浏览阅读3.1k次。SELECT ( CASE WHEN platform_parameter IS NULL THEN page ELSE platform_parameter END ) AS page, sum(pv) AS pv, sum(uv) AS uv, CAST(AVG(time) AS DECIMAL(10,2)) as timeFROM t_page_stat_daily tLEFT JOIN t_app_dictionary d ON t.app_id = d._mysql avg保留两位小数

QOS_qos双色分离-程序员宅基地

文章浏览阅读1k次,点赞3次,收藏9次。QOS按权重进行资源分配,进行资源协调(1) 甄别流量(哪些有用,哪些无用----重要程度)(2) 分析流量诉求(有哪些要求----带宽、时延)(3) 细化流量诉求(对哪些参数比较敏感)队列机制 拥塞避免一、 流量分类TOS位,位于包头为之后,8位二进制规定:数字越大,越容易从接口出去(优先级越高)不合理之处:当队列满时,若再有较重要流量要进行排队,将会被拒绝DSCP:插分..._qos双色分离

聚类算法系列---DBSCAN密度聚类算法_聚类公式 ci min y dbscan-程序员宅基地

文章浏览阅读430次。DBSCAN(Density-Based Spatial Clustering of Application with Noise)思想:用一个点的邻域内的邻居点数来衡量该店所在的空间密度,根据密度来判定将样本划分到哪个簇,对于同一个簇里面的样本是紧密相连的。在进行聚类的时候事先不知道cluster的数目。基本概念设数据集X={x1,x2,....,xn}Eps:定义密度时的邻域半径..._聚类公式 ci min y dbscan