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

相关推荐
程序员cxuan18 小时前
Loop 还没玩明白,Graph Engineering 又火了。
人工智能·后端·程序员
龙虾PRO18 小时前
能源与股票量化核心差异,AI全链路落地实操手册
java·面试·职场和发展
Marst Code18 小时前
Python 3.9 已停止维护!从 3.9 到 3.14 全版本深度对比,生产环境该选哪个?
开发语言·python
llwszx18 小时前
【Java/Go后端手撸原生Agent(第九篇):Plan-and-Execute规划模式——从“走一步看一步“到“先谋后动“】
java·python·golang·agent开发·plan模式·规划执行模式
ZJH__GO18 小时前
网络编程v2--多客户端互通
java·运维·服务器·开发语言·计算机网络
uzong18 小时前
把一面面试总结做成一个 Skill:重复的事,就别每次都重写
后端·面试
霸道流氓气质19 小时前
SpringBoot中基于 AES-GCM + KMS 密钥管理的数据加解密 Starter 实践
java·数据库·spring boot
ZENERGY-众壹19 小时前
跨品牌逆变器升级:华为锦浪德业 API 对接的 7 个坑
分布式·华为·数据归一化·光伏运维·逆变器api
Gofarlic_OMS19 小时前
NX浮动许可调度黑名单机制,对比两款谁更合理
java·大数据·运维·开源·制造
万岳科技系统开发19 小时前
智慧医院小程序开发推动医疗服务流程全面线上化
大数据·开发语言·人工智能