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

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.xdnf.cn/news/15668.html

相关文章:

  • Spring AI开发智能客服(Tool calling)
  • 开启modbus tcp模拟调试
  • 【LeetCode 热题 100】199. 二叉树的右视图——(解法一)BFS
  • 自己动手实现 strlen:从循环到递归的四种写法
  • Postman/Apipost中使用Post URL编码发送含换行符参数的问题分析
  • 现代R语言机器学习:Tidymodel/Tidyverse语法+回归/树模型/集成学习/SVM/深度学习/降维/聚类分类与科研绘图可视化
  • 串口(Serial Port)是什么?
  • 在 React 中根据数值动态设置 SVG 线条粗细
  • 【52】MFC入门到精通——MFC串口助手(二)---通信版(发送数据 、发送文件、数据转换、清空发送区、打开/关闭文件),附源码
  • 9. isaacsim4.2教程-ROS加相机/CLOCK
  • vs openssl编译提示无法打开文件“libssl.lib”或“libcrypto.lib”
  • 回归预测 | MATLAB实现SA-BP模拟退火算法优化BP神经网络多输入单输出回归预测
  • 搜广推校招面经九十五
  • stm32驱动双步进电机
  • Linux入门篇学习——借助 U 盘或 TF 卡拷贝程序到开发板上
  • UniApp -- 小程序自定义导航栏组件
  • 论文征集 | 国产工业软件硕博学位论文激励计划启动
  • 主流编程语言全景图:从Python到Rust的深度解析
  • 网络基础12--可靠性概述及要求
  • sky-take-out项目Mybatis的使用
  • 高性能数据库-Redis详解
  • 网关-微服务网关入门
  • STM32-第七节-TIM定时器-3(输入捕获)
  • 深度解析Linux文件I/O三级缓冲体系:用户缓冲区→标准I/O→内核页缓存
  • 如何在服务器上获取Linux目录大小
  • Mysql数据库——增删改查CRUD
  • *SFT深度实践指南:从数据构建到模型部署的全流程解析
  • 1-大语言模型—理论基础:详解Transformer架构的实现(1)
  • LeetCode|Day18|20. 有效的括号|Python刷题笔记
  • 【数据可视化-67】基于pyecharts的航空安全深度剖析:坠毁航班数据集可视化分析