组件分享之后端组件——组件化、高扩展性、高性能的开源服务器网络库cellnet

背景

近期正在探索前端、后端、系统端各类常用组件与工具,对其一些常见的组件进行再次整理一下,形成标准化组件专题,后续该专题将包含各类语言中的一些常用组件。欢迎大家进行持续关注。

组件基本信息

内容

本节我们进行分享一个组件化、高扩展性、高性能的开源服务器网络库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 国际许可协议 进行许可。
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