分布式微服务--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 实现底层通信。

相关推荐
2601_962071572 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
zww89491112 小时前
酒馆预约系统开发实战:从需求分析到上线全流程指南
java·eclipse
淡海水3 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
CS_Zero4 小时前
C语言sizeof是函数吗?
c语言·开发语言
东风破_4 小时前
从跨域到 WebSocket:前端跨域方案、SSE 与双向实时通信详解
前端·后端
-今昭-4 小时前
《V2V 迁移实战:将 VMware 虚拟机转为 OpenStack 可用 Glance qcow2 镜像》
开发语言·python
zww89491115 小时前
匿名树洞系统开发实战:从需求分析到部署指南
java·eclipse
行百里er5 小时前
Gateway 上别硬塞 MVC:DeferredImportSelector 看菜下锅
spring boot·后端·开源
名字还没想好☜5 小时前
Java 遍历时删元素抛 ConcurrentModificationException:fail-fast 原理与三种正确删法
后端
IT_陈寒6 小时前
React Hooks闭包陷阱差点让我加班到凌晨
前端·人工智能·后端