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

八、参考链接

相关推荐
赶飞机偏偏下雨16 小时前
【Java笔记】单例模式
java·笔记·单例模式
ZPC821017 小时前
scp 网间拷贝
网络协议·tcp/ip·ssl·信息与通信
GoldenaArcher17 小时前
OpenAPI Specification 系列笔记 III
笔记
happilyaaa17 小时前
B站 韩顺平 笔记 (Day 27)
笔记
我真的是大笨蛋1 天前
K8S-Pod(下)
java·笔记·云原生·容器·kubernetes
liulilittle1 天前
OPENPPP2 —— IP标准校验和算法深度剖析:从原理到SSE2优化实现
网络·c++·网络协议·tcp/ip·算法·ip·通信
梁小憨憨1 天前
zotero扩容
人工智能·笔记
阿昭L1 天前
HTTP原理
网络·网络协议·http
Hello_Embed1 天前
STM32HAL 快速入门(十九):UART 编程(二)—— 中断方式实现收发及局限分析
笔记·stm32·单片机·嵌入式硬件·学习
笑鸿的学习笔记1 天前
JavaScript笔记之JS 和 HTML5 的关系
javascript·笔记·html5