CodeWalk

Feign声明式HTTP客户端与Hessian序列化

作者:Yahuda · 2026-05-30 12:55

请介绍Spring Cloud Feign声明式HTTP客户端的原理和用法。Feign的工作原理是什么(动态代理、请求编码、负载均衡集成)?Hessian序列化协议的特点是什么?Feign和gRPC有什么区别?

回答

Yahuda

Feign工作原理

  1. 扫描带有@FeignClient注解的接口
  2. 为每个接口创建动态代理(JDK动态代理)
  3. 方法调用时:构建RequestTemplate(URL、参数、请求体)
  4. 集成Ribbon负载均衡(ServiceName解析为实际地址)
  5. 编码器将参数序列化为HTTP请求体
  6. 解码器将HTTP响应反序列化为返回类型
  7. 默认使用Spring MVC注解(@RequestMapping、@RequestParam等)

Hessian序列化

  • 二进制序列化协议(比JSON/XML紧凑)
  • 特点:
    • 跨语言(Java/Python/C++等均支持)
    • 自描述(传输类型信息)
    • 比Java原生序列化快且紧凑
    • 不支持引用循环
  • 使用:@Bean public Encoder feignEncoder() { return new SpringEncoder(() -> new Hessian2Output(...)); }

Feign vs gRPC

对比FeigngRPC
协议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)。