风韵人生 發表於 2025-9-4 11:07:00

在国企干了 5 年 Java,居然不知道 RPC?这正常吗?

<p class="md-end-block md-heading"><span class="md-plain">在国企干了 5 年 Java,居然不知道 RPC 是什么?这正常吗?</span></p>
<p class="md-end-block md-p"><span class="md-plain">这很正常。</span></p>
<p class="md-end-block md-p"><span class="md-plain">如果你没接触过分布式微服务项目,基本是接触不到 RPC 这玩意的,并不是个人能力的问题。</span></p>
<p class="md-end-block md-p"><span class="md-plain">不过 RPC 是程序员需要掌握的知识,也是面试官可能会问的题目。</span></p>
<p class="md-end-block md-p"><span class="md-plain">什么是 RPC?RPC 和 HTTP 有什么区别?</span></p>
<p class="md-end-block md-p"><span class="md-plain">下面用 2 分钟给大家讲清楚!</span></p>
<p class="md-end-block md-p">&nbsp;</p>
<p class="md-end-block md-p">&nbsp;</p>
<h2 class="md-end-block md-heading"><span class="md-plain">什么是 RPC?</span></h2>
<p class="md-end-block md-p"><span class="md-plain">你饿了,想吃鱼皮。</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://pic.yupi.icu/1/image-20250903155307719.png"><img src="https://pic.yupi.icu/1/image-20250903155307719.png"></span></p>
<p class="md-end-block md-p">&nbsp;</p>
<p class="md-end-block md-p"><span class="md-plain">如果是在 20 年前,你只能自己吭哧吭哧跑到店里去买。</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://pic.yupi.icu/1/1756884355995-810c8c20-bb39-4f55-8472-9b42abad7fdc.png"><img src="https://pic.yupi.icu/1/1756884355995-810c8c20-bb39-4f55-8472-9b42abad7fdc.png"></span></p>
<p class="md-end-block md-p">&nbsp;</p>
<p class="md-end-block md-p"><span class="md-plain">但现在有了手机、网络和外卖平台,你只需要在家动动手指点个外卖,骑手就能直接把鱼皮配送到家。</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://pic.yupi.icu/1/1756884402212-f9fc73c0-5567-4080-b475-526998f931fb.png"><img src="https://pic.yupi.icu/1/1756884402212-f9fc73c0-5567-4080-b475-526998f931fb.png"></span></p>
<p class="md-end-block md-p">&nbsp;</p>
<p class="md-end-block md-p"><span class="md-plain">你不需要关注网络是怎么传输的、平台是怎么操作的、骑手是怎么配送的,只负责享受鲜嫩多汁、丝滑爽口的鱼皮就行了。</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://pic.yupi.icu/1/1756884423441-764151a4-ce22-4d8c-8896-4fa50e685d7d.png"><img src="https://pic.yupi.icu/1/1756884423441-764151a4-ce22-4d8c-8896-4fa50e685d7d.png"></span></p>
<p class="md-end-block md-p">&nbsp;</p>
<p class="md-end-block md-p"><span class="md-plain">这个过程其实就是 RPC 的核心思想。</span></p>
<p class="md-end-block md-p"><span class="md-plain">RPC 的全称是远程过程调用(Remote Procedure Call),允许一个项目 <span class="md-pair-s "><strong>像调用自己本地的方法一样</strong><span class="md-plain">,调用另一个远程项目的接口,而不需要了解数据的传输处理过程和底层网络通信的细节。</span></span></span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://pic.yupi.icu/1/1756884491153-397c0204-396a-47b1-a121-1ea821f18903.png"><img src="https://pic.yupi.icu/1/1756884491153-397c0204-396a-47b1-a121-1ea821f18903.png"></span></p>
<p class="md-end-block md-p">&nbsp;</p>
<p class="md-end-block md-p"><span class="md-plain">举个例子,项目 A 提供了点餐服务,项目 B 想要调用它完成下单。</span></p>
<p class="md-end-block md-p"><span class="md-plain">如果没有 RPC 框架,项目 B 作为服务消费者,需要找到项目 A 的地址、自己构造请求参数、给项目 A 发送请求并解析响应结果。</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://pic.yupi.icu/1/1756884555229-f22ab401-3e20-48b6-a683-534421173833.png"><img src="https://pic.yupi.icu/1/1756884555229-f22ab401-3e20-48b6-a683-534421173833.png"></span></p>
<p class="md-end-block md-p">&nbsp;</p>
<p class="md-end-block md-p"><span class="md-plain">如果项目 B 要调用很多第三方服务,每个都这么写,是不是很麻烦?</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://pic.yupi.icu/1/1756884599777-047b5a74-8d92-436c-b936-ae10ef85a9c9.png"><img src="https://pic.yupi.icu/1/1756884599777-047b5a74-8d92-436c-b936-ae10ef85a9c9.png"></span></p>
<p class="md-end-block md-p">&nbsp;</p>
<p class="md-end-block md-p"><span class="md-plain">但如果使用 RPC 框架,只需要一行代码就能完成调用!</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://pic.yupi.icu/1/1756884685228-4c8b55d9-c506-45c0-9c6d-ee5835101276.png"><img src="https://pic.yupi.icu/1/1756884685228-4c8b55d9-c506-45c0-9c6d-ee5835101276.png"></span></p>
<p class="md-end-block md-p">&nbsp;</p>
<p class="md-end-block md-p"><span class="md-plain">看起来就跟调用自己项目内的方法没有任何区别!是不是很丝滑?</span></p>
<p class="md-end-block md-p"><span class="md-plain">这就是 RPC 框架的作用,<span class="md-pair-s "><strong>隐藏了服务调用的通信细节,让程序员专注于业务逻辑</strong><span class="md-plain">,快速开发分布式、微服务系统。</span></span></span></p>
<p class="md-end-block md-p">&nbsp;</p>
<h2 class="md-end-block md-heading"><span class="md-plain">RPC 和 HTTP 的区别?</span></h2>
<p class="md-end-block md-p"><span class="md-plain">有同学会问了:“HTTP 协议不也能请求别的服务么,RPC 跟 HTTP 有什么区别呢?”</span></p>
<p class="md-end-block md-p"><span class="md-plain">首先,HTTP 是一种网络通信协议,而 RPC 是一种 “远程调用本地化” 的思想,就像我想吃饭的时候,点外卖找个骑手帮我送,至于骑手是谁、从哪找到骑手、骑手是开车还是骑电动车,可以有不同的选择。</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://pic.yupi.icu/1/1756884753655-ef5c6c50-daa0-46da-b5ba-b520d377cf1f.png"><img src="https://pic.yupi.icu/1/1756884753655-ef5c6c50-daa0-46da-b5ba-b520d377cf1f.png"></span></p>
<p class="md-end-block md-p">&nbsp;</p>
<p class="md-end-block md-p"><span class="md-plain">因此,RPC 完全可以 <span class="md-pair-s "><strong>基于 HTTP 协议来实现数据的传输</strong><span class="md-plain">,只不过主流的 RPC 实现更多的使用基于 TCP 的二进制格式,传输的数据更紧凑,传输效率也更高。</span></span></span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://pic.yupi.icu/1/1756884816334-a2c468ff-ca97-4948-aaf2-790b75f7bb9d.png"><img src="https://pic.yupi.icu/1/1756884816334-a2c468ff-ca97-4948-aaf2-790b75f7bb9d.png"></span></p>
<p class="md-end-block md-p">&nbsp;</p>
<p class="md-end-block md-p"><span class="md-plain">一般来说,HTTP 适用于前端和后端的交互、<span class="md-pair-s "><strong>对外</strong><span class="md-plain"> 提供 的 RESTful API 服务;而 RPC 更适合分布式系统的服务间的 <span class="md-pair-s "><strong>内部</strong><span class="md-plain"> 通信。</span></span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://pic.yupi.icu/1/1756884836630-6f31ca1a-067b-4967-be32-d0caaa9cc44f.png"><img src="https://pic.yupi.icu/1/1756884836630-6f31ca1a-067b-4967-be32-d0caaa9cc44f.png"></span></p>
<p class="md-end-block md-p">&nbsp;</p>
<p class="md-end-block md-p"><span class="md-plain">除了数据传输外,RPC 的实现一般还需要依赖注册中心、序列化器、负载均衡、重试容错机制等等。</span></p>
<ul class="ul-list" data-mark="-">
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">注册中心:就像服务的通讯录,记录着各个服务在哪台机器上,消费者想找服务时查一下就能知道地址。</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">序列化器:相当于数据翻译官,把内存里的对象转换成能在网络上传输的格式(比如二进制),到了对方那里再翻译回去,确保双边都能看懂。</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">负载均衡:就像调度员,当多个机器都提供同一个服务时,它来决定把请求发给哪台机器,避免有的机器累死,有的机器闲着。</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">重试容错机制:备用方案,调用服务失败时会自动重试几次(比如网络卡了、宕机了),如果一直失败就用其他方法(比如返回缓存数据),不让整个系统因为一个小故障就崩溃。</span></p>
</li>
</ul>
<p class="md-end-block md-p">&nbsp;</p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://pic.yupi.icu/1/1756884973444-cbdf6817-38f0-498b-802c-6b85554733c7.png"><img src="https://pic.yupi.icu/1/1756884973444-cbdf6817-38f0-498b-802c-6b85554733c7.png"></span></p>
<p class="md-end-block md-p">&nbsp;</p>
<p class="md-end-block md-p"><span class="md-plain">完整的 RPC 框架工作流程:</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://pic.yupi.icu/1/1756885136950-8e407ed8-0dd8-4e08-a945-82c9e62d8bd2.png"><img src="https://pic.yupi.icu/1/1756885136950-8e407ed8-0dd8-4e08-a945-82c9e62d8bd2.png"></span></p>
<p class="md-end-block md-p">&nbsp;</p>
<p class="md-end-block md-p"><span class="md-plain">服务消费者和提供者都需要引入 RPC 框架:</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://pic.yupi.icu/1/1756885160119-dd0f0b12-223a-4bee-8ecd-1b081ce51808.png"><img src="https://pic.yupi.icu/1/1756885160119-dd0f0b12-223a-4bee-8ecd-1b081ce51808.png"></span></p>
<p class="md-end-block md-p">&nbsp;</p>
<h2 class="md-end-block md-heading"><span class="md-plain">有哪些 RPC 框架?</span></h2>
<p class="md-end-block md-p"><span class="md-plain">听起来想实现 RPC 很复杂啊!</span></p>
<p class="md-end-block md-p"><span class="md-plain">但别担心,市面上有很多强大的 RPC 框架,比如 gRPC、Dubbo、Thrift、OpenFeign 等,几乎可以满足我们对 RPC 的一切需求。</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://pic.yupi.icu/1/1756885812626-67a6deec-a36f-4494-8500-9d2763f7863b.png"><img src="https://pic.yupi.icu/1/1756885812626-67a6deec-a36f-4494-8500-9d2763f7863b.png"></span></p>
<p class="md-end-block md-p"><span class="md-plain">你们更喜欢用哪个框架呢?</span></p>
<p class="md-end-block md-p"><span class="md-plain">个人建议,对于 Java 开发者来说,首选 Dubbo。</span></p>
<p class="md-end-block md-p">&nbsp;</p>
<h2 class="md-end-block md-heading"><span class="md-plain">开源项目</span></h2>
<p class="md-end-block md-p"><span class="md-plain">我之前带大家手写过一套 <span class="md-meta-i-cmd-link"><span class="md-plain">RPC 框架</span><span class="md-plain"> 并且完全开源,感兴趣的同学可以来学习~</span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain">开源仓库:<span class="md-link md-pair-s">https://github.com/liyupi/yu-rpc</span></span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://pic.yupi.icu/1/1755759375063-3199cc3f-eb02-4bab-a277-861d4d6d6231.png"><img src="https://pic.yupi.icu/1/1755759375063-3199cc3f-eb02-4bab-a277-861d4d6d6231.png"></span></p>
<p class="md-end-block md-p">&nbsp;</p>
<p class="md-end-block md-p"><span class="md-plain">OK 以上就是本期分享,还有疑问的话欢迎大家在评论区留言,没疑问的话求个点赞三连 🌹👨🏻‍💻🧑🏻‍🦲</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://pic.yupi.icu/1/1755760102207-f17f9d5b-b180-42fc-ad0f-bd2a4797044b.png"><img src="https://pic.yupi.icu/1/1755760102207-f17f9d5b-b180-42fc-ad0f-bd2a4797044b.png"></span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">更多编程学习资源</span></h2>
<ul class="ul-list" data-mark="-">
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-meta-i-cmd-link"><span class="md-plain">Java前端程序员必做项目实战教程+毕设网站</span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-meta-i-cmd-link"><span class="md-plain">程序员免费编程学习交流社区(自学必备)</span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-meta-i-cmd-link"><span class="md-plain">程序员保姆级求职写简历指南(找工作必备)</span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-meta-i-cmd-link"><span class="md-plain">程序员免费面试刷题网站工具(找工作必备)</span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-meta-i-cmd-link"><span class="md-plain">最新Java零基础入门学习路线 + Java教程</span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-meta-i-cmd-link"><span class="md-plain">最新Python零基础入门学习路线 + Python教程</span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-meta-i-cmd-link"><span class="md-plain">最新前端零基础入门学习路线 + 前端教程</span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-meta-i-cmd-link"><span class="md-plain">最新数据结构和算法零基础入门学习路线 + 算法教程</span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-meta-i-cmd-link"><span class="md-plain">最新C++零基础入门学习路线、C++教程</span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-meta-i-cmd-link"><span class="md-plain">最新数据库零基础入门学习路线 + 数据库教程</span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-meta-i-cmd-link"><span class="md-plain">最新Redis零基础入门学习路线 + Redis教程</span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-meta-i-cmd-link"><span class="md-plain">最新计算机基础入门学习路线 + 计算机基础教程</span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-meta-i-cmd-link"><span class="md-plain">最新小程序入门学习路线 + 小程序开发教程</span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-meta-i-cmd-link"><span class="md-plain">最新SQL零基础入门学习路线 + SQL教程</span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-meta-i-cmd-link"><span class="md-plain">最新Linux零基础入门学习路线 + Linux教程</span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-meta-i-cmd-link"><span class="md-plain">最新Git/GitHub零基础入门学习路线 + Git教程</span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-meta-i-cmd-link"><span class="md-plain">最新操作系统零基础入门学习路线 + 操作系统教程</span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-meta-i-cmd-link"><span class="md-plain">最新计算机网络零基础入门学习路线 + 计算机网络教程</span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-meta-i-cmd-link"><span class="md-plain">最新设计模式零基础入门学习路线 + 设计模式教程</span></span></p>
</li>
<li class="md-list-item md-focus-container">
<p class="md-end-block md-p md-focus"><span class="md-meta-i-c md-link md-expand"><span class="md-plain">最新软件工程零基础入门学习路线 + 软件工程教程</span></span></p>
</li>
</ul><br><br>
来源:https://www.cnblogs.com/yupi/p/19073125
頁: [1]
查看完整版本: 在国企干了 5 年 Java,居然不知道 RPC?这正常吗?