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

相关推荐
专注VB编程开发20年13 分钟前
C#全面超越JAVA,主要还是跨平台用的人少
java·c#·.net·跨平台
小信啊啊15 分钟前
Go语言切片slice
开发语言·后端·golang
阿华hhh18 分钟前
Linux系统编程(标准io)
linux·开发语言·c++
南_山无梅落31 分钟前
9.Python3集合(set)增删改查和推导式
java·开发语言
sg_knight1 小时前
拥抱未来:ECMAScript Modules (ESM) 深度解析
开发语言·前端·javascript·vue·ecmascript·web·esm
爱笑的眼睛111 小时前
超越MSE与交叉熵:深度解析损失函数的动态本质与高阶设计
java·人工智能·python·ai
程序喵大人1 小时前
推荐个 C++ 练习平台
开发语言·c++·工具推荐
全靠bug跑1 小时前
Spring Cloud OpenFeign 实战三部曲:快速集成 · 连接池优化 · 客户端抽取
java·spring boot·openfeign
阿里嘎多学长1 小时前
2025-12-16 GitHub 热点项目精选
开发语言·程序员·github·代码托管