既然有http请求,为什么还要用rpc调用?

Java程序员老张 Java程序员老张     2023-04-03     257

关键词:

先弄明白什么是RPC。

RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

有多种 RPC模式和执行。最初由 Sun 公司提出。IETF ONC 宪章重新修订了 Sun 版本,使得 ONC RPC 协议成为 IETF 标准协议。现在使用最普遍的模式和执行是开放式软件基础的分布式计算环境(DCE)。

这个解释挺复杂的,但是我们可以简单的理解一下,毕竟,现在已经不是以前那个年代了。

还是先来看一下,没有PRC的时候,会怎么样。

在过去是这样的,包括现在很多对企业服务可能也是这样的,只有一个包部署在Tomcat里。

那个时候,没什么需要用到RPC的场景。

然后当用户量大的时候呢?渐渐出现了负载均衡。

大概是这个样子。

负载均衡能解决的问题很多,但是还是不够好,比如说,只是某一个功能模块(假设是用户中心)被访问的次数特别频繁,我可不可以把这部分内容单独拿出去?用户中心的机器独立,给它单独的带宽,给他单独的服务器,给他单独的数据库?

不这么干其他的功能模块都干不下去了啊。

好比是原来是学校餐厅,可以同时供200个人用餐,但是修真院的饺子馆生意特别好,每次来吃饭的人都有5000人,占满了所有餐椅,排队几万米,餐厅的其他摊位肯定不乐意了吧?

比如说那个卖炒菜的,虽然我每天只有30来个人吃饭,那也是钱啊,你人这么多,想来我这边吃饭的人都找不着了。

大概的情景应该是这样的。

能理解么?

遇到这种场景怎么办?不可能不让修真院饺子馆开门啊,那最好的方式就是:

你可不可以搬出去?

你不搬我们搬也行!(哭泣脸,反正我们是再也不要和你家饺子馆开在一起了,必须给我们一个说法)

那么,搬家之后的样子可能是这样的。

嗯啊。分是分开了,然后餐卡什么的还是在一起,还是和其他摊位一样,给大家提供就餐的功能。这就是分而治之,哪怕你修真院饺子馆关门了,也不影响我,这又叫分布式。

说到分布式,就问题就来了。

可不可以互相调用?其实细分下去,买菜,切菜,结账这些都是独立的流程,我们能不能都把它们独立出来?

当然是可以的,但是带来的问题就是,如何通信?大家都不在一个进程里。

这种通信的方式,就叫做RPC,在今天,RPC已经不仅仅是远程,这个远程,确切来说,就是指不在一个进程内,只能通过其他协议来完成,通常都是TCP或者是Http。

好了,RPC讲清楚了,再看RPC的重点是什么。

不能太慢,对不对?如果太慢了,怎么办?

这种性能的要求,要做到什么程度?希望是和在同一个进程里,一致的体验。

Http能做到这种程度么?

不行。Http本身的三次握手协议,就会带来大概1MS的延迟(emmm,这个数据其实我有点不确定了,也可能是几微秒,很早之前做过测试)。

一般的场景下,没什么问题,但是对于Google这种级别的公司,他们接受不了。

几MS的延迟可能就导致多出来几万台服务器,所以他们想尽办法去优化,优化从哪方面入手?

1.减少传输量。

2.简化协议。

Http的协议就注定了,在高性能要求的下,不适合用做线上使用的通信协议。

而常见的几种高效的协议有:protocolBuffer,Thrift,Hessian,RMI等。

所以再回到题主的问题上面,为什么不使用http?

因为有些场景下极限的追求,是普通人一生都难达到的境界啊。

既然有http协议,为什么还要有rpc(代码片段)

...PC协议,当时就很懵,我HTTP协议用的好好的,为什么还要用RPC协议?于是就到网上去搜。不少解释显得非常官方,我相信大家在各种平台上也都看到过,解释了又好像没解释,都在用一个我们不认识的... 查看详情

微服务http与rpc

...聊起使用纯裸TCP会有什么问题HTTP和RPC那既然有RPC了,为什么还要有HTTP呢?HTTP和RPC有什么区别服务发现底层连接形式传输的内容为什么既然有了HTTP2,还要有RPC协议?总结从TCP聊起作为一个程序员,假设我们需... 查看详情

微服务http与rpc

...聊起使用纯裸TCP会有什么问题HTTP和RPC那既然有RPC了,为什么还要有HTTP呢?HTTP和RPC有什么区别服务发现底层连接形式传输的内容为什么既然有了HTTP2,还要有RPC协议?总结从TCP聊起作为一个程序员,假设我们需... 查看详情

微服务http与rpc

...聊起使用纯裸TCP会有什么问题HTTP和RPC那既然有RPC了,为什么还要有HTTP呢?HTTP和RPC有什么区别服务发现底层连接形式传输的内容为什么既然有了HTTP2,还要有RPC协议?总结从TCP聊起作为一个程序员,假设我们需... 查看详情

