JavaGuide知识点整理——RPC原理

何为RPC?

RPC即远程过程调用,通过名字我们就能看出RPC关注的是远程调用而非本地调用。
为什么要RPC?因为两个不同的服务器上的服务提供的方法不在一个内存空间,所以需要网络编程才能传递方法调用所需要的参数。并且方法调用的结果也需要通过网络编程来接收。但是如果我们自己手动网络编程来实现这个调用过程的话工作量是非常大的,因为我们需要考虑底层传输方式(TCP或者UDP),序列化方式等。
RPC能帮助我们做什么呢?简单来说,通过RPC可以帮助我们远程调用计算机上某个服务的方法。这个过程就像调用本地方法一样简单,并且我们不需要了解底层网络编程的具体细节。
举个例子:A,B两个服务部署在不同的机器上,服务A想调用服务B的某个方法就可以通过RPC来做。
一言蔽之:RPC的出现就是为了让你调用远程方法像调用本地方法一样简单。

RPC的原理是什么?

我们可以将整个RPC的核心功能看作是下面5个部分的实现:

  1. 客户端(服务消费端):调用远程方法的一端。
  2. 客户端Stub(桩):这其实就是一个代理类。代理类主要做的事情很简单,就是把你调用方法,类,方法参数等信息传递到服务端。
  3. 网络传输:网络传输就是你要把你调用的方法的信息比如说参数这些东西传输到服务端,然后服务端执行完之后再把返回结果通过网络传输给你传输回来。网络传输的实现方式有很多种,比如最基本的Socket或者性能以及封装更加优秀的Netty.
  4. 服务端Stub(桩):这个桩就不是代理类的,实际指的就是接收到客户端执行方法的请求后,去指定对应的方法返回结果给客户端的类。
  5. 服务端(服务提供端):提供远程方法的一端。
RPC原理图

简单来讲:

  1. 客户端以本地调用的方式调用远程服务。
  2. 客户端Stub接收到调用后负责将方法,参数等组装成能够进行网络传输的消息体(序列化):RpcRequest
  3. 客户端找到远程服务的地址,并将消息发送到服务端
  4. 服务端Stub收到消息将消息反序列化成java对象。
  5. 服务端Stub根据对象中的类,方法,方法参数等信息调用本地的方法
  6. 服务端Stub等到方法的执行结果并组装成能够进行网络传输的消息体,序列化后发送给客户端
  7. 客户端Stub收到消息并反序列化成java对象。这样就得到了最终的结果。

有哪些常见的RPC框架?

我们这里说的RPC框架指可以让客户端直接调用服务端方法,就像调用本地方法一样简单的框架,比如下面说的Dubbo,Motan,gRPC这些。如果需要和HTTP协议打交道,解封和封装HTTP请求和响应,这种框架并不能算RPC框架,比如Feign。

Dubbo

Apache Dubbo是一款微服务框架,为大规模微服务实践提供高性能RPC通信,流量治理,可观测性等解决方案,涵盖Java,Golang等多种语言SDK实现。

Motan

Motan是新浪微博开源的一款RPC框架。据说在新浪微博正支撑着千亿次调用。不过好像市面上很少有公司使用。
很多人喜欢拿Dubbo和Motan作比较,但是Motan更像是一个精简版的Dubbo,可能是借鉴了Dubbo的思想,Motan的设计更加精简,功能更加纯粹。
不过不推荐实际项目中使用Motan,因为Dubbo的社区活跃度以及生态都要好得多。

gRPC

gRPC是Google开源的一个高性能,通用的RPC框架。其主要是面向移动应用开发并基于HTTP/2协议标准而设计的。基于ProtoBuf序列化协议开发,并支持众多开发语言。
何谓 ProtoBuf? 它是一种更加灵活、高效的数据格式,可用于通讯协议、数据存储等领域,基本支持所有主流编程语言且与平台无关。不过,通过 ProtoBuf 定义接口和数据类型还挺繁琐的,这是一个小问题。
据说Dubbo-go 3.0主要是借鉴了gRPC。
不过gRPC的设计导致其几乎没有服务治理功能。如果想要解决这个问题还要依赖于其它组件。

Thrift

Apache Thrift 是 Facebook 开源的跨语言的 RPC 通信框架,目前已经捐献给 Apache 基金会管理,由于其跨语言特性和出色的性能,在很多互联网公司得到应用,有能力的公司甚至会基于 thrift 研发一套分布式服务框架,增加诸如服务注册、服务发现等功能。
Thrift支持多种不同的编程语言,包括C++、Java、Python、PHP、Ruby等(相比于 gRPC 支持的语言更多 )。

总结

gRPC和Thrift虽然支持跨语言的RPC调用,但是他们只提供了最基本的RPC框架功能,缺乏一系列配套的服务化组件和服务化治理功能的支持。
Dubbo不论是功能完善程度,生态系统还是社区活跃度来说都是最优秀的。而且Dubbo在国能还有很多成功的案例,比如当当网,滴滴等,是一款成熟稳定的RPC框架。最重要的是参考资料多,学习成本相对低。


dubbo生态系统

dubbo也是Spring Cloud Alibaba里的一个组件。


image.png

但是dubbo和motan主要是给java语言使用,虽然目前能兼容部分语言,但是不太推荐,跨语言的话,可以考虑gRPC。

本篇笔记就记到这里,如果稍微帮到你了记得点个喜欢点个关注。最近这几章侧重于一些理论和现有的轮子,其实说有用吧,工作中几乎用不到。但是说没用吧,我们可以借助原理去更好的理解这个工具,而且实现的方式也可以开拓我们的思路。总之所学即所得,也祝大家工作顺顺利利!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容