Jaws:从零构建一个”五脏俱全”的 Java RPC 框架
在 Java RPC 的世界里Dubbo 和 gRPC 早已是家喻户晓的名字。但当你真正去读它们的源码时往往会陷入几十万行代码的汪洋——核心逻辑被淹没在大量的兼容性代码、扩展点和历史包袱中。如果你渴望有一个 RPC 框架代码量可控、架构清晰、每一行都有意义同时又不失生产级该有的核心能力——那么 Jaws 正是为此而生。 为什么需要 Jaws痛点一RPC 框架”会用但不懂”大多数开发者对 RPC 框架的使用停留在配置层面——加个注解、写个 YAML、服务就跑起来了。但背后的协议编解码、服务注册发现、负载均衡、容错机制几乎是黑盒。面试被问到”RPC 框架原理”时你能讲清楚几层痛点二生产级能力不是”可选项”很多教学型 RPC Demo 只实现了最基本的调用链路缺少优雅停机发布时丢请求泛化调用网关无法依赖每个服务的接口 JAR可观测性链路追踪和指标采集方法级别配置不同方法不同超时/重试策略主流注册中心适配Nacos / ZooKeeper 双支持一键切换这些在生产环境中都是刚需。痛点三Spring Boot 集成体验参差不齐有些 RPC 框架的 Spring Boot 集成还停留在 XML 配置或复杂的 Bean 定义阶段。开发者需要的是两个注解搞定一切。 项目亮点✨ 1. 自定义二进制协议基于 Netty 实现的jaws二进制协议结构清晰编解码过程完全透明┌──────────┬──────────┬──────────┬──────────────┬──────────┬──────────┐ │ magic │ type │ id │ serialization│ status │ body │ │ 2 bytes │ 1 byte │ 8 bytes │ 1 byte │ 1 byte │ variable │ └──────────┴──────────┴──────────┴──────────────┴──────────┴──────────┘支持fastjson2和hessian2两种序列化方式可通过配置一键切换。️ 2. 双注册中心支持注册中心依赖说明ZooKeeperjaws-registry-zookeeper基于 Curator 5.9临时节点 心跳续约Nacosjaws-registry-nacos基于 Nacos 3.2.2支持心跳续约与失败重连切换注册中心只需更换一个 Maven 依赖和一行配置业务代码零改动。 3. 五种负载均衡策略策略适用场景Random默认简单高效RoundRobin均匀分配LeastActive热点感知慢节点自动降权ShortestResponse响应时间感知选择预估最快的节点ConsistentHash相同参数路由到同一节点适合缓存场景所有策略均通过 SPI 可插拔你可以轻松实现自定义策略。️ 4. 高可用容错Failover— 调用失败自动切换到其他节点可配置重试次数Failfast— 快速失败适用于非幂等写操作⚙️ 5. 四阶段优雅停机这是很多 RPC 教程忽略但生产环境至关重要的能力。Jaws 实现了完整的停机流程确保零请求丢失、零损伤发布Phase 1: stopAccept() 关闭 ServerChannel不再 accept 新连接 Phase 2: awaitInactiveRequests() 轮询 activeRequests 计数器等待在途请求完成默认 10s Phase 3: unregister() 从注册中心注销所有服务 URL Phase 4: unexport() → destroy() 移除 Provider、关闭连接、释放 EventLoopGroup 和线程池验证方式# 启动 Provider ./run-sample.sh provider # 另开终端运行 Consumer ./run-sample.sh consumer # 发送 SIGTERM 信号观察四阶段日志 jps | grep SampleProvider # 找到 PID kill -TERM PID # Provider 日志依次输出 # [GracefulShutdown] Phase 1: Stop accepting new requests # [GracefulShutdown] Phase 2: Waiting for in-flight requests to complete # [GracefulShutdown] Phase 3: Unregister from registry # [GracefulShutdown] Phase 4: Close connections and release resources 6. 泛化调用无需依赖 Provider 的接口 JAR 包即可发起 RPC 调用。API 网关、测试平台、Mock 服务的必备能力// Spring Boot 注解方式 JawsReference(generic true, serviceInterface com.example.DemoService) private GenericService demoService; // 调用 Object result demoService.$invoke(hello, new String[]{java.lang.String}, new Object[]{jaws});Provider 端自动完成 Map↔POJO 参数转换调用方完全无感知。 7. 可观测性引入jaws-observability-spring-boot-starter即可获得完整的可观测性能力能力实现说明链路追踪Micrometer Tracing OpenTelemetryW3C TraceContext 格式自动传播全链路 traceId 一致指标采集MicrometerRPC 调用次数、成功率、耗时分布、活跃请求数side tag 区分 consumer/provider日志关联OTel 日志桥接traceId/spanId 自动注入 MDC无需手动处理无需额外代码Filter SPI 自动生效。 8. 方法级别配置全局配置不够精细Jaws 支持在消费端为单个方法设置独立的超时和重试策略JawsReference(methods { Method(name hello, timeout 5000, retries 3), // 这个方法单独配置 Method(name getUser, timeout 500) // 这个方法快速失败 }) private DemoService demoService; 9. injvm 协议JVM 内部直调零网络开销适合本地开发和单元测试./run-sample.sh injvm无需任何中间件一行命令即可运行。 10. RpcContext消费端可获取实际调用的服务端地址提供端可获取调用方 IP// Consumer 端 URL serverUrl RpcContext.getContext().getServerUrl(); // Provider 端 String callerIp RpcContext.getContext().getCallerIp();️ 架构设计jaws-parent ├── jaws-core # 核心协议抽象、SPI、序列化、集群、路由、Filter、配置 ├── jaws-transport-netty # Netty 4.1 传输层实现 ├── jaws-registry-zookeeper # ZooKeeper 注册中心 ├── jaws-registry-nacos # Nacos 3.x 注册中心 ├── jaws-extensions # 可观测性Micrometer 指标 OpenTelemetry 链路追踪 ├── jaws-spring-boot │ ├── jaws-spring-boot-starter # Spring Boot 自动配置 │ └── jaws-observability-spring-boot-starter # 可观测性自动装配 └── jaws-samples ├── jaws-sample-api # 接口定义 ├── jaws-sample-injvm # injvm 协议示例无需 ZK ├── jaws-sample-provider # 服务提供者ZooKeeper ├── jaws-sample-consumer # 服务消费者 泛化调用 ├── jaws-sample-provider-boot # Spring Boot ProviderNacos ├── jaws-sample-consumer-boot # Spring Boot Consumer └── jaws-sample-benchmark # 性能基准测试核心设计理念SPI 全可插拔Protocol、Cluster、LoadBalance、Filter、Serialization 等所有核心组件均通过SPIActivation机制可插拔替换任何一层不影响其他模块分层解耦core 保持轻量extensions 承载附加功能starter 负责自动装配配置模型统一URL 参数 → ServiceConfig/ReferenceConfig → Spring YAML三层配置自动映射 学习价值对于想理解 RPC 原理的开发者✅ 从零实现协议编解码理解”网络上传的是什么”✅ 手写服务注册发现理解”服务怎么找到对方”✅ 五种负载均衡策略实现理解”请求怎么分配”✅ 四阶段优雅停机理解”服务下线怎么不丢请求”对于需要轻量 RPC 方案的团队✅ Spring Boot 两个注解开箱即用✅ 双注册中心ZK/Nacos自由选择✅ 泛化调用支持网关和测试平台场景✅ 可观测性 starter 一键引入对于架构师✅ SPI 扩展点设计模式参考✅ 自定义二进制协议设计✅ 优雅停机与在途请求管理✅ 依赖版本统一管理核心 jar 足够精简 快速开始前置要求Java 17Maven 3.8或使用内置./mvnwZooKeeper 3.9 或 Nacos 3.x三步启动1. 编译项目git clone https://github.com/javahongxi/jaws.git cd jaws ./mvnw install -DskipTests2. 引入依赖dependency groupIdorg.hongxi/groupId artifactIdjaws-spring-boot-starter/artifactId version${jaws.version}/version /dependency dependency groupIdorg.hongxi/groupId artifactIdjaws-registry-nacos/artifactId version${jaws.version}/version /dependency3. 发布与引用服务ProviderEnableJaws SpringBootApplication public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } } JawsService public class DemoServiceImpl implements DemoService { Override public String hello(String name) { return hello name; } }ConsumerComponent public class MyRunner implements CommandLineRunner { JawsReference private DemoService demoService; Override public void run(String... args) { System.out.println(demoService.hello(jaws)); } }一键运行示例# injvm 协议无需中间件 ./run-sample.sh injvm # 完整 RPC 调用需要 ZK ./run-sample.sh run # 性能基准测试 ./run-sample.sh bench-jaws # 自定义参数 THREADS16 DURATION20 ./run-sample.sh bench-jaws 技术栈组件技术版本语言Java17网络Netty4.1.132注册中心ZooKeeper Curator3.9 / 5.9注册中心Nacos3.2.2序列化fastjson2 / hessian-lite2.0.62 / 4.0.5框架集成Spring Boot3.5可观测性Micrometer OpenTelemetry1.14 / 1.48工具Guava33.6 结语Jaws 不是要取代 Dubbo 或 gRPC而是回答一个问题一个生产级 RPC 框架最少需要多少代码答案是2万行 Java。从协议设计到服务发现从负载均衡到优雅停机从泛化调用到链路追踪——每一个模块都经过精心设计每一行代码都有实际意义。没有几十万行的历史包袱没有看不懂的”魔法”。