既然有http协议,为什么还要有rpc(代码片段)

...PC协议,当时就很懵,我HTTP协议用的好好的,为什么还要用RPC协议?于是就到网上去搜。不少解释显得非常官方,我相信大家在各种平台上也都看到过,解释了又好像没解释,都在用一个我们不认识的... 查看详情

rpc(二)

...断开的开销。那TCP就不用建立和断开了吗?HTTP有长连接为什么还要连接池?HTTP1.1队首阻塞怎么解决?回归RPC,既然SpringCloudfeign采用了HTTP1.1进行了传输,那它是怎么缓解对头阻塞的?Feign的HTTP客户端支持三种框架:HttpURLConnection... 查看详情

有了http,为什么还要rpc?

很长时间以来都没有怎么好好搞清楚RPC(即RemoteProcedureCall,远程过程调用)和HTTP调用的区别,不都是写一个服务器然后在客户端调用么?这里请允许我迷之一笑~Naive!本文简单地介绍一下两种形式的C/S架... 查看详情

rpc核心原理

...流程前文提及,RPC的作用是完成远程调用,我们将发起调用请求的那一方叫做调用方,被调用的叫做服务提供方,为了实现远程调用,一个完整的RPC会涉及哪些步骤呢?RPC需要通过网络传输数据,并且通常用于系统之间的交互,所以需要保... 查看详情

如何设计可向后兼容的rpc协议

...属于应用层协议。1HTTP协议浏览器收到命令后会封装一个请求,并把请求发送到DNS解析出来的IP上,抓包:2协议的作用没有协议就不能通信吗?只有二进制才能在网络中传输,所以RPC请求在发送到网络中之前,他需要把方法调用... 查看详情

rpc通信原理

...访问权限管理等功能。网络协议和网络IO模型对其透明:既然RPC的客户端认地对象。那么传输层使用的是TCP/UDP还是HTTP协议,又或络协议它就不需要关心了。既然网络对其透明,那么调哪一种网络IO模型调用者也不需要关心。信息... 查看详情

grpc详解(代码片段)

...r/client模型,那么我们直接用restfulapi不是也可以满足吗,为什么还需要RPC呢?下面我们就来看看RPC到底有哪些优势gRPCvs.RestfulAPIgRPC和restfulAPI都提供了一套通信机制,用于server/client模型通信,而且它们都使用http作为底层的传输协... 查看详情

有了http,为什么还要rpc?

点击关注公众号,实用技术文章及时了解本文简单地介绍一下两种形式的C/S架构,先说一下他们最本质的区别,就是RPC主要是基于TCP/IP协议的,而HTTP服务主要是基于HTTP协议的。我们都知道HTTP协议是在传输层协议T... 查看详情

rpc和http有哪些区别?通信协议网络模型服务治理框架...(代码片段)

...通信协议、网络模型、服务治理框架…之前有小朋友问RPC请求和HTTP请求有什么区别?公司里服务之间使用RPC、对外服务的接口用HTTP、跨语言服务交互的时候用基于HTTP的RPC…很多场景使 查看详情

rpc和http有哪些区别?通信协议网络模型服务治理框架...(代码片段)

...通信协议、网络模型、服务治理框架…之前有小朋友问RPC请求和HTTP请求有什么区别?公司里服务之间使用RPC、对外服务的接口用HTTP、跨语言服务交互的时候用基于HTTP的RPC…很多场景使 查看详情

从0到1:全面理解rpc远程调用

...,带着这两个问题再往下看:1、RPC和REST区别是什么?2、为什么要采用RPC呢?首先,第一个问题:RPC和REST区别是什么?你一定会觉得这个问题很奇怪,是的,包括我,但是你在网络上一搜,会发现类似对比的文章比比皆是,我... 查看详情

既然我们已经有了 StringBuilder,为啥还要使用 StringJoiner?

...inerwhenwealreadyhaveStringBuilder?既然我们已经有了StringBuilder,为什么还要使用StringJoiner?【发布时间】:2015-02-1519:44:39【问题描述】:我最近遇到了一个Java8类StringJoiner,它使用分隔符添加字符串并为其添加前缀和后缀,但我 查看详情

编程知识:既然已经有数组了,为什么还要链表?(代码片段)

对于不少开发者而言,链表(linkedlist)这种数据结构既熟悉又陌生,熟悉是因为它确实是非常基础的数据结构,陌生的原因是我们在业务开发中用到它的几率的确不大。在很多情况下,我们用数组就能很好的完成工... 查看详情

既然有mysql了,为什么还要有mongodb?

大家好,我是哪吒,最近项目在使用MongoDB作为图片和文档的存储数据库,为啥不直接存MySQL里,还要搭个MongoDB集群,麻不麻烦?让我们一起,一探究竟,了解一下MongoDB的特点和基本用法,​​实现快速入门,丰富个人简历,提... 查看详情