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

发布于:2025-07-30 ⋅ 阅读:(27) ⋅ 点赞:(0)

一、RPC 到底是什么?

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

📌 定义:

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


二、类比理解

本地调用:

User user = userService.getUserById(1);

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


RPC 调用:

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

服务提供方(用户服务)

@RestController
@RequestMapping("/user")
public class UserController {
    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        return new User(id, "张三");
    }
}

服务调用方(订单服务)

@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 实现底层通信。


网站公告

今日签到

点亮在社区的每一天
去签到