美文网首页LollipopGo游戏服务器框架
LollipopGo:DB反向代理服务器

LollipopGo:DB反向代理服务器

作者: Golang语言社区 | 来源:发表于2020-10-04 18:01 被阅读0次

    DB反向代理服务器

    游戏服务器开发过程中,整个服务器的架构设计对于项目的影响是至关重要的,其中包括登录流程,消息机制流程,消息加密流程 内部服务器消息跳转,定时任务等。 centos 系统为例,给大家梳理下游戏架构的基础设计思想。

    如何设计

    1. DB数据库反向代理,属于内网权限访问,与外网隔离
    2. 提供功能主要是处理数据库的读写等,例如 登录服务器的反向代理,主要是用户的信息的校验。而游戏组的DB
    反向代理,是提供游戏数据的保存等,所以正常情况下,DB反向代理在每组服务器组中是2组DB反向代理服务器。
    3. DB方向代理还有一个功能,可以动态切换不同数据库:redis,mongo,mysql等
    4. DB反向代理服务器开发人员只提供接口即可
    5. DB反向代理服务器与所有的服务器通信都采用异步RPC通信
    

    流程分析

    1. 整个流程都比较简单,主要是提供数据接口服务
    2. 建议每组物理机上部署2组DB数据库反向代理,主要是针对不等同的业务逻辑
    3. 建议在处理数据时候,保证处理数据的频率,防止恶意访问
    

    实例代码

    // 主函数
    func main()  {
        conf.InitConfig()
        Mysyl_DB.Init()
        MainListener(conf.GetConfig().Server.WSAddr)
    }
    
    // 监听
    func MainListener(strport string) {
        rpcRegister()
        tcpAddr, err := net.ResolveTCPAddr("tcp", ":"+strport)
        checkError(err)
        Listener, err := net.ListenTCP("tcp", tcpAddr)
        checkError(err)
    
        for {
            defer func() {
                if err := recover(); err != nil {
                    strerr := fmt.Sprintf("%s", err)
                    fmt.Println("异常捕获:", strerr)
                }
            }()
            conn, err := Listener.Accept()
            if err != nil {
                fmt.Fprint(os.Stderr, "accept err: %s", err.Error())
                continue
            }
            go jsonrpc.ServeConn(conn)
        }
    }
    
    // RPC注册
    func rpcRegister() {
        _ = rpc.Register(new(ac_game.AcRPC))
        _ = rpc.Register(new(cf_game.CfRPC))
        _ = rpc.Register(new(game.GameRPC))
    }
    
    // RPC获取登录数据的例子
    func (this *AcRPC) GetUserLogin(data *twlib_proto.C2SUserLogin, reply *twlib_user.UserSt) error {
        sql := "select id,avatar,name,sex,lev,areacur from ac_account where loginname='" + data.AccountName + "' AND loginpw='" + data.AccountPw + "'"
        fmt.Println(sql)
        rows, err := GetAcGameConn().Query(sql)
        defer rows.Close()
        if err != nil {
            return err
        }
        recliner := twlib_user.UserSt{}
        for rows.Next() {
            rows.Scan(&recliner.RoleUid, &recliner.RoleAvatar, &recliner.RoleName, &recliner.RoleSex, &recliner.RoleLev,
                &recliner.RoleAvatar)
            recliner.ChannelId, _ = strconv.Atoi(recliner.LatestArea)
        }
        fmt.Println(recliner)
        recliner.ServerList = this.GetAreacur(0, nil)
        *reply = recliner
        return nil
    }
        
    

    注意事项

    1. 反向代理服务器启动顺序
    以LollipopGo分布式游戏架构为例:
    1. DB反向代理服务器一定是在所有服务器前启动,主要是注册到反向代理服务器
    2. 数据库可以采用集群形式部署,具体看实际项目,如果有不懂的可以直接联系我
    

    相关文章

      网友评论

        本文标题:LollipopGo:DB反向代理服务器

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