为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 机制的支持建立连接,断开连接(被动),关闭连接(主动)的回调


为skynet_fly新增远程调用方式
https://huahua132.github.io/2024/05/03/think/srpc/
作者
huahua132
发布于
2024年5月3日
许可协议