组件分享之后端组件——组件化、高扩展性、高性能的开源服务器网络库cellnet
背景
近期正在探索前端、后端、系统端各类常用组件与工具,对其一些常见的组件进行再次整理一下,形成标准化组件专题,后续该专题将包含各类语言中的一些常用组件。欢迎大家进行持续关注。
组件基本信息
- 组件:cellnet
- 开源协议:MIT License
内容
本节我们进行分享一个组件化、高扩展性、高性能的开源服务器网络库cellnet,以下是其官方介绍的应用领域:
主要使用领域:
游戏服务器
方便定制私有协议,快速构建逻辑服务器、网关服务器、服务器间互联互通、对接第三方SDK、转换编码协议等
ARM设备
设备间网络通讯
证券软件
内部RPC
它能让我们在建立一些TCP连接器时进行有效重连、优化重启,其架构可以参考下图
image.png
使用案例如下:
const peerAddress = "127.0.0.1:17701"
// 服务器逻辑
func server() {
// 创建服务器的事件队列,所有的消息,事件都会被投入这个队列处理
queue := cellnet.NewEventQueue()
// 创建一个服务器的接受器(Acceptor),接受客户端的连接
peerIns := peer.NewGenericPeer("tcp.Acceptor", "server", peerAddress, queue)
// 将接受器Peer与tcp.ltv的处理器绑定,并设置事件处理回调
// tcp.ltv处理器负责处理消息收发,使用私有的封包格式以及日志,RPC等处理
proc.BindProcessorHandler(peerIns, "tcp.ltv", func(ev cellnet.Event) {
// 处理Peer收到的各种事件
switch msg := ev.Message().(type) {
case *cellnet.SessionAccepted: // 接受一个连接
fmt.Println("server accepted")
case *TestEchoACK: // 收到连接发送的消息
fmt.Printf("server recv %+v\n", msg)
// 发送回应消息
ev.Session().Send(&TestEchoACK{
Msg: msg.Msg,
Value: msg.Value,
})
case *cellnet.SessionClosed: // 会话连接断开
fmt.Println("session closed: ", ev.Session().ID())
}
})
// 启动Peer,服务器开始侦听
peerIns.Start()
// 开启事件队列,开始处理事件,此函数不阻塞
queue.StartLoop()
}
// 模拟客户端逻辑
func client() {
// 例子专用的完成标记
done := make(chan struct{})
// 创建客户端的事件处理队列
queue := cellnet.NewEventQueue()
// 创建客户端的连接器
peerIns := peer.NewGenericPeer("tcp.Connector", "client", peerAddress, queue)
// 将客户端连接器Peer与tcp.ltv处理器绑定,并设置接收事件回调
proc.BindProcessorHandler(peerIns, "tcp.ltv", func(ev cellnet.Event) {
switch msg := ev.Message().(type) {
case *cellnet.SessionConnected: // 已经连接上
fmt.Println("client connected")
ev.Session().Send(&TestEchoACK{
Msg: "hello",
Value: 1234,
})
case *TestEchoACK: //收到服务器发送的消息
fmt.Printf("client recv %+v\n", msg)
// 完成操作
done <- struct{}{}
case *cellnet.SessionClosed:
fmt.Println("client closed")
}
})
// 开启客户端Peer
peerIns.Start()
// 开启客户端队列处理
queue.StartLoop()
// 等待客户端收到消息
<-done
}
以上内容均来源于cellnet中的README,有需要的小伙伴可以进行点击深入了解,目前游戏领域使用还是比较多的。
本文声明:
88x31.png知识共享许可协议
本作品由 cn華少 采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。
网友评论