分布式微服务--RPC:原理、使用方式、与 HTTP/REST 的区别与选择

一、RPC 到底是什么?

RPC(Remote Procedure Call)= 远程过程调用

📌 定义:

让你像调用本地方法一样调用远程服务器上的方法,屏蔽底层网络通信细节。


二、类比理解

本地调用:

java 复制代码
User user = userService.getUserById(1);

这个方法就在你本地的 JVM 内存中运行,速度飞快。


RPC 调用:

java 复制代码
User user = userService.getUserById(1);

看起来一样,其实是调用远程服务器上某个服务的方法!

底层流程其实是:

  1. 把方法名、参数序列化(变成 JSON 或二进制)

  2. 发给远程服务(HTTP、TCP、gRPC 等协议)

  3. 远程服务接收并执行这个方法

  4. 把结果再返回来(反序列化)

  5. 本地方法获取结果,就像真的调用了一样!


三、你该怎么使用 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 实现底层通信。

相关推荐
小蒜学长1 小时前
springboot多功能智能手机阅读APP设计与实现(代码+数据库+LW)
java·spring boot·后端·智能手机
长路归期无望2 小时前
C语言小白实现多功能计算器的艰难历程
c语言·开发语言·数据结构·笔记·学习·算法
追逐时光者2 小时前
精选 4 款开源免费、美观实用的 MAUI UI 组件库,助力轻松构建美观且功能丰富的应用程序!
后端·.net
是大强2 小时前
stm32摇杆adc数据分析
开发语言
你的人类朋友3 小时前
【Docker】说说卷挂载与绑定挂载
后端·docker·容器
蓝莓味的口香糖3 小时前
【JS】什么是单例模式
开发语言·javascript·单例模式
间彧3 小时前
在高并发场景下,如何平衡QPS和TPS的监控资源消耗?
后端
间彧3 小时前
QPS和TPS的区别,在实际项目中,如何准确测量和监控QPS和TPS?
后端
zizisuo3 小时前
解决在使用Lombok时maven install 找不到符号的问题
java·数据库·maven
间彧4 小时前
消息队列(RocketMQ、RabbitMQ、Kafka、ActiveMQ)对比与选型指南
后端·消息队列