一、概述
davyxu/cellnet是一个组件化、高扩展性、高性能的开源服务器网络库,用golang语言开发。它提供了一套简单而强大的工具和组件,用于构建高性能的网络应用程序。
二、特性
cellnet具有以下几个特征:
- 强大的网络通信框架:davyxu/cellnet 提供了一套基于事件驱动的网络通信框架,简化了网络编程的复杂性。并且它支持多种常见的网络协议,如 TCP、UDP 和 KCP。
- 模块化设计:该库采用了模块化的设计,允许根据需要选择和组合各种模块,以构建适合特定需求的网络应用。它提供了诸如连接管理、消息编解码、会话管理等多个模块,可用于构建灵活和可扩展的网络应用程序。
- 支持消息序列化:cellnet库提供了消息的编解码的功能,可将结构化的数据转换为字节流进行网络传输,之后在接收端对消息进行反序列化。它支持多种常见的消息序列化格式,如 JSON、ProtoBuf 和 MessagePack。
- 高性能:davyxu/cellnet 通过优化和精心设计的网络协议栈,提供了出色的性能。
三、 RPC
远程过程调用(Remote Procedure Call,简称 RPC)是一种通信机制,用于在不同的计算机或进程之间进行远程通信和调用远程函数或方法。它使得像本地函数调用一样方便地调用远程计算机上的函数,隐藏了底层网络通信的细节。
在分布式系统中,各个节点分布在不同的物理或虚拟机器上,通过RPC可以实现节点之间的通信和协调。很多时候业务模块的设计会使用分布式架构,这个时候不同子模块之间的通信就可以通过RPC来进行实现。
davyxu/cellnet 包提供了对远程过程调用(RPC)的支持。通过该库,可以在网络应用程序中实现基于消息的远程调用。davyxu/cellnet 的 RPC 实现基于消息传递的思想。可以定义特定的消息类型来表示远程调用的请求和响应,然后通过网络进行传输。
使用 davyxu/cellnet 实现 RPC 调用的一般步骤如下:
- 定义远程接口:通过定义接口的方式来描述远程过程,接口中的方法对应着要远程调用的过程。
- 注册远程服务:将实现远程接口的结构体注册为 RPC 服务,使其能够被远程调用。
- 启动服务端:在服务端程序中,使用 davyxu/cellnet 提供的方法启动服务端,监听网络请求。
- 创建客户端:在客户端程序中,使用 davyxu/cellnet 提供的方法创建一个连接到服务端的客户端。
- 远程调用:通过客户端调用远程服务的方法,发起远程调用请求。
- 响应处理:在服务端接收到远程调用请求后,执行对应的远程过程,并将结果返回给客户端。
- 客户端接收响应:客户端接收到服务端返回的远程调用结果。
cellnet实现RPC调用具有简单灵活的特点,是一个实用性非常好的库。
四、 cellnet RPC调用示例
下面用代码来展示cellnet RPC远程调用的方式
服务端代码:
客户端代码:
以上示例代码展示了使用cellnet库实现一个简单的 RPC 调用过程。服务端注册了一个名为 HelloService 的远程服务,并实现了 SayHello 方法。客户端通过注册地址127.0.0.1:8801连接到服务端后,创建了远程服务代理,并通过内置Call()函数调用了 SayHello 方法。服务端接收到调用请求后执行对应的方法,并将结果返回给客户端。
在发送方将消息发送之前,需要将消息数据编码为二进制或其他传输格式。这可以通过使用消息编码器来实现。
cellnet 提供了多种编码器,如XMLEncoder、ProtobufEncoder、JSONEncoder 等,可以根据需求选择适合的消息格式的编码器。
cellnet库实现RPC通信的方式非常简单,代码也很简洁,使用十分便利。
五、 cellnet实现RPC通信中遇到的坑
本人在几个模块组件中用到了cellnet库,在使用过程中,踩过部分坑,以下两点需要尤其注意:
- 事件循环的合理管理:davyxu/cellnet 使用事件循环来处理网络事件和消息处理。编辑代码的时候要确保在适当的地方启动和停止事件循环,并正确处理事件的派发。在不需要进行RPC通信后应该及时关闭循环,防止消息处理失败或者导致网络连接问题。
- 消息大小: cellnet 实现RPC通信最大消息是有默认字节数限制的,超过这个大小程序会报错,如果需要修改,则可以通过MaxPacketSize参数来进行设置。并且如果RPC通信的消息很大,则不建议使用这个开源库。