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

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

作者: cn華少 | 来源:发表于2022-04-03 23:47 被阅读0次

    组件分享之后端组件——组件化、高扩展性、高性能的开源服务器网络库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 国际许可协议 进行许可。

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/rabqsrtx.html