一、RPC 到底是什么?
RPC(Remote Procedure Call)= 远程过程调用
📌 定义:
让你像调用本地方法一样调用远程服务器上的方法,屏蔽底层网络通信细节。
二、类比理解
本地调用:
javaUser user = userService.getUserById(1);
这个方法就在你本地的 JVM 内存中运行,速度飞快。
RPC 调用:
javaUser user = userService.getUserById(1);
看起来一样,其实是调用远程服务器上某个服务的方法!
底层流程其实是:
把方法名、参数序列化(变成 JSON 或二进制)
发给远程服务(HTTP、TCP、gRPC 等协议)
远程服务接收并执行这个方法
把结果再返回来(反序列化)
本地方法获取结果,就像真的调用了一样!
三、你该怎么使用 RPC?
你不会手写那么多通信逻辑,你要用 RPC 框架。比如:
RPC 框架 使用方式 协议/底层传输方式 Dubbo 基于注解或接口 TCP、HTTP2 等 gRPC 定义 .proto
文件生成代码HTTP2 + Protobuf Spring Cloud OpenFeign 用注解声明接口 HTTP + RESTful
✅ 示例:用 OpenFeign 实现 RPC
服务提供方(用户服务)
java@RestController @RequestMapping("/user") public class UserController { @GetMapping("/{id}") public User getUser(@PathVariable Long id) { return new User(id, "张三"); } }
服务调用方(订单服务)
java@FeignClient("user-service") public interface UserClient { @GetMapping("/user/{id}") User getUser(@PathVariable("id") Long id); } // 使用 User user = userClient.getUser(1L);
你看起来就是调用
getUser(1L)
,这就是 RPC。
四、RPC 和 HTTP 有啥区别?
✅ 本质区别:层级不同
对比项 HTTP RPC 是什么 一种网络协议(通信通道) 一种远程调用机制(通信模式) 本质 传输数据用的协议 封装调用远程方法的方式 谁用谁 RPC 框架可能用 HTTP 作为传输协议 HTTP 并不关心你是不是 RPC 开发体验 手动写 URL、参数、解析响应 就像调用本地接口一样 序列化方式 通常是 JSON、XML(可读性好) 可以是二进制(高性能) ✅ 举个例子:
场景 HTTP 调用 RPC 调用(如 Dubbo) 你写的代码 httpClient.get("/user?id=1")
userService.getUserById(1)
是否自动发现服务 ❌ 你写死了地址 ✅ 框架会自动注册和发现服务 是否自动序列化 ❌ 你自己拼 JSON ✅ 框架自动处理参数和返回值 性能 一般(文本传输) 高(多用二进制+TCP)
五、那我该怎么选择用 RPC 还是 HTTP?
场景 推荐用 理由 前端调用后端服务 HTTP/REST(用 Spring MVC) 简单直观,浏览器支持 服务与服务之间通信(微服务) RPC(如 Dubbo、gRPC、Feign) 开发方便、性能好 跨语言服务通信(如 Java↔Go) gRPC 高性能,支持多语言 需要调试方便、开放接口给第三方 RESTful API + Swagger 直观、通用
六、总结一句话
RPC 是一种远程调用机制,它隐藏了 HTTP 或 TCP 这些通信细节,让你像调用本地函数一样调用远程服务,而 HTTP 是一种通信协议,RPC 框架有可能用 HTTP 实现底层通信。
分布式微服务--RPC:原理、使用方式、与 HTTP/REST 的区别与选择
你我约定有三2025-07-30 12:28
相关推荐
OKkankan40 分钟前
string类的模拟实现fouryears_234173 小时前
适配器模式——以springboot为例好好研究3 小时前
使用JavaScript实现轮播图的自动切换和左右箭头切换效果汽车功能安全啊4 小时前
利用对称算法及非对称算法实现安全启动paopaokaka_luck4 小时前
基于Spring Boot+Vue的吉他社团系统设计和实现(协同过滤算法)Flobby5295 小时前
Go语言新手村:轻松理解变量、常量和枚举用法nbsaas-boot6 小时前
SQL Server 窗口函数全指南(函数用法与场景)东方佑6 小时前
递归推理树(RR-Tree)系统:构建认知推理的骨架结构Warren986 小时前
Java Stream流的使用伍哥的传说6 小时前
Radash.js 现代化JavaScript实用工具库详解 – 轻量级Lodash替代方案