首页 > 其他分享 >HTTP和RPC的区别

HTTP和RPC的区别

时间:2024-01-28 21:13:10浏览次数:17  
标签:协议 调用 服务 区别 接口 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,面向资源的架构)。举例:

Restfull式出现之前的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主要用于内部服务之间调用,性能消耗低,传输效率高,服务治理方便。HTTP主要用于对外的异构环境,浏览器调用,APP接口调用,第三方接口调用等等。

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

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

两者有不同的使用场景:

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

总结

RPC服务和HTTP服务还是存在很多的不同点的,一般来说,RPC服务主要是针对大型企业的,而HTTP服务主要是针对小企业的,因为RPC效率更高,而HTTP服务开发迭代会更快。总之,选用什么样的框架不是按照市场上流行什么而决定的,而是要对整个项目进行完整地评估,从而在仔细比较两种开发框架对于整个项目的影响,最后再决定什么才是最适合这个项目的。一定不要为了使用RPC而每个项目都用RPC,而是要因地制宜,具体情况具体分析。

标签:协议,调用,服务,区别,接口,RPC,HTTP
From: https://www.cnblogs.com/beatle-go/p/17992715

相关文章

  • APISIX同时代理websocket和http请求 websocket无法正常工作
    1.配置了一个路由同时代理websocket和http请求 2.打开了websocket支持,websocket还是无法工作  3.定位3.1通过postman分别走apisix和不经过apisix建立websocet连接,发现经过apisix也能成功建立连接,但是10秒左右就自己断开了。  3.2思考3.3决定试一下是否和超时配置有关,改一下改......
  • nuxt3:http请求时需要注意得一些地方
    前言nuxt3中获取后端数据总共有三个方法:useFetch()$fetch()useAsynData()本篇教程就针对这三个方法的使用注意事项做一个记录正文通过useFetch()方法请求这个动作,在首次加载时,只在服务端执行一次,客户端是不执行得,客户端是直接使用拿到的数据地;如果和SEO无关得数据,优先使用$fetch(......
  • go 安装grpc环境
    一:windows上安装protoc转换工具https://github.com/protocolbuffers/protobuf/releases/tag/v3.19.4 github打不开,下载个fastgithub对应版本工具目录打开运行 再次访问protoc转换工具下载地址: 找到对应版本 下载 解压,把整个目录剪切到合适位置里面目录......
  • 在K8S中,二进制与Kubeadm安装有何区别?
    在Kubernetes(K8S)的部署中,二进制安装和使用Kubeadm工具进行安装的主要区别在于复杂性和灵活性:二进制安装手动与细致:通过下载官方提供的各个组件(如kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubelet、kubectl等)的二进制文件并手动配置每个组件的方式进行......
  • 在K8S中,静态、动态、自主式Pod有何区别?
    在Kubernetes(简称K8s)中,静态Pod、自主式Pod和动态Pod是不同管理方式下的Pod类型,它们的区别主要体现在创建和管理方式上:静态Pod:静态Pod是由kubelet直接管理的,其配置文件存储在节点本地而非通过APIServer创建。kubelet会根据指定路径下的静态Pod配置文件来创建和管理Pod,这些Po......
  • gRPC vs. HTTP:网络通信协议的对比
    概述gRPC和HTTP是两种常见的网络通信协议,用于在客户端和服务器之间进行通信。它们具有不同的特点和适用场景,下面对它们进行详细比较。HTTP(HypertextTransferProtocol)特点:简单易用:HTTP使用简单的请求方法和状态码来进行通信,如GET、POST、200OK、404NotFound等。它......
  • springboot中@Repository 和 @Mapper的区别
    在springboot中他们两都是数据访问层的注解(在定义方面)@Repository:@Repository注解通常用于对DAO(DataAccessObject)组件进行标识。它告诉Spring框架,被注解的类是用于数据访问的组件,可以通过Spring的组件扫描机制自动注册为SpringBean,并且可以将底层的数据访问异......
  • 使用 certbot 通过 Let's Encrypt 申请免费证书,部署到 nginx 中,开启 https
    使用certbot可以很方便、快捷的通过Let’sEncrypt申请免费的证书,并部署到nginx中,开启https在Linux通过命令安装安装Nginxsudoaptinstallnginx安装certbot先安装snapsudoaptinstallsnap再通过snap安装certbotsudosnapinstall--classiccertb......
  • Git必知必会基础(16):git clone、git pull、git fetch、git push的区别
     gitclone没有本地仓库,将远端的整个项目下载到本地 gitpull本地已经有项目但不是最新(比如你的同事往远处仓库提交了代码),从远程获取最新版本并merge到本地,也就是将远程指定分支拉取到本地指定分支上命令格式:gitpull[远程仓库名][远程分支名]:[本地分支名]本地分支是当前分......
  • Part 2:NetOps与传统网络运营的区别
    转载在对NetOps和传统网络运营进行比较时,网络团队专注于自动化可重复的任务以纠正问题,而不是手动引入新任务。过去几年,IT语言发生了变化。以前,NetOps主要用作网络运营的简单缩写。现在,它的含义已发展为DevOps时代重新构想的网络运营,并且成为网络管理员、经理和工程师们越来越......