首页
社区
课程
招聘
[原创] 我让 Hermes 把古法 RPC 重新炼成了高并发调度平台:r0rpc 实战
发表于: 2026-6-1 10:13 2924

[原创] 我让 Hermes 把古法 RPC 重新炼成了高并发调度平台:r0rpc 实战

2026-6-1 10:13
2924

RPC 没有死。
它只是从热闹处退到了角落里,继续替很多逆向、爬虫、自动化场景扛最硬的活。

这篇文章不打算写成一本说明书。

说明书讲“怎么用”,但我更想讲清楚另一件事:为什么在协议逆向越来越重、风控链路越来越长、真机环境越来越难复刻的今天,RPC 这种看起来有点“古法”的方案,反而还有生命力。

更重要的是,这次不是单纯拿 Sekiro 改一改,也不是写一个能转发请求的玩具 demo。

这次我让 Hermes 参与设计和实现了一套自己的 RPC 调度平台:r0rpc

它有后台,有权限,有账号,有 group,有 action,有设备在线状态,有请求缓存,有成功率统计,有 WebSocket 长连接,有 Xposed demo,有 Python 模拟端,有性能压测脚本,也能一键部署。

一句话概括:

r0rpc 不是“把手机开个口子给外面调一下”。
它更像是把一批手机设备接进后端体系里,变成可管理、可观测、可压测、可扩展的 RPC 资源池。

而 Hermes 最让我震惊的地方也在这里:我不是让它补一个函数,不是让它写一段示例代码,而是把一个偏工程化、偏系统设计、偏实战落地的需求丢给它,它真的能把事情拆开、推进、验证,再持续修正。

这就很离谱。

如果你只想看结论,可以直接看这一段。

这不是说 Sekiro 不好。

恰恰相反,Sekiro 是这个方向里非常重要的先行者。没有它,很多人甚至不会意识到“反向长连接 + 真机执行 + 服务端调度”这条路可以这么顺。

但工具用久了,需求会变。

刚开始我们只想“能调通”。后来就会想:

这些问题堆在一起,就不再是一个“RPC 客户端库”的问题,而是一个设备 RPC 调度平台的问题。

这就是 r0rpc 要补的空。

Hermes 是一个运行在终端里的 AI Agent。

普通 AI 更像问答助手,你问一句,它答一句;Hermes 更像一个能长期协作的工程同伴。它能读项目、改代码、跑命令、定位问题、补测试、调配置,并且在多轮对话里持续理解你的偏好和项目上下文。

它最强的不是“会写代码”。

会写代码的工具现在很多,但真正难的是:

这次 r0rpc 的过程很典型。

一开始我的需求其实非常长,甚至有点像“我全都要”:

正常人工接到这种需求,第一反应大概率不是马上写代码,而是先皱眉。

因为这里面不止一个功能点,而是混着几类问题:

Hermes 最像人的地方就在这:它不是直接开写一个“大泥团”,而是先判断这不是普通 WebSocket 转发服务,而是一个设备 RPC 调度系统。

这一步很关键。

方向对了,后面才会越写越顺。

做安卓逆向和数据自动化的人,对 RPC 这条路一般都不陌生。

很多时候,我们不是不想纯协议,不是不想把加密完全还原出来,而是现实情况不允许。

有些加密链路非常长:

这时候硬抠协议当然可以,但成本可能非常高。

RPC 的思路就很直接:

既然目标 App 自己能算,那就让它自己算。
我们只负责把请求送进去,把结果拿出来。

它的价值不是优雅,而是有效。

在真实业务里,有效往往比优雅重要。

RPC 最大的好处,是把复杂问题换了一个维度。

原来你要解决的是:

换成 RPC 后,问题变成:

后者仍然不简单,但它更工程化,也更可控。

尤其在下面几类场景里,RPC 很香:

说白了,RPC 是一种很实战的路线。

不一定最漂亮,但能打。

不过 RPC 也有自己的硬伤。

早期很多 RPC 方案更像“能用就行”的工具,单人调试很舒服,一旦进入多设备、多 action、多调用方、多并发,问题就开始暴露:

这些问题不解决,RPC 就永远停在“小工具”阶段。

r0rpc 要做的,就是把它往“平台”方向推一步。

r0rpc 的核心目标很简单:

把手机端能力,通过 WebSocket 长连接,稳定地变成服务端可调用的 RPC 能力。

整体链路大概是这样:

它不是只追求“能调通”,而是把真实使用中最容易痛的地方都补上。

早期 RPC 工具最难受的一点,是很多状态只能靠猜。

设备在不在线?

哪个 group 有设备?

哪个 action 最近失败多?

某台手机是不是已经卡住?

调用方只看到“失败”,但不知道失败发生在哪里。

r0rpc 做了后台之后,这些东西就可以直接看。

后台能管理:

这对 RPC 来说提升非常大。

因为 RPC 最大的问题从来不是“跑一次”,而是“跑久了之后怎么知道哪里坏了”。

很多 RPC 工具里,group 是调用时直接传的。

这样很自由,但也很容易乱。

比如今天写 idlefish,明天有人写 idle_fish,后天又有人写 xianyu。短期能跑,长期就是灾难。

r0rpc 的规则更硬:

group 必须先在后台创建,并且状态为可用,app 端才能加入。
如果 group 不存在或未启用,直接提示没有这个 group。

这个设计看起来只是多了一道校验,其实是在给系统立边界。

有边界,后面才能统计、权限、审计、限流、隔离。

action 是 RPC 的核心入口。

如果 action 没有管理,最后一定会变成一堆没人敢删的字符串。

r0rpc 把 action 放进后台管理,让它从“随便传一个名字”变成“平台内的受控资源”。

这样做的好处是:

真实场景里,调用方式一般有两种:

一种是指定设备:

比如这台设备登录了某个账号,或者只有它有某个状态。

另一种是不指定设备:

这时候就需要轮询和调度。

r0rpc 两种都支持:

这才像一个可以长期跑的 RPC 调度层。

RPC 调试最怕什么?

最怕线上失败后只剩一句“调用失败”。

到底传了什么参数?

设备返回了什么?

中间耗时多少?

是服务端超时,还是设备端报错?

如果没有记录,排查就只能靠复现。

r0rpc 会把请求参数、响应结果、耗时、状态等信息沉淀下来。默认保留策略可以配置,文章里按 30 天这个目标设计,也支持通过配置控制保留条数。

这对实战太重要了。

RPC 一旦接入业务,就不只是“能不能请求成功”,而是要能解释每一次失败。

多设备场景里,总成功率没那么有用。

真正有用的是:

r0rpc 后台可以看设备维度的成功率。

这意味着你不用再靠感觉判断“这台手机是不是不太行”,而是能拿数据说话。

RPC 方案真正跑起来以后,保活比很多功能都重要。

因为手机不是服务器。

它会锁屏,会断网,会被系统杀后台,会切网络,会卡死,会重启,会因为目标 App 状态异常导致 action 不响应。

所以 r0rpc 在保活上做了几件事。

r0rpc 的设备连接使用 WebSocket。

设备端定期心跳:

这个配置的好处是上下线足够灵敏。

5 秒心跳能比较快感知设备还活着;20 秒判离线又不会因为一次网络抖动就误杀。

对后台来说,这个体验很关键。

你看到设备在线,就应该基本可信;设备掉了,也应该尽快显示出来。

这个点很实用。

设备不是只断几秒。

它可能断一分钟,断一小时,甚至断一天。

r0rpc 的客户端重连逻辑不是“一次失败就结束”,而是持续重试。只要进程还在、网络恢复、服务端可达,就会继续尝试连回去。

这才符合移动端 RPC 的真实环境。

很多人写重连,会写成这样:

单台设备没问题。

但如果是几十台、几百台设备同时断网又同时恢复,就会变成一波重连洪峰。

r0rpc 的重连思路是:

这就是从“小工具”到“平台”的区别。

小工具只要连得上。

平台要考虑连不上、断了、一起断、一起回来、回来以后还有大量请求排队。

这里还是要说明一下:我使用和对比的主要是早期 Sekiro 体验,后续新版如果已经增强了后台、性能和管理能力,不在本文结论范围内。

但从我这次实测和迁移体验看,r0rpc 的优势非常直观。

我最喜欢的是可观测性这块。

以前 RPC 调不通,经常像在黑盒里摸。

现在至少能看见:

看得见,才能管得住。

服务端对外提供 HTTP API,调用方不用关心设备怎么连,只管发请求。

示例:

