我用 Rust 重写(并重新设计)了 frp,性能和资源占用有很大改善

2022-01-04 18:53:16 +08:00
 rapiz

rathole - 安全、稳定、高性能的内网穿透工具,用 Rust 语言编写。


先博一下眼球,让各位有兴趣继续看下去:

如果你对性能和内存的测试数据感兴趣,可以直接拉到帖子下面的图表感受一下

你可以先看看 README ,其中介绍了特性、配置和用法


下面写写我为什么要做这个工具,和我开发的时候在想什么。

frp 是优秀的基于内网穿透反向代理工具,方便易用,集成了很多功能。

但我对一个内网穿透工具的期望不太一样,我相信一个工具应该专注做一件事,通过简单优雅的设计接口来提供扩展能力。

我仔细思考了如何设计这样一个工具,它应该:

相比于 frp ,除了数据上的优势,rathole 还有更多的可能性:

未来

rathole 已经持续开发了一段时间,必要的特性已经趋于完善和稳定。我觉得是时候发布出来,让大家体验使用和反馈。

目前已经决定的开发计划有 HTTP API (或其他形式的 API )。API 实现后,能够支持 Dashboard 和复杂动态管理需求的开发。

最后,如果你还没有查看 项目 README ,这里是一个方便的链接

性能测试

测试的具体数字随机器变化,测试方法见此,主要用 iperf3 测试 TCP/UDP 吞吐量, vegeta + nginx 测试 HTTP 吞吐量,同时检测内存占用

22900 次点击
所在节点    分享创造
117 条回复
Wincer
2022-01-05 17:38:38 +08:00
@bigbigpark #45 meilisearch 是挺占内存,可以试试 tantivy ,内存占用非常少
lwch
2022-01-05 17:43:06 +08:00
https://github.com/jkstack/natpass
我也做了一个带内网穿透功能的产品,不过做到后面发现下沉到应用层( shell 和 vnc )会更炫酷一点。
hxse
2022-01-05 17:48:27 +08:00
@rapiz #60 frp 和 vpn 配合有什么方案没有, 真的搞不懂, 网上好像也没什么案例
rapiz
2022-01-05 17:55:12 +08:00
@lwch 我的想法恰恰相反,做一个简单快速的内网穿透工具,然后暴露一些 API ,让其他程序(比如一个 dashboard )方便地与之相互操作,而不是集成进去😂
rapiz
2022-01-05 17:57:24 +08:00
@hxse 举一个最简单的例子,在想访问的主机上开一个 openvpn ,这个 openvpn 的端口在 NAT 后,公网无法访问,所以需要一个内网穿透工具把这个端口转发到有公网 IP 的主机上。具体的场景和需求因人而异。
nbndco
2022-01-05 18:04:27 +08:00
@sgissb1 理论上来说资源占用是水平问题,水平不行的人写 rust 也不会快。

但是如果水平到达一定程度的话,其实就涉及到一个语言特性的问题。

有的时候,项目一旦复杂,或者想要设计的很灵活,那很多问题就希望能够进行抽象,但是不同语言的抽象成本差距非常大。

像 rust 很多时候几乎是 zerocost 的抽象,使得我们几乎都不需要任何 Box 就可以实现非常灵活的功能。这在 C ,go 里面几乎无法想象,基本是原理上的不可能。在 C++里面,由于模版本身的限制,使得大规模的使用模版的开发维护难度非常高,在实际工程中几乎不可能,只能在极少数性能敏感的库中使用。

另外很多功能比如 Iterator ,使得一个自然设计的 API 在使用时就几乎不会产生不必要的性能损耗。这在其他语言中只是理论上可实现,可由于难度过大或者过于繁琐而没有任何人会去做。

这些都几乎没法通过开发者的水平来弥补。
binhb
2022-01-05 18:12:16 +08:00
我又要开始 rust 入门了
des
2022-01-05 18:49:10 +08:00
@rapiz #26 我也想要这个功能,考虑一下用 gpg 签名或者加密?
oneisall8955
2022-01-05 20:05:35 +08:00
赞👍,希望有异地组网类似 zerotier 路由表得功能
xiaolanger
2022-01-05 20:13:04 +08:00
@bigbigpark #45
@Wincer #61
一直好奇,melisearch 的使用体验怎么样?
LANB0
2022-01-05 20:22:19 +08:00
我又要开始 rust 从入门到放弃了
LANB0
2022-01-05 20:23:01 +08:00
既然叫 hole ,打洞技能有没有比 frp 升级一些
rapiz
2022-01-05 20:49:24 +08:00
@feelinglucky 能讲讲 docker image 的场景是什么吗? rathole 是单文件二进制,直接使用应该会更方便些 🤔
jamry
2022-01-05 23:02:05 +08:00
@rapiz 例如群晖、威联通等 nas 的内网穿透,可以基于 docker 跑 frp 实现
bufeii
2022-01-06 06:26:12 +08:00
@rapiz 先 Star 一个。我现在就是这种应用,入了一个 vps, SSH 转发的。Rust 是久闻大名。frp 这类还没用过,和 ssh 有啥区别?
Wincer
2022-01-06 10:19:56 +08:00
@xiaolanger meilisearch 在开箱即用的层面上做得还算可以,不过有些默认的配置我不是很喜欢并且无法更改,比如:1. 搜索是会全文返回,而不是返回片段; 2. typo tolerant 这个功能无法关闭,3. 内存占用比较大 等,所以我最后还是选择了基于 tantivy 定制一个搜索引擎,这样用的顺手一些
Reficul
2022-01-06 10:42:03 +08:00
@kappa

https://pkg.go.dev/encoding/json#Marshal

> Array and slice values encode as JSON arrays, except that []byte encodes as a base64-encoded string, and a nil slice encodes as the null JSON value.
rapiz
2022-01-06 10:42:39 +08:00
xiaolanger
2022-01-06 10:45:59 +08:00
@Wincer #76 感谢回复,我也试一下 tantivy
kappa
2022-01-06 11:08:06 +08:00
@Reficul 哦这是 marshal 一个[]byte ,实际场景上这么用很怪啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/826182

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX