一、七层网络结构模型:

我们先来了解一下OSI的七层网络结构模型(虽然实际应用中基本上都是五层),它可以分为以下几层: (从上到下)

  • 第一层:应用层。定义了用于在网络中进行通信和传输数据的接口;
  • 第二层:表示层。定义不同的系统中数据的传输格式,编码和解码规范等;
  • 第三层:会话层。管理用户的会话,控制用户间逻辑连接的建立和中断;
  • 第四层:传输层。管理着网络中的端到端的数据传输;
  • 第五层:网络层。定义网络设备间如何传输数据;
  • 第六层:链路层。将上面的网络层的数据包封装成数据帧,便于物理层传输;
  • 第七层:物理层。这一层主要就是传输这些二进制数据。

实际应用过程中,五层协议结构里面是没有表示层和会话层的。应该说它们和应用层合并了。我们应该将重点放在应用层和传输层这两个层面。因为HTTP是应用层协议,而TCP是传输层协议。好,知道了网络的分层模型以后我们可以更好地理解为什么RPC服务相比HTTP服务要Nice一些!

二、HTTP 服务:

其实在很久以前,我对于企业开发的模式一直定性为HTTP接口开发,也就是我们常说的RESTful风格的服务接口。的确,对于在接口不多、系统与系统交互较少的情况下,解决信息孤岛初期常使用的一种通信手段;优点就是简单、直接、开发方便。利用现成的http协议进行传输。我们记得之前实习在公司做后台开发的时候,主要就是进行接口的开发,还要写一大份接口文档,严格地标明输入输出是什么?说清楚每一个接口的请求方法,以及请求参数需要注意的事项等。比如下面这个例子:

POST http://www.test.com/restful/user/info

接口可能返回一个JSON字符串或者是XML文档。然后客户端再去处理这个返回的信息,从而可以比较快速地进行开发。但是对于大型企业来说,内部子系统较多、接口非常多的情况下,RPC框架的好处就显示出来了,首先就是长链接,不必每次通信都要像http一样去3次握手什么的,减少了网络开销;其次就是RPC框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。

三、RPC 架构:

一个完整的RPC架构里面包含了四个核心的组件,分别是Client ,Server,Client Stub以及Server Stub,这个Stub大家可以理解为存根。分别说说这几个组件:

  • 客户端(Client),服务的调用方。
  • 服务端(Server),真正的服务提供者。
  • 客户端存根,存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方。
  • 服务端存根,接收客户端发送过来的消息,将消息解包,并调用本地的方法。

四、 什么时候需要PRC:

先来看一下,没有RPC的时候,会怎么样:

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

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

然后当用户量大的时候呢?渐渐出现了负载均衡。大概是这个样子:

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

以学校餐厅举例:

学校餐厅,可以容纳500人同时就餐,但是有一家面馆,生意特别好,每到饭点来吃饭的人都有2000人,占满了餐桌,排队好几百米,餐厅的其他摊位肯定不乐意了吧?

比如那个卖水饺的,虽然每天几十个人来吃饭。那也是钱啊。你人这么多,想来我这吃饭的人都挤不进来了,

大概情景是这样的:

这样能看懂吧?

遇到这种场景怎么办?不可能不让面馆开门营业啊,那最好的方式就是:

“你可不可以搬出去?”

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

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

嗯啊。分是分开了,然后餐卡什么的还是在一起,还是和其他窗口一样,给大家提供就餐的功能。这就是分而治之,哪怕你面馆关门了,也不影响我,这又叫分布式。(“分布式”划重点)

说到分布式,就问题就来了。
可不可以互相调用?其实细分下去,买菜,切菜,结账这些都是独立的流程,我们能不能都把它们独立出来?
当然是可以的,但是带来的问题就是,如何通信?大家都不在一个进程里。
这种通信的方式,就叫做RPC,在今天,RPC已经不仅仅是远程,这个远程,确切来说,就是指不在一个进程内,只能通过其他协议来完成,通常都是TCP或者是Http。

好了,RPC讲清楚了,再看RPC的重点是什么。
不能太慢,对不对?如果太慢了,怎么办?

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

不行。Http(TCP)本身的三次握手协议,就会带来大概1MS的延迟(emmm,这个数据其实我有点不确定了,也可能是几微秒,很早之前做过测试)。
每发送一次请求,都会有一次建立连接的过程,加上Http报文本身的庞大,以及Json的庞大,都需要作一些优化。

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

几MS的延迟可能就导致多出来几万台服务器,所以他们想尽办法去优化,优化从哪方面入手?
1.减少传输量。
2.简化协议。
3.用长连接,不再每一个请求都重新走三次握手流程

Http的协议就注定了,在高性能要求的下,不适合用做线上分布式服务之间互相使用的通信协议。

对我们而言,可能是使用Http就够了~~(PS:如果真的感兴趣,可以自己测试一下不同协议之间的差别,特别是在大数据量的情况下)

