Skip to content

Commit

Permalink
编写ClientBase的典型应用架构说明
Browse files Browse the repository at this point in the history
  • Loading branch information
nnhy committed Jun 26, 2024
1 parent 78e1e9d commit dfe6dde
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 19 deletions.
18 changes: 15 additions & 3 deletions NewLife.Remoting/Clients/ClientBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,28 @@
namespace NewLife.Remoting.Clients;

/// <summary>应用客户端基类。实现对接目标平台的登录、心跳、更新和指令下发等场景操作</summary>
/// <remarks>
/// 典型应用架构:
/// 1,RPC应用架构
/// 客户端ApiClient通过Tcp/Udp等协议连接服务端ApiServer,进行登录、心跳和更新等操作,服务端直接下发指令。
/// 例如蚂蚁调度,客户端使用应用编码和密钥登录后,获得令牌,后续无需验证令牌,直到令牌过期,重新登录。
/// 2,Http应用架构
/// 客户端ApiHttpClient通过Http/Https协议连接服务端WebApi,进行登录、心跳和更新等操作,服务端通过WebSocket下发指令。
/// 例如ZeroIot,客户端使用设备编码和密钥登录后,获得令牌,后续每次请求都需要带上令牌,在心跳时维持WebSocket长连接。
/// 3,OAuth应用架构
/// 客户端ApiHttpClient通过Http/Https协议连接服务端WebApi,进行OAuth登录,获得令牌,后续每次请求都需要带上令牌。
/// 例如星尘AppClient,AppId和AppSecret进行OAuth登录后,获得令牌,后续每次请求都需要带上令牌。
/// </remarks>
public abstract class ClientBase : DisposeBase, IApiClient, ICommandClient, IEventProvider, ITracerFeature, ILogFeature
{
#region 属性
/// <summary>服务端地址。支持http/tcp/udp,多地址逗号分隔</summary>
public String? Server { get; set; }

/// <summary>应用标识</summary>
/// <summary>编码。设备编码DeviceCode,或应用标识AppId</summary>
public String? Code { get; set; }

/// <summary>应用密钥</summary>
/// <summary>密钥。设备密钥DeviceSecret,或应用密钥AppSecret</summary>
public String? Secret { get; set; }

/// <summary>密码提供者</summary>
Expand Down Expand Up @@ -569,7 +581,7 @@ protected virtual void StartTimer()
if (_timer == null)
{
if (Features.HasFlag(Features.Ping) || Features.HasFlag(Features.Notify))
_timer = new TimerX(OnPing, null, 100, 60_000, "Client") { Async = true };
_timer = new TimerX(OnPing, null, 1000, 60_000, "Client") { Async = true };

if (Features.HasFlag(Features.Upgrade))
_timerUpgrade = new TimerX(s => Upgrade(), null, 5_000, 600_000, "Client") { Async = true };
Expand Down
48 changes: 32 additions & 16 deletions Readme.MD
Original file line number Diff line number Diff line change
Expand Up @@ -15,40 +15,56 @@
源码: https://github.com/NewLifeX/NewLife.Remoting
Nuget:NewLife.Remoting / NewLife.Remoting.Extensions

# 组织架构
## RPC框架
# 系统架构
## RPC架构
客户端:ApiClient
服务端:ApiServer
应用客户端:ClientBase
特点:
1. 服务端根据Action把请求转发给各个Controller,用法跟WebApi一致。
2. 简单高性能,网络库上来就是二进制序列化,中间没有任何损耗
3. TCP/UDP长会话,支持主动下发
4. 最高连接,单机400万TCP长连接
5. 常见吞吐,单机10万TPS,最高2266万TPS
6. 可寄宿于控制台、Web项目、桌面应用、IoT嵌入式应用
2. 简单高性能,通信报文使用二进制序列化,中间没有任何损耗
3. 接口出入参支持灵活的Json序列化(常规接口),同时也支持高效的二进制序列化(图片视频)
4. TCP/UDP长会话,服务端支持主动下发消息
5. 最高连接,单机400万TCP长连接
6. 常见吞吐,单机10万TPS,最高2266万TPS
7. 服务端可寄宿于控制台、Web项目、桌面应用、IoT嵌入式应用
8. 支持集群部署横向扩展,每个客户端跟其中一个服务端维持长连接

## WebApi框架
代表性应用(蚂蚁调度AntJob):

1. 客户端AntClient继承自ClientBase,通过Tcp/Udp等协议连接服务端ApiServer,进行登录、心跳等操作。
2. 客户端使用应用AppId和AppSecret登录,获得令牌,后续无需携带或验证令牌,直到令牌过期重新登录。




## HTTP架构
客户端:ApiHttpClient
服务端:ASP.NET WebApi
应用客户端:ClientBase
应用服务端:BaseDeviceController
特点:
1. 标准ASP.NET WebApi作为服务端,重用原有技术栈。

2. 客户端ApiHttpClient是标准HttpClient的进一步封装,支持多服务端地址。
1. 标准ASP.NET WebApi作为服务端,重用原有技术栈。
2. 客户端ApiHttpClient是标准HttpClient的进一步封装,支持多服务端地址负载均衡。
3. 默认通信使用Json序列化,不适合传输文件、图片和视频等二进制数据。
4. 服务端提供BaseController基类,封装了令牌验证等鉴权机制
5. 服务端提供BaseDeviceController基类,封装常见的登录、心跳和更新等接口
6. 通过WebSocket长连接实现指令下发,心跳保活
7. 常见吞吐,单机1万TPS
8. 服务端仅寄宿于 Kestrel和IIS
9. 支持集群部署横向扩展,客户端每次请求都可能分流到不同应用服务器

3. 服务端提供BaseController基类,封装了令牌验证等鉴权机制
代表性应用(轻量级IoT平台ZeroIoT):

4. 服务端提供BaseDeviceController基类,封装常见的登录、心跳和更新等接口
1. 客户端HttpDevice继承自ClientBase,通过Http/Https协议连接服务端WebApi,进行登录、注销、心跳和更新等操作。
2. 客户端使用设备DeviceCode和DeviceSecret登录,获得令牌,后续每次请求头都需要带上令牌。
3. 在心跳时检测并维持WebSocket长连接。

5. 通过WebSocket长连接实现指令下发,心跳保活

6. 常见吞吐,1万TPS



# 目标定位
# SRMP协议
在分布式系统中,RPC尤为重要。SRMP是新生命团队专门为了RPC框架而设计的通信协议,既支持内网高速通信,也能覆盖物联网嵌入式设备。

经过十多年实战经验积累以及多方共同讨论,新生命团队([https://newlifex.com](https://newlifex.com))制订了一种简单而又具有较好扩展性的RPC(Remote Procedure Call)协议。
Expand Down

0 comments on commit dfe6dde

Please sign in to comment.