为skynet_fly新增远程调用方式
前言
目前skynet_fly的远程调用方式,是采用了封装skynet的cluster 集群方式,每个连接都会有一个服务端有一个clusteragent 接收代理,客户端有一个sender 发送代理服务。再加上我封装的cluster_server和cluster_client,这样发送端和接收端就分别存在了2个代理服务。也就是说调用一个rpc请求会经过非常多次的打包解包流程。
发送者->cluster_client_m 一次打包解包。
cluster_client_m->clustersender 二次打包解包。
clustersender->clusteragent 三次打包解包。
clusteragent->clusterserver 4次解包。
clusterserver->接收者 4次打包,5次解包。
这一次远程rpc调用需要经过4次打包,5次解包,效率大大折扣。
而且基于cluster 的集群调用方式,并不好监听到建立连接,断开连接等等回调,没有这些机制,并不好做集群之间的数据同步。还有可靠的RPC和数据发送(没有连接断开的等待机制)。
实现方案
我会去掉clusteragent 和 clustersender两个服务。clusterserver作为服务端作为远程连接的入口,监听和管理所有的连接以及连接的rpc调用请求。clusterserver会解开大包,大包中包含着调用到哪个xx_m服务,用什么方式调用,之后在把小包传递到接收的服务进行解包,这样实现之后的流程就变成。
发送者->cluster_client_m 发送者打一次小包,再打一次大包
cluster_clinet->cluster_server 解析一次大包
cluster_server->接收者 解析一次小包
总共2次打包,2次解包 能提升一倍以上的效率,并且过程中的小包详细数据不必被反复打包解包了。
然后再cluster_client 中 实现 集群服务建立连接、断开连接的通知,再增加可靠的PRC、和send调用接口,这样就是一个比较完善的集群架构了。
关键词定义:
- 客户端 指rpc的调用方,以c为简称
- 服务端 指rpc的接收方,以s为简称
- cs2 表示客户端调用服务端
- s2c 表示服务器回应客户端
send call 等待连接建立后发送(可配置超时时间)
skynet cluster mode 方式,call 方法有个一直等待直到回应,感觉太粗暴了,不敢用,万一s端挂比了,c端也会因为大量累计call消息导致内存暴涨而挂逼,而且这种方式send并不支持。
集群中难免会遇到先启动服务却道调用后启动的服务,这时候往往会调用失败。
新增 sub/pub 机制的支持
服务之间往往需要同步一些数据
建立连接,断开连接(被动),关闭连接(主动)的回调
通常,业务层需要根据回调做一些事情,比如重新挂载sub监听,主动发送一些数据过去
大包分包处理
本来skynet cluster也支持
身份验证支持
集群组网,不一定都搭建在一个内网段中,如果端口对外开放,还是需要一定的身份验证支持来保证安全性
加密传输支持
端口对外开放,想进一步保证安全,防止篡改消息包,还需要加上加密传输支持
最终实现
版本1
实现了
- send call 等待连接建立后发送(可配置超时时间)
- 大包分包处理
frpc的打包方式借鉴了skynet cluster的打包方式,使其更适合skynet_fly,初版的frpc完全适配了之前的cluster-server的接口调用方式,可以做到无缝切换,在skynet_fly_demo进去切换时,只是全局替换了 cluster_server-frpc_server
, cluster_client-frpc_client
, cluster_client_m->frpc_client_m
,就可以了。
提供了一个握手过程,可用于后续支持身份验证支持,加密传输支持。
后续打算先实现 身份验证支持, 加密传输支持。
再考虑 新增 sub/pub 机制的支持, 建立连接,断开连接(被动),关闭连接(主动)的回调。