☰
微服务RPC性能翻倍?skrstop-components Feign+HTTP/2+Protostuff高性能序列化完全教程
2026/10/16 3:01:57 网站建设 项目流程

【免费下载链接】skrstop-components

基于springboot的常用功能封装,包括:通用响应、通用异常、数据库、redis、远程存储、常用自定义注解、多数据源等,省去各种配置和通用配置,开箱即用,支持jdk8+、jdk17+

项目地址:https://gitcode.com/gh_mirrors/sk/skrstop-components
点击查看免费下载

做微服务的同学都知道,服务之间默认的 JSON + HTTP/1.1 调用又慢又占带宽。skrstop-components 是【基于 Spring Boot 的常用功能封装组件】,其中的components-starter-feign-protostuff模块直接提供了 Feign + HTTP/2 + Protostuff 二进制序列化 + Gzip 压缩的一站式高性能 RPC 方案:引入一个 starter、改一个注解、开两个配置项,就能让微服务间调用体积和耗时显著下降,支持 JDK8+ 与 JDK17+,开箱即用。

为什么默认的 Feign 调用不够快?

🐢 先弄清楚性能瓶颈在哪,才知道这个 starter 帮你解决了什么:

环节默认方式高性能方式(本教程)
序列化JSON(文本,字段名重复传输)Protostuff(基于 Protobuf 的二进制格式)
传输压缩通常不压缩Gzip / Snappy / Lz4 可开关
传输协议HTTP/1.1(每连接一路请求)HTTP/2(多路复用、头部压缩)
客户端连接默认URLConnectionOkHttp 连接池(默认200连接复用)
响应解析手动解包 Result 包装自动解包,直接拿到 data

Protostuff 是 Google Protobuf 的 Java 增强实现,不需要写 .proto 文件、不需要注解,普通 POJO 直接就能二进制序列化。序列化后的报文比 JSON 小得多,CPU 编解码也更快,这就是"RPC 性能翻倍"的核心来源。

项目结构与核心模块定位

先看一眼整体布局(见 README.md),本教程聚焦这三个目录:

  • 核心能力:components-starter-feign-protostuff —— HTTP/2 自动配置、Protostuff 转换器、Feign 拦截器
  • 官方示例:components-example-starters-cloud-feign —— 可直接运行的 Feign 客户端/服务端样例
  • 响应模型:components-core-common ——Result、ListResult、PageListResult等统一响应

一键接入:三步完成配置

第1步:添加依赖

在业务服务的 pom 中加入 starter(依赖清单 已包含 spring-cloud-openfeign、feign-okhttp、protostuff 全家桶,无需再手动引入):

<dependency> <groupId>com.skrstop.framework</groupId> <artifactId>components-starter-feign-protostuff</artifactId> <version>${skrstop.version}</version> </dependency>

如果本地跑示例工程,可克隆仓库后查看 application.yml 的完整参考配置:

git clone https://gitcode.com/gh_mirrors/sk/skrstop-components

第2步:开启 HTTP/2 与 OkHttp

配置项汇总(前缀skrstop.feign.config,定义见 GlobalFeignProperties.java):

配置项默认值作用
skrstop.feign.config.enable-http2false服务端+客户端同时启用 HTTP/2
skrstop.feign.config.gzip-compresstrue序列化后追加 Gzip 压缩
skrstop.feign.config.scan-package无自动扫描 Feign 客户端包路径
skrstop.feign.config.transfer-headertrue透传上游请求头(如登录态)
skrstop.feign.config.stop-auto-remove-global-responsefalse关闭"自动解包 Result"功能

一份典型配置:

skrstop: feign: config: enable-http2: true # 开启 HTTP/2 gzip-compress: true # 开启 Gzip 压缩 scan-package: com.your.api # 你的 Feign 接口包 spring: cloud: openfeign: ok-http: enabled: true # Feign 客户端走 OkHttp 连接池 server: http2: enabled: true # 服务端(Tomcat)启用 h2c 升级

第3步:把@FeignClient换成@ProtostuffFeignClient

这是全篇唯一要改的代码。新注解是@FeignClient的超集(ProtostuffFeignClient.java 中所有属性一一别名映射),额外提供三个微服务能力:

@ProtostuffFeignClient(name = "order-service", path = "/order", local = true) public interface OrderFeign { @GetMapping("/{id}") OrderVo getOrder(@PathVariable("id") Long id); }
  • local = true:跳过网络直接本地调用,适合服务合并场景(要求 Controller 实现该 Feign 接口)
  • autoLocal = true:扫包自动判断是否可本地化,注意会拖慢启动速度
  • 其余属性(contextId、fallbackFactory、configuration等)与原生 Feign 完全一致,平滑迁移零成本

它到底帮你做了什么?(原理速览)

🔍 下面按请求链路拆解 starter 的自动装配逻辑,方便排障:

