高性能的 TCP 服务框架是 AutoCSer 的核心组件,支持若干全局默认配置,需要引用 AutoCSer\Packet\*\AutoCSer.dll。
我认为 TCP 服务的本质就是远程函数调用,所以 AutoCSer 的 TCP 服务设计是基于函数原型定义的,目标是让远程函数调用和本地函数调用一样简单,并尽可能的保留常用的本地函数特性。
框架根据应用场景分为内部静态服务内部实例服务开放服务
内部服务开放服务的默认配置参数与防御攻击策略不同。
内部服务默认配置:数据缓冲区 64KB,最大发送数据缓冲区 1MB,验证超时 4s,客户端失败重连时间 10ms,批量输出休眠等待时间 0ms,使用二进制序列化,服务端开启线程输出,客户端启动时创建连接,支持服务注册
开放服务默认配置:数据缓冲区 8KB,服务端最大发送数据缓冲区 8KB,验证超时 9s,客户端失败重连时间 1s,批量输出休眠等待时间 1ms,使用 JSON 序列化,服务端同步输出,客户端在第一次访问时创建连接,客户端最大自定义数据包为 16KB
该功能需要在工程项目中配置静态代码生成

内部静态服务

内部静态服务的远程调用函数(只支持 静态函数 / 静态属性 / 静态字段)可以分布在同一个程序集的各个 class 中,用于整合大量零碎的远程调用函数,而无需定义一个单独的服务类型。

1. 在需要支持远程函数调用的 class 定义中添加 partial 修饰符,如果该 class 是一个嵌套类型,需要给所有上级 class 都添加 partial 修饰符,因为静态代码生成需要与它公用同一个类型以访问远程函数。

2. 给 class 添加 TCP 服务申明配置 [AutoCSer.Net.TcpStaticServer.Server(Name = "SERVER")],必须指定所属服务名称,该名称必须符合 C# 类型命名规范,因为静态代码生成需要使用它作为服务类型名称使用。
同一个服务名称的多个 TCP 服务申明配置,有且只能有其中一个绑定为该 TCP 服务配置 IsServer = true,其它申明配置仅用于通知静态代码生成模块该 class 中存在需要静态代码生成处理的远程函数。

3. 给函数添加 TCP 远程函数申明配置 [AutoCSer.Net.TcpStaticServer.Method(ServerName = "SERVER")],为了防止调用者混淆远程函数与本地函数产生误调用,默认配置下远程函数必须对于其它程序集不可见(private / protected / internal)
如果没有指定所属服务名称 ServerName,则默认配置为当前 class 的 TCP 服务申明配置中指定的服务名称。

4. 给该工程项目配置静态代码生成并编译项目,然后将生成的 TCP 代理层代码源文件 {项目名称}.AutoCSer.cs 添加到项目中。

. 支持函数成员选择配置,默认选择其它程序集不可见函数成员,而且必须申明 TCP 远程函数配置 [AutoCSer.Net.TcpStaticServer.Method]

无需 TCP 远程函数申明配置 参考示例 AutoCSer\Example\TcpStaticServer\NoAttribute.cs
公共函数支持 参考示例 AutoCSer\Example\TcpStaticServer\Static.cs

. 支持静态字段与可读静态属性,默认支持取值操作,不支持赋值操作

字段支持 参考示例 AutoCSer\Example\TcpStaticServer\Field.cs
可读属性支持 参考示例 AutoCSer\Example\TcpStaticServer\Property.cs

. 同步函数支持 ref / out 参数。

参考示例 AutoCSer\Example\TcpStaticServer\RefOut.cs

. 同步函数支持客户端异步模式,不支持 ref / out 参数。

参考示例 AutoCSer\Example\TcpStaticServer\ClientAsynchronous.cs

同步函数在 .NET 4.5 环境下支持 async Task / await,await 不支持 ref / out 参数,.NET 2.0 / .NET 4.0 环境中采用同步模拟兼容实现。
参考示例 AutoCSer\Example\TcpStaticServer\ClientTaskAsync.cs

. 对于没有返回值且可靠性要求不高的需求,同步函数支持仅发送请求模式(无需服务端响应),返回值类型必须为 void,不支持 ref / out 参数。

参考示例 AutoCSer\Example\TcpStaticServer\SendOnly.cs

. 支持异步回调,返回值类型必须为 void,不支持 ref / out 参数,最后一个参数类型必须是委托 Func<AutoCSer.Net.TcpServer.ReturnValue, bool> 或者 Func<AutoCSer.Net.TcpServer.ReturnValue<returnType>, bool>
服务端必须保证该回调委托被执行,该委托的返回值表示回调数据是否成功添加到发送队列中,失败可能意味着该连接已经关闭。

