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 接口调用

八、参考链接

相关推荐
ZC跨境爬虫8 小时前
跟着 MDN 学 HTML day_9:(信件语义标记)
前端·css·笔记·ui·html
OBiO201311 小时前
Cell | 突破AAV载体容量限制!路中华/姜玉武/刘太安团队开发AAVLINK系统实现大基因递送
笔记
智者知已应修善业12 小时前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
sakiko_13 小时前
UIKit学习笔记5-使用UITableView制作聊天页面
笔记·学习·swift·uikit
汤愈韬13 小时前
三种常用 NAT 的经典案例
网络协议·网络安全·security
Alice-YUE14 小时前
【js高频八股】防抖与节流
开发语言·前端·javascript·笔记·学习·ecmascript
汤愈韬14 小时前
NAT Server 与目的Nat
网络·网络协议·网络安全·security
小陈phd15 小时前
TensorRT 入门完全指南(一)——从核心定义到生态工具全解析
人工智能·笔记
是上好佳佳佳呀15 小时前
【前端(十一)】JavaScript 语法基础笔记(多语言对比)
前端·javascript·笔记
handler0115 小时前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法