我以前开发过HttpMouse的http内网反代中间件,但由于当时的知识点与设计水平受限,所以把它下马了。随着自身又遇到http内网反代的需求,在frp不能满足我需求情况下,我又启动了一个叫CYarp的http内网反代项目,这次它的设计完成度是相当高的。
开源仓库地址:https://github.com/xljiulang/CYarp
Nuget包地址:https://www.nuget.org/packages?q=cyarp
CYarp.Server做为Asp.net core 8.0平台一个http中间件,它设计目的是让开发者能基于Asp.net core平台来开发一个高性能、传输安全、身份认证和授权验证完备一个http内网反代服务器。CYarp.Server支持tcp或http/2.0作为http/1.1的传输层,使用http/2.0的多路复用能在单个tcp连接分开传输多路http请求响应。
特性
- 使用高性能的kestrel做服务器
- 使用高性能的YARP做http转发
- 设计为asp.netcore的中间件,集成简单
- 开放的服务端与客户端交互协议
- 提供了.NET、C/C++客户端库
CYarp没有从头开发http服务器,也没有从头开发http转发器,而是使用了使用了Asp.net core平台的kestrel服务器和YARP转发器两个高性能组件,同时根据http/1.1的upgrade机制和http/2.0的Extended CONNECT Method机制,制定了客户端与服务端的CYarp交互协议,只有十几MB内存的Linux设备,开发程师根据这个协议也很容易开发出其客户端。
性能
CYarp和frp在一台Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz的CentOS Linux 7 (Core)系统机器上同时部署,压测时ab在局域网另一台机器上,压测顺序为表格上到下的参数顺序。
1个用户(10,000次)
产品 | Requests per second | Percentage of the requests |
---|---|---|
CYarp | 446.48 | P95=3 P99=3 |
frp_0.56.0 | 444.18 | P95=3 P99=3 |
10用户(50,000次)
产品 | Requests per second | Percentage of the requests |
---|---|---|
CYarp | 6001.57 | P95=2 P99=3 |
frp_0.56.0 | 5473.53 | P95=3 P99=4 |
20用户(100,000次)
产品 | Requests per second | Percentage of the requests |
---|---|---|
CYarp | 8640.89 | P95=3 P99=4 |
frp_0.56.0 | 5897.58 | P95=5 P99=7 |
50用户(200,000次)
产品 | Requests per second | Percentage of the requests |
---|---|---|
CYarp | 11864.86 | P95=6 P99=8 |
frp_0.56.0 | 5222.04 | P95=17 P99=29 |
100用户(500,000次)
产品 | Requests per second | Percentage of the requests |
---|---|---|
CYarp | 12500.28 | P95=11 P99=15 |
frp_0.56.0 | 5134.38 | P95=35 P99=52 |
当并发用户数20或以上时,frp的RPS不再提升(反而略有下降),但CYarp的RPS还是持续上升,且P95和P99表现优异。
安全
传输安全
当CYarp.Server方使用https时,以下部分为tls安全传输
- 长连接建立过程和长连接的后续Stream
- HttpTunnel的创建过程和其后续Stream
如果目标服务httpServer的TargetUri也是https,则HttpTunnel里面的流量表现为tls in tls。
业务安全
CYarp.Server不涉及到任何业务协议,它只是一个Asp.net core中间件,Client的身份认证依赖于asp.net core平台的身份认证中间件,而http转发部分的逻辑是由开发者自行开发来决定是否要转发,涉及的授权验证逻辑由开发者自行验证。
使用场景
CYarp是http反向代理,所以Server端只需要监听一个端口,就能让千千万万个Client端连接过来。根据反代规则将移动端(用户端)的http请求转发到对应的Client端上,形成以http协议为应用协议的一种物联网服务平台。
评论区