服务端收到请求后,会根据 group 和 action 找到可用设备。

如果你不指定设备,它会在在线设备里轮询。

如果你指定设备,它会直接发给目标设备。

响应里会带回业务结果,也会带回请求参数和耗时信息,方便调试和记录。

Python 调用大概是这种感觉:

如果是 Xposed 侧,客户端初始化也尽量保持干净:

Build.MANUFACTURER 这种平台信息不需要每次显式传,客户端默认自己取。

maxInFlight 默认 256,不用每次写一串链式调用,让调用代码看起来像堆配置。

这点虽小,但很影响使用体验。

测试环境:

压测结果:

这个结果比我预期还要好。

单台 Xiaomi 跑 decrypt,最舒服的并发区间在:

注意 512 并发虽然没有失败,但吞吐掉了,P95 也上来了。

这说明瓶颈不在 Go 服务端,而是在设备处理、网络排队、调用端调度和 HTTP 并发上。

所以生产环境不是并发越大越好,而是要找到设备最舒服的区间。

对这台设备来说,maxInFlight = 256 是一个比较合理的默认值。

后来又接了 2 台 Xiaomi,每台 maxInFlight = 256,理论总 in-flight 是 512。

两台设备情况下,推荐业务并发控制在:

这个结果也很符合预期。

设备数上来以后,吞吐确实能继续提升,但不是无限线性增长。因为每台手机本身就是一个有限执行器,最终还是会被 CPU、目标 App、网络、Hook 逻辑、调用超时共同限制。

r0rpc 做得好的地方,是在这个限制内尽量稳定地调度,而不是让请求乱飞。

为了更直观,我又用同一台手机对 Sekiro 做了压测。

Sekiro 测试接口:

对比结果如下:

这张表最关键的不是 QPS 数字有多漂亮,而是趋势非常明显。

在低并发下,r0rpc 延迟更低。

在 10-20 并发区间,r0rpc 吞吐大概能到 Sekiro 的 2 倍左右。

在 50 并发时,r0rpc 仍然稳定,Sekiro 的 P95 已经超过 1 秒。

到 100 并发时,r0rpc 仍然 100% 成功,而 Sekiro 成功率掉到 24.1%,并且出现大量 no enable device online 这类问题。

如果按“舒服可用区间”看:

这就是 r0rpc 最能打的地方。

它不是只在单次调用里快一点,而是在并发上来以后,仍然能保持成功率和可观测性。

这里不吹玄学,只看设计。

r0rpc 能稳,主要靠几件事:

Go 写这种服务很舒服。

一个设备一条连接,一个请求一个上下文,goroutine 的模型很适合处理 WebSocket 长连接和并发调度。

相比把线程池、事件循环、连接管理混在一起调,Go 的心智负担更低。

对 r0rpc 这种“长连接 + 请求分发 + 状态统计 + 后台管理”的项目来说,Go 是很合适的选择。

手机不是无限并发机器。

你给它 1000 个请求,它不会真的变强,只会排队、超时、抖动。

r0rpc 给客户端设计了 maxInFlight,默认 256。

这相当于给单设备设了上限。

超过设备承载能力后,系统应该排队、拒绝或者调度到其他设备,而不是无脑继续塞。

调用方只管发 HTTP 请求。

设备选择、在线状态、group 校验、action 校验、超时处理,都交给服务端。

这让调用方更轻,也让平台有机会做统一治理。

性能问题不可怕。

可怕的是性能问题发生后没有证据。

r0rpc 会把请求和结果记录下来,再配合成功率和延迟统计,就能知道问题到底出在哪里。

这比“感觉今天有点慢”强太多。

如果只看最终代码,你可能会觉得:

不就是 Go + WebSocket + MySQL + Redis + 后台吗?

但真正难的是从一个很乱的需求出发,把它变成一个能跑、能部署、能压测、能继续改的项目。

Hermes 在这个过程中很像一个不会喊累的工程搭子。

我提需求,它先拆。

我说接口 404,它去查本地路由。

我说 app 断一天会不会重连,它去看客户端重连逻辑。

我说成功率算不算设备掉线请求,它去看统计口径。

我说保留多少条请求记录,它把硬编码挪到配置。

我说 Java 初始化太丑,它把 IP 和端口拆开,把平台参数内置,把默认 maxInFlight 收进去。