相关新闻

Java后端面试题大全(整理版·附答案详解),最全面详细

Java后端面试题大全(整理版·附答案详解),最全面详细

Java 面试 Java 作为编程语言中的 NO.1,选择入行做 IT 做编程开发的人,基本都把它作为首选语言,进大厂拿高薪也是大多数小伙伴们的梦想。以前 Java 岗位人才的空缺,而需求量又大,所以这种人才供不应求的现状,就是 Java 工程师的薪…

2026/7/25 5:52:15阅读更多 →
042-学英语二语法的费曼式理解

042-学英语二语法的费曼式理解

费曼学习法系列 第042篇 用费曼学习法学英语(二):语法的费曼式理解 一、语法不是规则,是"语言的使用习惯" 大多数人在学校学的语法是一套"规则体系":第三人称单数加s、过去式加ed、现在完成时用have+过去分词……这些规则越积越多,到后来你发现总…

2026/7/25 5:50:14阅读更多 →
基于TI bq51025的无线充电接收端设计:从Qi协议到工程实践全解析

基于TI bq51025的无线充电接收端设计:从Qi协议到工程实践全解析

1. 项目概述与核心价值在智能手机、可穿戴设备乃至电动牙刷、无线耳机等消费电子产品全面拥抱无线充电的今天,作为硬件工程师,我们面临的挑战远不止是“放上去就能充”这么简单。如何确保充电过程高效、安全且稳定,尤其是在不同功率等级和复杂…

