作者 l 会点代码的大叔(CodeDaShu)

RPC:Remote Procedure Call,中文意思就是远程过程调用。

远程是相对于本地来说的,有远程调用就有本地调用,那么先说说本地调用是什么,这个就简单了;

比如下图,我们的代码在同一个进程中(或者说同一个地址空间)调用另外一个方法,得到我们需要的结果,这就是本地调用:

那么想象一下,如果这里的add方法是一个很复杂的方法,很多系统都想用这个方法,那么我们可以把这个方法单独拆成一个服务,提供给各个系统进行调用,那么本地就会变成远程,就会变成这样:

01

RPC:让远程调用变得和本地调用一样

那么在 Server_A 中怎么调用 Server_B 中的 add 方法呢?

很多人都会想到 Server_B 封装一个接口,通过服务把这个方法暴露出去,比如通过 HTTP 请求,那么 Server_A 就可以调用 Server_B 中的 add 方法了。

通过这种方法实现起来没有问题,也是一个不错的解决方法,就是在每次调用的时候,都要发起 HTTP 请求,代码里面要写 HttpClient.sendRequest 这样的代码,那么我们有没有可能像调用本地一样,去发起远程调用呢?让程序员不知道这是调用的远程方法呢?这时候就要提到RPC了(并不是说 RPC 优于 HTTP 请求,关于这两个概念我们在下文中讨论)。

完整的RPC过程,如图:

  • 服务调用方(Client)调用以本地调用方式调用服务;

  • Client stub 负责将方法名、参数组装成消息体并进行序列化,找到服务地址,将消息发送到服务端;

  • Server stub 收到消息后进行反序列化后调用本地的服务;

  • 本地服务执行,将结果返回给 Server stub;

  • Server stub 将运行结果打包成消息序列化后,发送调用方;

  • Client stub接收到消息,并进行反序列化,调用方最终得到调用结果。

总结来说,RPC 用于服务之间的调用问题,特别是分布式环境;RPC 让远程调用时,像调用本地方法一样方便和无感知;RPC框架屏蔽了很多底层的细节,不需要开发人员关注这些细节,比如序列化和反序列化、网络传输协议的细节。

02

既然有 HTTP ,为什么还要用 RPC ?

其实,这个问题本身就是有问题的!

HTTP 和 RPC 并不是两个并行的概念,虽然很多书或文章,都介绍 HTTP 和 RPC 是在“应用层”,但实际上可以把应用层细分成多层,RPC 的所处的位置是高于 HTTP 的;HTTP 是网络协议,而RPC 可以看做是一种编程模式或实现方案;

RPC 通常包含传输协议和序列化协议,单说传输协议,RPC 可以建立在 TCP 协议之上(比如 Dubbo),也可以建立在 HTTP 协议之上(比如 gRPC);如果是基于数据形式分类,RPC 又可以分成基于二进制、XML 和 JSON 三种;

而现在非常流行的开源 RPC 框架,比如上文中提到的Dubbo 和 gRPC 分别出身于阿里和谷歌,它们更多地是封装了服务注册发现、负载均衡、链路跟踪等功能,也可以这么理解,RPC 框架是对服务更高级的封装。

03

RPC VS Restful 风格的 API

RPC:面向过程,也就是要做一件什么事情,只发送 GET 和 POST 请求;GET 用来查询信息,其他情况下一律用 POST;请求参数是动词。

RESTful:面向资源,这里的资源可以是一段文字、一个文件、一张图片,总之是一个具体的存在,可以使用 GET、POST、DELETE、PUT 请求,对应了增删查改的操作;请求参数是名词。

比如按照id 查找用户:

  • 如果是 RPC 风格的 url 应该是这样的:GET /queryUser?userid=xxx;

  • 而 RESTful 风格通常是这样的:GET /user/{userid}

当然,对于遵守接口风格这一点,我个人是保留意见的,在实际的项目开发过程中,很多时候这些接口风格过于理想化;有些东西借鉴一下可以,更多的还需要结合项目实际使用。

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:长按订阅更多精彩▼如有收获,点个在看,诚挚感谢

