【免费下载链接】skrstop-components
基于springboot的常用功能封装,包括:通用响应、通用异常、数据库、redis、远程存储、常用自定义注解、多数据源等,省去各种配置和通用配置,开箱即用,支持jdk8+、jdk17+
做微服务的同学都知道,服务之间默认的 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(多路复用、头部压缩) |
| 客户端连接 | 默认URLConnection | OkHttp 连接池(默认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-http2 | false | 服务端+客户端同时启用 HTTP/2 |
skrstop.feign.config.gzip-compress | true | 序列化后追加 Gzip 压缩 |
skrstop.feign.config.scan-package | 无 | 自动扫描 Feign 客户端包路径 |
skrstop.feign.config.transfer-header | true | 透传上游请求头(如登录态) |
skrstop.feign.config.stop-auto-remove-global-response | false | 关闭"自动解包 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,调试期建议打开,能直观看到每个请求的协议与耗时。
常见问题与调优清单
⚠️避坑指南,按出现频率排序:
- 客户端返回类型转换报错:服务端关闭了 feign 包装(
skrstop.response.config.support-feign = false)时,客户端必须设置stop-auto-remove-global-response: true,否则解包逻辑对不上会抛类型错误 - 忘记换注解:普通
@FeignClient不会打feign_protocol: protostuff标记,服务端仍按 JSON 处理,性能收益直接归零 - HTTP/2 没生效:Tomcat 需同时配置
server.http2.enabled: true;OkHttp 走 h2c 需skrstop.feign.config.enable-http2: true且ok-http.enabled: true - 压缩开销权衡:小报文(几百字节)Gzip 压缩收益有限,可用
gzip-compress: false关掉,Protostuff 本身已是二进制小体积 - 连接池调优:高并发扇出场景可上调
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+
相关推荐
终极指南:Guide-RPC-Framework序列化框架对比测试 - Kryo、Protostuff、Hessian性能大揭秘
终极指南:Guide RPC Framework序列化框架对比测试 Kryo、Protostuff、Hessian性能大揭秘 Guide RPC Framewo
高性能Java序列化新范式:Protostuff全解析
高性能Java序列化新范式:Protostuff全解析 你还在为Java序列化性能发愁? 当系统吞吐量突破1000 TPS,传统Java序列化(Serializ
5步构建开源机器人手臂:从3D打印到智能感知的完整指南
5步构建开源机器人手臂:从3D打印到智能感知的完整指南 开源机器人手臂技术正在重塑机器人开发的门槛,SO 100/SO 101系列作为标准开放平台,为开发者和研
硬件开发机器人智能硬件嵌入式
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考