2026/7/25 5:50:14阅读更多 →
VMD-CNN-BiLSTM轴承故障诊断模型解析

VMD-CNN-BiLSTM轴承故障诊断模型解析

1. 项目背景与核心价值轴承作为旋转机械的核心部件,其健康状态直接影响设备运行安全。传统振动信号分析方法依赖人工特征提取,存在效率低、泛化性差的问题。本项目采用西储大学轴承数据集(CWRU),构建VMD-CNN-BiLSTM混合…

2026/7/25 7:22:28阅读更多 →
小霸王AI学习机M7 Pro深度评测:12G+256G版功能实测与家长管控指南

小霸王AI学习机M7 Pro深度评测:12G+256G版功能实测与家长管控指南

这次我们来看一款面向K12阶段学生的智能学习设备——小霸王AI学习机M7 Pro。它集成了从小学到高中的全阶段同步课程资源,并融合了英语点读、AI家教、平板电脑等多种功能于一体。对于家长而言,核心关注点在于它能否真正辅助孩子学习、资源是否权威、操作是…

2026/7/25 7:22:28阅读更多 →
AI代码生成实战:从零构建自动化脚本,告别重复性工作

AI代码生成实战:从零构建自动化脚本,告别重复性工作

上周,我帮一个刚入行的朋友处理一个重复性的数据整理任务。他对着几十个格式混乱的Excel文件,手动复制粘贴、调整格式,折腾了一下午,疲惫不堪。我问他为什么不写个脚本,他苦笑着说:“我知道Python能解决&am…

2026/7/25 7:22:28阅读更多 →
YOLOv26在钢板表面缺陷检测中的创新应用

YOLOv26在钢板表面缺陷检测中的创新应用

1. 钢板表面缺陷检测的行业痛点与解决方案 在钢铁制造业中,钢板表面质量直接影响产品性能和售价。传统人工检测方式存在效率低(每分钟仅能检查2-3平方米)、漏检率高(约15%-20%)、标准不统一等问题。某大型钢厂的数据显…

2026/7/25 7:22:28阅读更多 →
千笔AI写作工具:学术论文智能辅助实战解析

千笔AI写作工具:学术论文智能辅助实战解析

1. 工具定位与核心功能解析千笔AI写作作为一款专注于学术场景的智能写作辅助工具,其核心价值在于解决研究者三大痛点:文献综述耗时、论文框架搭建困难、学术语言表达不专业。不同于通用型写作软件,它内置了超过2000种学术期刊的格式模板和学科…

2026/7/25 7:22:28阅读更多 →
C++ typedef与using关键字:类型别名的核心原理与工程实践

C++ typedef与using关键字:类型别名的核心原理与工程实践

1. 项目概述:为什么我们需要typedef?在C的日常开发中,尤其是面对那些动辄几十上百行的复杂模板声明,或者需要频繁使用特定数据结构时,你是否曾感到代码的可读性急剧下降,甚至自己写的代码过几天再看都像天书…

2026/7/25 7:20:28阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/25 1:01:14阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/25 1:01:14阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/25 1:01:14阅读更多 →
突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/25 0:01:16阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:01:16阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:01:16阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/24 23:01:03阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/24 19:00:40阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/24 19:00:40阅读更多 →