五、总结

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

HTTP服务和RPC服务,如何选择相关推荐

  1. RPC 服务 与 HTTP 服务的区别

    1.什么是RPC RPC(Remote Procedure Call)-远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在,如T ...

  2. Swoft Rpc调用(一) Rpc服务初始化

    Swoft框架的初始化 Swoft初始化有六个步骤 ENV环境文件初始化 注解信息扫描收集 配置初始化 注册类到bean容器 收集事件监听器 启动console控制台,启动相应的服务 官方文档 而Rp ...

  3. 微服务难点剖析 | 服务拆的挺爽,问题是日志该怎么串联起来呢?

    现在微服务架构盛行,很多以前的单体应用服务都被拆成了多个分布式的微服务,以解决应用系统发展壮大后的开发周期长.难以扩展.故障隔离等挑战. 不过技术领域有个谚语叫--没有银弹,这句话的意思其实跟现实生活 ...

  4. 异步服务_微服务全链路异步化实践

    1. 背景 随着公司业务的发展,核心服务流量越来越大,使用到的资源也越来越多.在微服务架构体系中,大部分的业务是基于Java 语言实现的,受限于Java 的线程实现,一个Java 线程映射到一个ker ...

  5. golang python rpc_grpc - 使用 golang 带你从头撸一套 RPC 服务(一)

    gRPC 是一个高性能.开源和通用的 RPC 框架,面向移动和 HTTP/2 设计,带来诸如双向流.流控.头部压缩.单 TCP 连接上的多复用请求等特.这些特性使得其在移动设备上表现更好,更省电和节省 ...

  6. 深入理解 RPC : 基于 Python 自建分布式高并发 RPC 服务

    RPC(Remote Procedure Call)服务,也即远程过程调用,在互联网企业技术架构中占据了举足轻重的地位,尤其在当下微服务化逐步成为大中型分布式系统架构的主流背景下,RPC 更扮演了重要 ...

  7. NET Core微服务之路:自己动手实现Rpc服务框架,基于DotEasy.Rpc服务框架的介绍和集成...

    原文:NET Core微服务之路:自己动手实现Rpc服务框架,基于DotEasy.Rpc服务框架的介绍和集成 本篇内容属于非实用性(拿来即用)介绍,如对框架设计没兴趣的朋友,请略过. 快一个月没有写博 ...

  8. pe修改rpc服务器不可用,ABBYY FineReader 12出现“RPC服务不可用”怎么办

    原标题:ABBYY FineReader 12出现"RPC服务不可用"怎么办 是一款OCR图文识别软件,可快速方便地将扫描纸质文档.PDF文件和数码相机的图像转换成可编辑.可搜索的 ...

  9. 基于 Python 自建分布式高并发 RPC 服务

    RPC(Remote Procedure Call)服务,也即远程过程调用,在互联网企业技术架构中占据了举足轻重的地位,尤其在当下微服务化逐步成为大中型分布式系统架构的主流背景下,RPC 更扮演了重要 ...

最新文章

  1. MyBatis 环境搭建
  2. 枚举类型的定义与使用
  3. How to make a proposal?
  4. 基于数据库的事务消息解决分布式事务方案
  5. 日志打印出来的对象都是XXX@39ddf169这样的,怎么办?
  6. arm搭建云手机教程_教你从0开始部署阿里云服务器,阿里云服务器搭建网站教程...
  7. PAT-乙级-1034 有理数四则运算
  8. 【读书笔记】iOS-访问网络
  9. ICSharpCode.SharpZipLib实现压缩解压缩
  10. ionic3-ng4学习见闻--(多环境方案)
  11. cad帧数测试软件,怎样让cad运行速度更快_cad如何设置运行更流畅
  12. 【老骥伏枥-原创】制作黑威联通启动盘:进阶篇
  13. Java 设置图片大小
  14. 无线路由器的连接与设置
  15. 使用git中rebase遇到的坑二 could not apply xxxx
  16. Win10 功能大全
  17. 谈谈红楼梦(第1-5回)
  18. vs2019导出导入配置
  19. 乌镇AI论坛最全盘点:中国互联网半壁江山坐在了一起,他们怎么看AI
  20. 绝了!Spring事务是如何传播的?快来收藏!

热门文章

  1. Java三大特性——多态
  2. Cordova 调用微信SDK,实现微信支付、微信分享、微信登录、打开微信小程序
  3. Nod32与VS2005
  4. 【转帖]】C++资源之不完全导引 [上] [下] 原作者:曾毅 陶文
  5. 【转帖】电视分辨率与“线”
  6. 祝贺开源社理事长刘天栋先生当选为 Apache 软件基金会正式成员
  7. 快速排序每一趟的排序过程
  8. WARNING: sanitizing HTML stripped some content (see http://g.co/ng/security#xss).
  9. 谈一谈|小白如何体验人工智能项目
  10. vue获取client为0_获取clientid为null