参考示例 AutoCSer\Example\TcpStaticServer\Asynchronous.cs

. 支持异步回调注册,也就是说客户端一个请求,服务器端可以任意多次回调回应,服务端被动推送是典型的应用场景。

参考示例 AutoCSer\Example\TcpStaticServer\KeepCallback.cs

. 简单序列化模式,采用二进制序列化模式时,输入输出参数类型如果全部属于以下类型,将默认开启简单序列化模式以提升序列化性能,否则将使用支持循环引用与成员选择的通用二进制序列化
bool, byte, sbyte, short, ushort, int, uint, long, ulong, float, double, decimal, char, DateTime, Guid, string
bool?, byte?, sbyte?, short?, ushort?, int?, uint?, long?, ulong?, float?, double?, decimal?, char?, DateTime?, Guid?, enum

由于 内部静态服务内部实例服务 对于性能影响的区别仅仅在于静态函数与实例函数调用的差别,不存在本质性的差别,所以性能测试项目请参考 内部实例服务

内部实例服务

内部实例服务只支持实例方法,需要定义一个服务类 class ,用于整合少量的远程调用函数,服务的客户端也是一个单独的类型。

1. 在服务类 class 定义中添加 partial 修饰符,如果该 class 是一个嵌套类型,需要给所有上级 class 都添加 partial 修饰符,因为静态代码生成需要与它公用同一个类型以访问远程函数。

2. 给 class 添加 TCP 服务申明配置 [AutoCSer.Net.TcpInternalServer.Server(Host = "127.0.0.1", Port = 12345)]

3. 给实例方法添加 TCP 远程函数申明配置 [AutoCSer.Net.TcpServer.Method],为了防止调用者混淆远程函数与本地函数产生误调用,默认配置下远程函数必须对于其它程序集不可见(private / protected / internal)

4. 给该工程项目配置静态代码生成并编译项目,然后将生成的 TCP 代理层代码源文件 {项目名称}.AutoCSer.cs 添加到项目中。

. 支持函数成员选择配置,默认选择其它程序集不可见函数成员,而且必须申明 TCP 远程函数配置 [AutoCSer.Net.TcpServer.Method]

无需 TCP 远程函数申明配置 参考示例 AutoCSer\Example\TcpInternalServer\NoAttribute.cs
公共函数支持 参考示例 AutoCSer\Example\TcpInternalServer\Static.cs

. 支持静态字段与可读静态属性,默认支持取值操作,不支持赋值操作

字段支持 参考示例 AutoCSer\Example\TcpInternalServer\Field.cs
可读属性支持 参考示例 AutoCSer\Example\TcpInternalServer\Property.cs

. 同步函数支持 ref / out 参数。

参考示例 AutoCSer\Example\TcpInternalServer\RefOut.cs

. 同步函数支持客户端异步模式,不支持 ref / out 参数。

参考示例 AutoCSer\Example\TcpInternalServer\ClientAsynchronous.cs

同步函数在 .NET 4.5 环境下支持 async Task / await,await 不支持 ref / out 参数,.NET 2.0 / .NET 4.0 环境中采用同步模拟兼容实现。
参考示例 AutoCSer\Example\TcpInternalServer\ClientTaskAsync.cs

. 对于没有返回值且可靠性要求不高的需求,同步函数支持仅发送请求模式(无需服务端响应),返回值类型必须为 void,不支持 ref / out 参数。

参考示例 AutoCSer\Example\TcpInternalServer\SendOnly.cs

. 支持异步回调,返回值类型必须为 void,不支持 ref / out 参数,最后一个参数类型必须是委托 Func<AutoCSer.Net.TcpServer.ReturnValue, bool> 或者 Func<AutoCSer.Net.TcpServer.ReturnValue<returnType>, bool>
服务端必须保证该回调委托被执行,该委托的返回值表示回调数据是否成功添加到发送队列中,失败可能意味着该连接已经关闭。

参考示例 AutoCSer\Example\TcpInternalServer\Asynchronous.cs

. 支持异步回调注册,也就是说客户端一个请求,服务器端可以任意多次回调回应,服务端被动推送是典型的应用场景。

参考示例 AutoCSer\Example\TcpInternalServer\KeepCallback.cs

. 简单序列化模式,采用二进制序列化模式时,输入输出参数类型如果全部属于以下类型,将默认开启简单序列化模式以提升序列化性能,否则将使用支持循环引用与成员选择的通用二进制序列化
bool, byte, sbyte, short, ushort, int, uint, long, ulong, float, double, decimal, char, DateTime, Guid, string
bool?, byte?, sbyte?, short?, ushort?, int?, uint?, long?, ulong?, float?, double?, decimal?, char?, DateTime?, Guid?, enum