① 协议标记拦截器—— FeignMarkAndHeaderInterceptor.java 在每个出站请求上自动打上use_feign: true、feign_protocol: protostuff标记和application/x-protobuf的 Content-Type,服务端据此识别"这是内部 Protostuff 调用",同时按transfer-header配置透传请求头(默认忽略 host、content-length 等7个头部,常量见 FeignConst.java)。

② 二进制转换器—— ProtostuffHttpMessageConverter.java 替换默认 JSON 转换器,调用ProtostuffUtil.serializeWithCompress完成"序列化+Gzip"一步到位,并支持自适应解包:你声明返回List<String>,它内部自动按ListResult反序列化后只给你 data 部分,声明PageData则自动转SimplePageData——接口方法直接写业务类型,不用背Result<T>外壳。

③ HTTP/2 双引擎支持—— 服务端按容器自动生效:

  • Tomcat:Http2TomcatAutoConfiguration.java 注册Http2Protocol做 h2c(明文 HTTP/2)升级
  • Undertow:Http2UndertowAutoConfiguration.java 设置ENABLE_HTTP2选项
  • 客户端:OkHttpAutoConfiguration.java 在开启 HTTP/2 时给 OkHttp 加H2_PRIOR_KNOWLEDGE协议,并创建 200 连接、TTL 900 秒的连接池(可调参见 FeignOkHttpProperties.java)

💡 HTTP/2 多路复用让一条 TCP 连接并发跑多个请求,消除 HTTP/1.1 的队头阻塞,对"一个订单页要调库存+价格+用户三个服务"这类扇出场景提升明显。

跟着官方示例跑一遍

完整可运行示例位于 components-example-starters-cloud-feign:

  • 客户端声明:RemoteFeign.java —— 演示Result、ListResult、PageCollectionResult各类型 +FallbackFactory熔断降级
  • 本地化调用:RemoteFeignController.java ——local = true时接口方法直接声明Integer、List<DemoInfo>、void,完全看不到响应包装类
  • 服务提供方与实体:RemoteServerController.java、DemoInfo.java
  • 启动类:ExampleStartersCloudFeignApplicationBootstrap.java(配好scan-package后连@EnableFeignClients都可以省)

示例中的 application.yml 还展示了 OkHttp 请求日志开关log-info-level-for-request,调试期建议打开,能直观看到每个请求的协议与耗时。

常见问题与调优清单

⚠️避坑指南,按出现频率排序:

  1. 客户端返回类型转换报错:服务端关闭了 feign 包装(skrstop.response.config.support-feign = false)时,客户端必须设置stop-auto-remove-global-response: true,否则解包逻辑对不上会抛类型错误
  2. 忘记换注解:普通@FeignClient不会打feign_protocol: protostuff标记,服务端仍按 JSON 处理,性能收益直接归零
  3. HTTP/2 没生效:Tomcat 需同时配置server.http2.enabled: true;OkHttp 走 h2c 需skrstop.feign.config.enable-http2: true且ok-http.enabled: true
  4. 压缩开销权衡:小报文(几百字节)Gzip 压缩收益有限,可用gzip-compress: false关掉,Protostuff 本身已是二进制小体积
  5. 连接池调优:高并发扇出场景可上调spring.cloud.openfeign.ok-http.max-connections(默认 200)、time-to-live(默认 900s)

📊性能对比参考(典型 1KB JSON 订单对象,相对值):Protostuff 报文约缩小 60%~80% 体积;叠加 Gzip 后网络字节数再降一档;HTTP/2 + 连接池使高频小请求的 P99 延迟明显下降。"翻倍"来自序列化、压缩、协议三项叠加,建议用项目自带的压测工具 components-util-stress 在自己的环境里实测。

总结

skrstop-components 的 feign-protostuff starter 把"JSON 换 Protostuff、HTTP/1.1 升 HTTP/2、裸请求加压缩、响应自动解包"这四件最耗时的事全部收敛成一个依赖 + 一个注解 + 几行配置。它的模块路径 components-starters/components-starter-feign-protostuff 与示例 components-examples/components-example-starters-cloud-feign 都值得精读,配合仓库中 README.md 的模块总览,你可以把数据库、Redis、对象存储等其他 starter 也一并纳入技术栈。升级前先对照 CHANGELOG.md 确认版本,即可安全地将你的微服务 RPC 链路提速。

【免费下载链接】skrstop-components

基于springboot的常用功能封装,包括:通用响应、通用异常、数据库、redis、远程存储、常用自定义注解、多数据源等,省去各种配置和通用配置,开箱即用,支持jdk8+、jdk17+

项目地址:https://gitcode.com/gh_mirrors/sk/skrstop-components
点击查看免费下载
上一篇:AgentField Agent Mesh深度解析:分布式AI Agent的服务发现与跨Agent调用原理
下一篇:TIL 仓库笔记:ack 命令行工具的隐藏彩蛋 --bar 选项

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询