Jaws:从零构建一个“五脏俱全“的 Java RPC 框架
Java 17|Netty 4.1|Spring Boot 3.5|SPI 全可插拔|开箱即用在 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|grepSampleProvider# 找到 PIDkill-TERMPID# 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(generictrue,serviceInterfacecom.example.DemoService)privateGenericServicedemoService;// 调用ObjectresultdemoService.$invoke(hello,newString[]{java.lang.String},newObject[]{jaws});Provider 端自动完成 Map↔POJO 参数转换调用方完全无感知。 7. 可观测性引入jaws-observability-spring-boot-starter即可获得完整的可观测性能力能力实现说明链路追踪Micrometer Tracing OpenTelemetryW3C TraceContext 格式自动传播全链路 traceId 一致指标采集MicrometerRPC 调用次数、成功率、耗时分布、活跃请求数sidetag 区分 consumer/provider日志关联OTel 日志桥接traceId/spanId 自动注入 MDC无需手动处理无需额外代码Filter SPI 自动生效。 8. 方法级别配置全局配置不够精细Jaws 支持在消费端为单个方法设置独立的超时和重试策略JawsReference(methods{Method(namehello,timeout5000,retries3),// 这个方法单独配置Method(namegetUser,timeout500)// 这个方法快速失败})privateDemoServicedemoService; 9. injvm 协议JVM 内部直调零网络开销适合本地开发和单元测试./run-sample.sh injvm无需任何中间件一行命令即可运行。 10. RpcContext消费端可获取实际调用的服务端地址提供端可获取调用方 IP// Consumer 端URLserverUrlRpcContext.getContext().getServerUrl();// Provider 端StringcallerIpRpcContext.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. 编译项目gitclone https://github.com/javahongxi/jaws.gitcdjaws ./mvnwinstall-DskipTests2. 引入依赖dependencygroupIdorg.hongxi/groupIdartifactIdjaws-spring-boot-starter/artifactIdversion${jaws.version}/version/dependencydependencygroupIdorg.hongxi/groupIdartifactIdjaws-registry-nacos/artifactIdversion${jaws.version}/version/dependency3. 发布与引用服务ProviderEnableJawsSpringBootApplicationpublicclassProviderApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ProviderApplication.class,args);}}JawsServicepublicclassDemoServiceImplimplementsDemoService{OverridepublicStringhello(Stringname){returnhello name;}}ConsumerComponentpublicclassMyRunnerimplementsCommandLineRunner{JawsReferenceprivateDemoServicedemoService;Overridepublicvoidrun(String...args){System.out.println(demoService.hello(jaws));}}一键运行示例# injvm 协议无需中间件./run-sample.sh injvm# 完整 RPC 调用需要 ZK./run-sample.sh run# 性能基准测试./run-sample.sh bench-jaws# 自定义参数THREADS16DURATION20./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 相关链接项目地址: https://github.com/javahongxi/jaws作者主页: hongxi.orgJava 全栈研究: whatsmars☁️微服务最佳实践: spring-cloud-samplesSpring Boot: https://spring.io/projects/spring-bootNetty: https://netty.ioNacos: https://nacos.io 贡献指南欢迎提交 Issue 和 PR如果你发现 Bug 或有更好的实现方案想添加新的容错策略或负载均衡算法希望支持更多序列化方式或注册中心对性能优化有经验或建议请随时参与贡献让 Jaws 成为学习 RPC 原理的最佳参考项目© hongxi.org| 以生产级标准打造最清晰的 Java RPC 框架实现 结语Jaws 不是要取代 Dubbo 或 gRPC而是回答一个问题一个生产级 RPC 框架最少需要多少代码答案是2万行 Java。从协议设计到服务发现从负载均衡到优雅停机从泛化调用到链路追踪——每一个模块都经过精心设计每一行代码都有实际意义。没有几十万行的历史包袱没有看不懂的魔法。如果你正在 想深入理解 RPC 框架的核心原理 需要一个轻量级但功能完整的 RPC 方案️ 学习 SPI 扩展点设计和自定义协议实现 寻找一个代码量可控、可以通读的框架源码Star ⭐ Jaws开启你的 RPC 原理探索之旅gitclone https://github.com/javahongxi/jaws.gitcdjaws ./run-sample.sh injvm让我们一起探索 RPC 框架的本质

相关新闻

光谷财税哪家靠谱:高新技术企业如何选择财税外包

光谷财税哪家靠谱:高新技术企业如何选择财税外包

光谷财税哪家靠谱:高新技术企业如何选择财税外包在武汉东湖高新区,汇聚了数量庞大的科技型初创企业与成长期公司。面对日益严格的税务监管环境,许多企业管理者在搜索“光谷财税哪家靠谱”时,往往面临信息过载的困扰。需要明确的是…

2026/7/20 11:35:37阅读更多 →
学习slam14讲,在wsl里配置Pangolin遇到tiff包链接不上的问题 并解决