我说要压测,它补 Python 脚本,跑 r0rpc,再跑 Sekiro,再做对比表。

这不是单次问答,这是连续工程协作。

更离谱的是,很多改动不是“写出来就完了”,而是能继续追问:

它都能顺着项目往下查。

这就是 Hermes 真正的价值。

它不是替你敲几行代码,而是把你的想法推进成一个工程结果。

这个话题必须说实话。

AI 很强,但不是魔法。

就 r0rpc 这个项目来说,AI 的优势非常明显:

但人工工程经验仍然重要:

更直观一点:

所以我的感受不是“AI 取代工程师”。

更准确地说,是工程师多了一台非常夸张的加速器。

以前你需要先学 Go、学前端、学 WebSocket、学 Docker、学 MySQL、学 Redis、学 Xposed 接入,再一点点拼起来。

现在你可以先提出目标,让 Hermes 帮你铺出一版能跑的系统,然后你再围绕真实问题不断打磨。

这对个人开发者太友好了。

整理一下,当前 r0rpc 已经具备这些能力:

这已经不是“一个 RPC demo”了。

它是一套可以继续往生产形态演进的 RPC 平台雏形。

配置独立出来非常重要。

数据库、Redis、保留策略、服务端口、登录账号、token 时间、请求记录保留数量,这些都不应该散落在代码里。

尤其是准备部署到不同服务器时,配置化能少踩很多坑。

MySQL 和 Redis 也不应该绑定死:

示例配置建议写成这种风格:

这里建议公开文章里不要直接放真实密码。

配置可以展示结构,但密码最好用占位符。

以前做这类东西,流程大概是:

先找项目,跑起来,改一堆配置。

再写客户端,调 WebSocket。

再写 HTTP 转发。

再补后台。

再补数据库。

再处理断线。

再处理并发。

再写压测。

再定位为什么设备离线。

再想办法统计成功率。

一圈下来,时间就没了。

这次不一样。

我把目标说清楚,Hermes 开始拆,拆完开始写,写完开始跑,跑不通就查,查完继续改,改完继续压测。

整个过程最爽的地方是:我不需要一次性成为 Go 后端、前端、Android、Xposed、运维、压测全栈高手。

我只需要知道我要什么,然后持续提出判断和修正。

Hermes 负责把大量工程体力活推过去。

这就是它最牛的地方。

RPC 不是银弹。

它解决不了所有问题,也不适合所有场景。

但在安卓逆向、真机自动化、复杂加密调用、强风控链路里,它仍然是一条非常有价值的路线。

Sekiro 证明了这条路能走。

r0rpc 想做的是,把这条路继续往工程化、平台化、可观测、高并发方向推一步。

而 Hermes 让我最直观地看到了一件事:

个人开发者的工程上限,正在被 AI Agent 重新抬高。

以前一个人想做一套 RPC 平台,可能需要很长时间。

现在你可以先做出来,再压测,再修,再完善。

从想法到能跑,从能跑到能看,从能看到能压,从能压到能对比,这个链路被大幅缩短。

这就是 Hermes。

这也是 r0rpc 这次最值得记录的地方。

项目地址:


[内核课程]《Windows内核攻防实战》!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。

最后于 2026-6-1 11:37 被manyuegong33编辑 ,原因: 直接全部可见
上传的附件:
收藏
免费 8
打赏
分享
最新回复 (10)
雪    币: 17
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
6666 好文
2026-6-1 10:19
0
雪    币: 227
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
大佬带带弟弟
2026-6-1 10:21
0
雪    币: 53
活跃值: (442)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
727
4
2026-6-1 10:31
0
雪    币: 7
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
好东西,感谢分享
2026-6-1 11:03
0
雪    币: 3907
活跃值: (6816)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
6
666
2026-6-1 11:04
0
雪    币: 176
活跃值: (7650)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
7
666
2026-6-1 11:06
0
雪    币: 104
活跃值: (8772)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
tql
2026-6-1 16:30
0
雪    币: 403
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
Imxz tql
互相学习
2026-6-1 22:08
0
雪    币: 403
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
mb_ldbucrik 好东西,感谢分享
看的人多 我后面继续更自动化这块
2026-6-1 22:08
0
雪    币: 28
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
 学习了,感谢分享
13小时前
0
游客
登录 | 注册 方可回帖
返回