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 集成

二、架构层级

项目 RPC Feign
通信协议 通常为 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 示例

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

gRPC 示例(简化)

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

七、总结表格

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

八、参考链接

相关推荐
biubiubiu070626 分钟前
Ubuntu学习笔记
笔记·学习·ubuntu
凉、介1 小时前
ARM 总线技术 —— APB
arm开发·笔记·学习
爱奥尼欧1 小时前
【Linux笔记】网络部分——网络层IP协议
linux·网络·笔记
秋已杰爱1 小时前
技术准备七:websocket
网络·websocket·网络协议
护国神蛙2 小时前
HTTP 重定向踩坑实录:307、301、308 问题排查全指南
前端·网络协议
凌然先生4 小时前
17.如何利用ArcGIS进行空间统计分析
经验分享·笔记·arcgis·电脑
Cyyyy_g4 小时前
【2025 SWPU-NSSCTF 秋季训练赛】gift_F12
网络协议·网络安全·https·状态模式
爱奥尼欧5 小时前
【Linux笔记】网络部分——传输层协议TCP(2)
linux·网络·笔记·tcp/ip
郝学胜-神的一滴5 小时前
QAxios研发笔记(二):在Qt环境下基于Promise风格简化Http的Post请求
开发语言·c++·笔记·qt·网络协议·程序人生·http