学习slam14讲,在wsl里配置Pangolin遇到tiff包链接不上的问题 并解决

打开文件 Pangolin/components/pango_image/CMakeLists.txt 这是原来的文件get_filename_component(COMPONENT ${CMAKE_CURRENT_LIST_DIR} NAME)find_package(Eigen3 REQUIRED NO_MODULE) target_compile_definitions(${COMPONENT} PUBLIC HAVE_EIGEN)option(BUILD_PANGOLIN_LI…

2026/7/20 11:35:37阅读更多 →
如何在qBittorrent中一键安装20+种子搜索引擎:终极免费搜索插件指南

如何在qBittorrent中一键安装20+种子搜索引擎:终极免费搜索插件指南

如何在qBittorrent中一键安装20种子搜索引擎:终极免费搜索插件指南 【免费下载链接】search-plugins Search plugins for qBittorrent search feature 项目地址: https://gitcode.com/gh_mirrors/se/search-plugins 还在为下载资源而烦恼吗?每次找…

2026/7/20 11:35:37阅读更多 →
81天HTML学习实战:从零基础到网页开发

81天HTML学习实战:从零基础到网页开发

1. HTML学习日记:从零基础到实战应用作为一名前端开发者,我坚持记录学习日记已经81天了。这81天的HTML学习历程让我深刻体会到,掌握好这门基础语言对Web开发有多么重要。HTML(超文本标记语言)是构建网页的基石&#xf…

2026/7/21 5:26:40阅读更多 →
Claude高效对话4大技巧:从新手到专家的实战指南

Claude高效对话4大技巧:从新手到专家的实战指南

1. Claude基础使用避坑指南:告别无效对话的4个实战技巧作为一款新兴的智能对话工具,Claude正在被越来越多的用户所关注。但很多新手在使用过程中常常陷入"无效对话"的困境——明明问了问题,得到的回答却总是差强人意。经过三个月的…

2026/7/21 5:26:40阅读更多 →
HTML第二次作业实践指南:从基础标签到表单实现

HTML第二次作业实践指南:从基础标签到表单实现

1. 作业背景与目标解析"第二次作业"这个标题看似简单,实际上包含了丰富的教学内涵。在编程入门课程中,第二次作业通常标志着学生从理论学习转向实践应用的转折点。根据MDN Web Docs的权威定义,HTML作为构成Web世界的基石语言&#…

2026/7/21 5:26:40阅读更多 →
RecyclerView 缓存机制

RecyclerView 缓存机制

RecyclerView 的缓存机制是其高性能的核心。它通过四级缓存来高效地复用ViewHolder,从而 减少findViewById 的开销 以及 inflate 的次数,实现流畅的滑动体验。 RecyclerView的四级缓存 按照“缓存是什么 -> 存在哪里 -> 特点是什么”的逻辑来阐述&…

2026/7/21 5:26:40阅读更多 →
JavaScript模块化开发与跨文件函数调用指南

JavaScript模块化开发与跨文件函数调用指南

1. JavaScript文件间函数调用的核心原理在现代前端开发中,将代码拆分到不同JS文件中是常见的模块化实践。理解文件间的函数调用机制,是构建可维护Web应用的基础技能。1.1 作用域与函数可见性JavaScript的函数作用域遵循以下规则:全局作用域中…

2026/7/21 5:26:40阅读更多 →
C++ STL map底层原理与核心操作详解:从红黑树到性能优化

C++ STL map底层原理与核心操作详解:从红黑树到性能优化

1. 项目概述:为什么你需要深入理解STL map?如果你正在学习C,尤其是从C语言过渡过来,或者正在准备面试,那么“STL容器”绝对是你绕不开的核心话题。而在众多容器中,std::map以其独特的“键值对”存储方式和高…

2026/7/21 5:24:40阅读更多 →
Go语言静态资源打包方案对比与实践指南

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

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

2026/7/21 0:51:49阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

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

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

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

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

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

2026/7/21 0:51:49阅读更多 →
Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

📌教程适配:OpenClaw v2.7.9 | 兼容 Windows10/11、macOS 双系统 📖前言 当下各类本地 AI 工具层出不穷,多数产品仅能完成文字问答交互,很难直接操控电脑执行实际操作。OpenClaw,业内常称小龙虾 AI&#…

2026/7/21 0:01:46阅读更多 →
Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

聊《一次Codex项目复盘,问题最后出在流程而不是模型》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做&…

2026/7/21 0:01:46阅读更多 →
手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

大家好,还是我。前几期带大家做了心情日记本和可视化大屏,后台有朋友留言:“能不能教点好玩的?我想做游戏,但一行代码都不会。”行,这期就安排。今天的目标:从零做一个五子棋游戏。 带AI对战、三…

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

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

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

2026/7/20 22:51:39阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

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

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

2026/7/20 18:51:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

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

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

2026/7/20 18:51:18阅读更多 →