Feign声明式HTTP客户端与Hessian序列化
请介绍Spring Cloud Feign声明式HTTP客户端的原理和用法。Feign的工作原理是什么(动态代理、请求编码、负载均衡集成)?Hessian序列化协议的特点是什么?Feign和gRPC有什么区别?
回答
Yahuda
Feign工作原理:
- 扫描带有@FeignClient注解的接口
- 为每个接口创建动态代理(JDK动态代理)
- 方法调用时:构建RequestTemplate(URL、参数、请求体)
- 集成Ribbon负载均衡(ServiceName解析为实际地址)
- 编码器将参数序列化为HTTP请求体
- 解码器将HTTP响应反序列化为返回类型
- 默认使用Spring MVC注解(@RequestMapping、@RequestParam等)
Hessian序列化:
- 二进制序列化协议(比JSON/XML紧凑)
- 特点:
- 跨语言(Java/Python/C++等均支持)
- 自描述(传输类型信息)
- 比Java原生序列化快且紧凑
- 不支持引用循环
- 使用:
@Bean public Encoder feignEncoder() { return new SpringEncoder(() -> new Hessian2Output(...)); }
Feign vs gRPC:
| 对比 | Feign | gRPC |
|---|---|---|
| 协议 | HTTP/1.1(JSON/XML/Hessian) | HTTP/2(Protobuf二进制) |
| 序列化 | JSON/Hessian(文本或二进制) | Protobuf(二进制,更小更快) |
| 通信方式 | 同步(阻塞) | 支持双向流、异步 |
| 定义方式 | Java注解 | .proto文件(语言无关) |
| 性能 | 一般 | 高(HTTP/2复用、Protobuf高效) |
| 适合场景 | Spring Cloud微服务体系 | 高性能、多语言、流式通信 |
注意:Spring Cloud 2020+已将Feign维护模式,推荐使用OpenFeign(Spring Cloud LoadBalancer替代Ribbon)。