背景
之前在.NET 性能优化群内交流时,我们发现很多朋友对于高性能网络框架有需求,需要创建自己的消息服务器、游戏服务器或者物联网网关。但是大多数小伙伴只知道 DotNetty,虽然 DotNetty 是一个非常优秀的网络框架,广泛应用于各种网络服务器中,不过因为各种原因它已经不再有新的特性支持和更新,很多小伙伴都在寻找替代品。
这一切都不用担心,在.NET Core 以后的时代,我们有了更快、更强、更好的 Kestrel 网络框架,正如其名,Kestrel 中文翻译为**红隼(hóng sǔn)**封面就是红隼的样子,是一种飞行速度极快的猛禽。Kestrel 是 ASPNET Core 成为.NET 平台性能最强 Web 服务框架的原因之一,但是很多人还觉得 Kestrel 只是用于 ASPNET Core 的网络框架,但是其实它是一个高性能的通用网络框架。
我和拥有多个.NET 千星开源项目作者九哥一拍即合,为了让更多的人了解 Kestrel,计划写一系列的文章来介绍它,九哥已经写了一系列的文章来介绍如何使用Kestrel来创建网络服务,我觉得他写的已经很深入和详细了,于是没有编写的计划。
不过最近发现还是有很多朋友在群里面问这样的问题,还有群友提到如何使用Kestrel来实现一个RPC框架,刚好笔者在前面一段时间研究了一下这个,所以这一篇文章也作为Kestrel的应用篇写给大家,目前来说想分为几篇文章来发布,大体的脉络如下所示,后续看自己的时间和读者们感兴趣的点再调整内容。
- 整体设计
- Kestrel服务端实现
- 请求、响应序列化及反序列化
- 单链接多路复用实现
- 性能优化
- Client实现
- 代码生成技术
- 待定……
项目
本文对应的项目源码已经开源在Github上,由于时间仓促,笔者只花了几天时间设计和实现这个RPC框架,所以里面肯定有一些设计不合理或者存在BUG的地方,还需要大家帮忙查缺补漏。
SatelliteRpc: https://github.com/InCerryGit/SatelliteRpc
如果对您有帮助,欢迎点个star~
再次提醒注意:该项目只作为学习、演示使用,没有经过生产环境的检验。
项目信息
编译环境
要求 .NET 7.0 SDK 版本,Visual Studio 和 Rider 对应版本都可以。
目录结构
代码语言:javascript复制├─samples // 示例项目
│ ├─Client // 客户端示例
│ │ └─Rpc // RPC客户端服务
│ └─Server // 服务端示例
│ └─Services // RPC服务端服务
├─src // 源代码
│ ├─SatelliteRpc.Client // 客户端
│ │ ├─Configuration // 客户端配置信息
│ │ ├─Extensions // 针对HostBuilder和ServiceCollection的扩展
│ │ ├─Middleware // 客户端中间件,包含客户端中间件的构造器
│ │ └─Transport // 客户端传输层,包含请求上下文,默认的客户端和Rpc链接的实现
│ ├─SatelliteRpc.Client.SourceGenerator // 客户端代码生成器,用于生成客户端的调用代码
│ ├─SatelliteRpc.Protocol // 协议层,包含协议的定义,协议的序列化和反序列化,协议的转换器
│ │ ├─PayloadConverters // 承载数据的序列化和反序列化,包含ProtoBuf
│ │ └─Protocol // 协议定义,请求、响应、状态和给出的Login.proto
│ ├─SatelliteRpc.Server // 服务端
│ │ ├─Configuration // 服务端配置信息,还有RpcServer的构造器
│ │ ├─Exceptions // 服务端一些异常
│ │ ├─Extensions // 针对HostBuilder、ServiceCollection、WebHostBuilder的扩展
│ │ ├─Observability // 服务端的可观测性支持,目前实现了中间件
│ │ ├─RpcService // 服务端的具体Rpc服务的实现
│ │ │ ├─DataExchange // 数据交换,包含Rpc服务的数据序列化
│ │ │ ├─Endpoint // Rpc服务的端点,包含Rpc服务的端点,寻址,管理
│ │ │ └─Middleware // 包含Rpc服务的中间件的构造器
│ │ └─Transport // 服务端传输层,包含请求上下文,服务端的默认实现,Rpc链接的实现,链接层中间件构建器
│ └─SatelliteRpc.Shared // 共享层,包含一些共享的类
│ ├─Application // 应用层中间件构建基类,客户端和服务端中间件构建都依赖它
│ └─Collections // 一些集合类
└─tests // 测试项目
├─SatelliteRpc.Protocol.Tests
├─SatelliteRpc.Server.Tests
└─SatelliteRpc.Shared.Tests
演示
安装好SDK和下载项目以后,samples
目录是对应的演示项目,这个项目就是通过我们的RPC框架调用Server端创建的一些服务,先启动Server然后再启动Client就可以得到如下的运行结果:
设计方案
下面简单的介绍一下总体的设计方案:
传输协议设计
传输协议的主要代码在SatelliteRpc.Protocol
项目中,协议的定义在Protocol
目录下。针对RPC的请求和响应创建了两个类,一个是AppRequest
另一个是AppResponse
。
在代码注释中,描述了协议的具体内容,这里简单的介绍一下,请求协议定义如下:
代码语言:javascript复制[请求总长度][请求Id][请求的路径(字符串)]['