当前位置: 首页 > news >正文

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

一、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 有啥区别?

✅ 本质区别:层级不同

对比项HTTPRPC
是什么一种网络协议(通信通道)一种远程调用机制(通信模式)
本质传输数据用的协议封装调用远程方法的方式
谁用谁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 实现底层通信。

http://www.dtcms.com/a/303865.html

相关文章:

  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-43,(知识点:晶体管、复合管、达林顿管)
  • 【iOS】类扩展与关联对象
  • 时序数据库选型指南:为什么IoTDB正在重新定义工业大数据规则?
  • 谷歌采用 Ligero 构建其 ZK 技术栈
  • QML 3D曲面图(Surface3D)技术
  • p5.js 从零开始创建 3D 模型,createModel入门指南
  • Adv. Sci. 前沿:非零高斯曲率3D结构可逆转换!液晶弹性体多级形变新策略
  • VSCode使用Code Runner运行C/C++输出[Done] exited with code=0 in xxx seconds
  • Marin说PCB之POC电路layout设计仿真案例---10
  • 机械学习--线性回归---三个小案例
  • p5.js 矩形rect绘制教程
  • Ubuntu环境下搭建CUDA编程环境
  • Charles中文版使用指南:如何利用抓包工具优化API调试与网络性能
  • Ubuntu20.04安装和配置Samba实现Win11下共享文件夹
  • 「源力觉醒 创作者计划」 百度AI的战略“惊蛰”,一场重塑格局的“破壁行动”
  • 深度学习篇---百度AI Studio模型
  • 2411.按位或最大的最小子数组长度
  • 服务器中涉及节流(Throttle)的硬件组件及其应用注意事项
  • 服务器分布式的作用都有什么?
  • 《Java 程序设计》第 9 章 - 内部类、枚举和注解
  • ClickHouse MergeTree引擎:从核心架构到三级索引实战
  • C++实现黑板模式操作
  • 怎么提升服务器的防攻击能力!
  • 异地协同新玩法!Docker+Neko+cpolar打造云端共享浏览器
  • Sea AI Lab万信逸博士:大模型训练流水线并行四部曲:吞吐、内存、负载均衡与线性扩展
  • 专业Python爬虫实战教程:逆向加密接口与验证码突破完整案例
  • C 语言指针深度解析:从数组指针到指针函数的实战指南
  • 【21】C# 窗体应用WinForm ——图片框PictureBox属性、方法、实例应用
  • 重生之我在暑假学习微服务第四天《Docker-下篇》
  • Intellij Idea--解决Cannot download “https://start.spring.io‘: Connect timedout