性能测试项目
AutoCSer\TestCase\TcpServerPerformance\AutoCSer.TestCase.TcpInternalServerPerformance
AutoCSer\TestCase\TcpClientPerformance\AutoCSer.TestCase.TcpInternalClientPerformance
TCP 函数服务框架 内部服务 吞吐性能测试

开放服务

开放服务只支持实例方法,需要定义一个服务类 class ,用于整合少量的远程调用函数,服务的客户端也是一个单独的类型。

1. 在服务类 class 定义中添加 partial 修饰符,如果该 class 是一个嵌套类型,需要给所有上级 class 都添加 partial 修饰符,因为静态代码生成需要与它公用同一个类型以访问远程函数。

2. 给 class 添加 TCP 服务申明配置 [AutoCSer.Net.TcpOpenServer.Server(Host = "127.0.0.1", Port = 12345)]

3. 给实例方法添加 TCP 远程函数申明配置 [AutoCSer.Net.TcpOpenServer.Method],为了防止调用者混淆远程函数与本地函数产生误调用,默认配置下远程函数必须对于其它程序集不可见(private / protected / internal)

4. 给该工程项目配置静态代码生成并编译项目,然后将生成的 TCP 代理层代码源文件 {项目名称}.AutoCSer.cs 添加到项目中。

. 支持函数成员选择配置,默认选择其它程序集不可见函数成员,而且必须申明 TCP 远程函数配置 [AutoCSer.Net.TcpServer.Method]

无需 TCP 远程函数申明配置 参考示例 AutoCSer\Example\TcpOpenServer\NoAttribute.cs
公共函数支持 参考示例 AutoCSer\Example\TcpOpenServer\Static.cs

. 支持静态字段与可读静态属性,默认支持取值操作,不支持赋值操作

字段支持 参考示例 AutoCSer\Example\TcpOpenServer\Field.cs
可读属性支持 参考示例 AutoCSer\Example\TcpOpenServer\Property.cs

. 同步函数支持 ref / out 参数。

参考示例 AutoCSer\Example\TcpOpenServer\RefOut.cs

. 同步函数支持客户端异步模式,不支持 ref / out 参数。

参考示例 AutoCSer\Example\TcpOpenServer\ClientAsynchronous.cs

同步函数在 .NET 4.5 环境下支持 async / await,不支持 ref / out 参数。
参考示例 AutoCSer\Example\TcpOpenServer\ClientTaskAsync.cs

. 对于没有返回值且可靠性要求不高的需求,同步函数支持仅发送请求模式(无需服务端响应),返回值类型必须为 void,不支持 ref / out 参数。

参考示例 AutoCSer\Example\TcpOpenServer\SendOnly.cs

. 支持异步回调,返回值类型必须为 void,不支持 ref / out 参数,最后一个参数类型必须是委托 Func<AutoCSer.Net.TcpServer.ReturnValue, bool> 或者 Func<AutoCSer.Net.TcpServer.ReturnValue<returnType>, bool>
服务端必须保证该回调委托被执行,该委托的返回值表示回调数据是否成功添加到发送队列中,失败可能意味着该连接已经关闭。

参考示例 AutoCSer\Example\TcpOpenServer\Asynchronous.cs

. 支持异步回调注册,也就是说客户端一个请求,服务器端可以任意多次回调回应,服务端被动推送是典型的应用场景。

参考示例 AutoCSer\Example\TcpOpenServer\KeepCallback.cs

. 简单序列化模式,采用二进制序列化模式时,输入输出参数类型如果全部属于以下类型,将默认开启简单序列化模式以提升序列化性能,否则将使用支持循环引用与成员选择的通用二进制序列化
bool, byte, sbyte, short, ushort, int, uint, long, ulong, float, double, decimal, char, DateTime, Guid, string
bool?, byte?, sbyte?, short?, ushort?, int?, uint?, long?, ulong?, float?, double?, decimal?, char?, DateTime?, Guid?, enum

性能测试项目
AutoCSer\TestCase\TcpServerPerformance\AutoCSer.TestCase.TcpOpenServerPerformance
AutoCSer\TestCase\TcpClientPerformance\AutoCSer.TestCase.TcpOpenClientPerformance
TCP 函数服务框架 开放服务 吞吐性能测试

. 简单序列化模式,采用二进制序列化模式时,输入输出参数类型如果全部属于以下类型,将默认开启简单序列化模式以提升序列化性能,否则将使用支持循环引用与成员选择的通用二进制序列化
bool, byte, sbyte, short, ushort, int, uint, long, ulong, float, double, decimal, char, DateTime, Guid, string
bool?, byte?, sbyte?, short?, ushort?, int?, uint?, long?, ulong?, float?, double?, decimal?, char?, DateTime?, Guid?, enum