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

RPC 与 Feign 的区别笔记

一、基本概念

1.1 RPC(Remote Procedure Call)

  • 定义:远程过程调用,允许像调用本地方法一样调用远程服务的方法。

  • 本质:跨进程通信,隐藏了底层网络通信的复杂性。

  • 常见实现

    • Java 原生 RMI
    • Dubbo、gRPC、Thrift 等
  • 特性

    • 高性能、二进制传输(如 gRPC 使用 HTTP/2 + Protobuf)
    • 自定义协议支持
    • 强依赖于服务注册中心

1.2 Feign

  • 定义:一个声明式的 Web Service 客户端,常用于 Spring Cloud 中,封装了 HTTP 请求过程。

  • 本质:对 REST 接口的封装,基于 HTTP 协议通信。

  • 特性

    • 面向接口编程
    • 使用注解声明服务接口
    • 支持负载均衡(结合 Ribbon)、熔断(结合 Hystrix 或 Resilience4j)
    • 易于与 Spring Boot 集成

二、架构层级

项目RPCFeign
通信协议通常为 TCP(二进制协议)HTTP/HTTPS(文本协议)
底层技术gRPC、Dubbo、Thrift 等Spring Cloud + HTTP Client
调用方式直接方法调用(更像本地调用)RESTful API
序列化方式Protobuf、Hessian、Thrift 等JSON(默认)/XML

三、使用对比

3.1 性能

  • RPC:二进制传输 + 长连接(如 gRPC 使用 HTTP/2)→ 高性能,适合高并发场景
  • Feign:基于 HTTP + JSON,性能相对较低,适合业务级通信

3.2 易用性

  • Feign:简单上手,注解式开发,符合 Spring Boot 编码习惯
  • RPC:通常需要定义 .proto(gRPC)或接口描述文件,部署和运维稍复杂

3.3 可读性与调试

  • Feign:基于 HTTP,可用 curl/Postman 调试;易于日志追踪
  • RPC:协议定制化强,抓包与调试门槛较高

3.4 跨语言支持

  • RPC:gRPC/Thrift 等有优秀的多语言支持(C++、Go、Python 等)
  • Feign:基于 HTTP 也支持跨语言,但缺乏协议标准化控制

四、Spring Cloud 微服务生态中的作用

组件描述
Feign实现服务间 HTTP 调用
Ribbon(已弃用)客户端负载均衡
Eureka/Nacos服务注册与发现
Hystrix熔断器,增强系统稳定性

⚠️ Spring Cloud Alibaba 推荐使用 OpenFeign + Nacos + Sentinel(替代 Hystrix)等组合。


五、典型使用场景

使用 Feign 的推荐场景

  • 企业内部微服务通信
  • 调用 REST API 接口,特别是跨系统接口
  • 要求开发快速、接口易于理解和调试

使用 RPC 的推荐场景

  • 高性能、高吞吐场景(如音视频、IoT)
  • 对传输协议和序列化方式有特殊要求
  • 多语言异构系统通信

六、代码示例对比

Feign 示例

@FeignClient(name = "user-service")
public interface UserClient {@GetMapping("/users/{id}")UserDTO getUserById(@PathVariable("id") Long id);
}

gRPC 示例(简化)

user.proto
service UserService {rpc GetUserById(UserRequest) returns (UserResponse);
}
Java 代码调用
UserRequest request = UserRequest.newBuilder().setId(1L).build();
UserResponse response = stub.getUserById(request);

七、总结表格

维度RPCFeign
协议TCP/HTTP2/自定义HTTP/HTTPS
传输格式二进制(高效)文本(JSON)
跨语言支持较好(gRPC 等)一般(基于 HTTP)
开发效率相对较低高,Spring Boot 原生支持
调试难度相对较高简单,易调试
性能中等
使用场景内部高性能服务通信微服务 REST 接口调用

八、参考链接

  • Spring Cloud OpenFeign 官方文档
  • gRPC 官方文档
  • Dubbo 官方文档
http://www.dtcms.com/a/286023.html

相关文章:

  • SQLite 数据库字段类型-详细说明,数据类型详细说明。
  • 服务器mysql数据的简单备份脚本
  • 深入浅出MyBatis缓存:如何让数据库交互飞起来
  • Agent-S:重新定义下一代 AI 智能体开发框架
  • 论文review SfM MVS VGGT: Visual Geometry Grounded Transformer
  • 【面试题】大厂高压面经实录丨第二期
  • Jmeter系列(6)-测试计划
  • 【工具变量】地级市人力资本测算数据集(1990-2024年)
  • 近期遇到的问题汇总
  • 【48】MFC入门到精通——MFC 文件读写总结 CFile、CStdioFile、CFileDialog
  • SpringCloud相关总结
  • [论文阅读] 人工智能 + 软件工程 | 单会话方法论:一种以人类为中心的人工智能辅助软件开发协议
  • oracle 11.2.0.4 RAC下执行root.sh脚本报错
  • 2025年UDP应用抗洪指南:从T级清洗到AI免疫,实战防御UDP洪水攻击
  • 【Apache Paimon】-- 1.2.0 版本的Table 类型和 merge engine
  • JAVA 使用Apache POI合并Word文档并保留批注的实现
  • 近期学习过程问题整理
  • Java学习------ConcurrentHashMap
  • Spring底层(二)Spring IOC容器加载流程原理
  • PermissionError: [Errno 13] Permission denied
  • 复盘爬虫课后练习题
  • 前端学习8:JavaScript数据类型|声明变量|函数定义|函数参数|作用域(多个小练习上手)
  • 【三维重建】LODGE:谷歌DeepMind发布大场景超快3DGS!分层渲染,移动设备均可!
  • CentOS7 内网服务器yum修改
  • 金属伪影校正的双域联合深度学习框架复现
  • blender如何队列渲染多个工程文件的动画?
  • 声画同步!5 个音视频素材适配的网站,创作更和谐
  • 算法学习笔记:29.拓扑排序——从原理到实战,涵盖 LeetCode 与考研 408 例题
  • 前端埋坑之js console.log字符换行后 html没换行问题处理
  • HTML 页面禁止缩放功能