几张图帮你弄清楚什么是 RPC相关推荐

  1. 一张图帮你看懂 iPhone 6 Plus 的屏幕分辨率

    一张图帮你看懂 iPhone 6 Plus 的屏幕分辨率 几天前发布的 iPhone 6 Plus 官方标称屏幕是 1920 x 1080 的,但是在 Xcode 中我们发现模拟器的屏幕其实是看似奇怪 ...

  2. 几张图帮你捋清“中国金融机构体系”

    原文链接:几张图帮你捋清"中国金融机构体系" - 走看看 (zoukankan.com) 几张图帮你捋清楚,中国金融机构的关系- 金融业务有哪些? 金融业务有:银行业.证券业.保险 ...

  3. 一张图帮你记忆,Spring Boot 应用在启动阶段执行代码的几种方式

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 前言 有时候我们需要在应用启动时执行一些代码片段,这些片 ...

  4. 几张图帮你理解 docker 基本原理及快速入门

    http://hainiubl.com/topics/13 什么是docker Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Goog ...

  5. 一张图30分钟带你入门python-大数据时代来了!神级程序员一张图帮你梳理Python脉络,快速入门...

    python语言是我目前为止用的最爽的语言,因为它真的很优美.虽然c,c++,java也非常的强大和伟大,但是每一种语言伟大的背后都是有一定的时代背景. 在PC时代大量的嵌入式的设备,底层的代码,以及 ...

  6. linux 读取大量图片 内存,10 张图帮你搞定 TensorFlow 数据读取机制

    导读 在学习tensorflow的过程中,有很多小伙伴反映读取数据这一块很难理解.确实这一块官方的教程比较简略,网上也找不到什么合适的学习材料.今天这篇文章就以图片的形式,用最简单的语言,为大家详细解 ...

  7. 收藏!一张图帮你快速建立大数据知识体系

    简介: 对海量数据进行存储.计算.分析.挖掘处理需要依赖一系列的大数据技术,而大数据技术又涉及了分布式计算.高并发处理.高可用处理.集群.实时性计算等,可以说是汇集了当前 IT 领域热门流行的 IT ...

  8. [转]一张图帮你搞定职业规划

    没有规划不算人生. 美国心理学家洛克奇在1973年提出13种价值观. 成就感:美感的追求:挑战:健康:收入与财富:独立性:爱.家庭.人际关系:道德感:欢乐:权力:安全感:自我成长:协助他人. 不管你规 ...

  9. 开局一张图帮你充分理解哈希表(散列表)

    目录 1哈希表的概念: 1.1哈希表的插入图示: 1.2哈希表的查询图示: 2.哈希冲突 2.1哈希冲突的概念: 2.2避免冲突 2.2.1哈希函数设计 2.2.2负载因子的调节 3.解决冲突 3.1 ...

最新文章

  1. Twitter能为你做什么?
  2. 如何阅读 Vivado中的Timing Report
  3. 21、Java并发性和多线程-Java中的锁
  4. boost::shared_from_raw相关的测试程序
  5. 延边大学c语言题库,延边大学-SPOC官方网站
  6. ERP框架开发中的License许可验证机制设计与实现 (包含源代码下载)
  7. windows端口号速查表
  8. 深度卷积生成对抗网络(DCGAN)原理与实现(采用Tensorflow2.x)
  9. 功能强大的Server.Transfer
  10. Qt入门教程【高级控件篇】QTreeView树形视图
  11. 光滑曲线_光滑流形初步(2)——切向量与微分
  12. 任天堂switch底座带网口全新方案分享
  13. 决策树算法--C4.5算法
  14. 基于51单片机的简易计算器proteus仿真 数码管显示
  15. NuGet是什么?为什么.NET项目中会有NuGet?如何使用NuGet程序包?
  16. 题都城南庄---中华诗词-唐五代-崔护
  17. Android参考之代号、标签和版本号
  18. mysql格式化日期和时间
  19. Kubernetes安装
  20. 心理学-情感与情绪(mooc笔记)

热门文章

  1. HDU2767(强连通分量+Kosaraju算法)
  2. PTA数据结构与算法题目集(中文)7-45
  3. fastq质量值_fastq格式文件处理大全(四)
  4. html页面正则表达式,使用正则表达式计算HTML页面标记
  5. 计算机培训学校办学宗旨,西安软件科技培训学院简介
  6. phar.php error 139,composer.phar 安装出现PHP Fatal error解决办法
  7. oracle convertobject,oracle.sql進行轉換。TIMESTAMPLTZ@71d9d55b Java時間戳
  8. php json 数组 区别,PHP实战:JSON两种结构之对象和数组的理解
  9. 做完小程序项目、老板给我加了6k薪资~
  10. Nibiru Open Day,OZO 遇见 DigiArtist 国际数字艺术展