LollipopGo:DB反向代理服務(wù)器

DB反向代理服務(wù)器

游戲服務(wù)器開發(fā)過程中,整個服務(wù)器的架構(gòu)設(shè)計對于項目的影響是至關(guān)重要的,其中包括登錄流程,消息機制流程,消息加密流程 內(nèi)部服務(wù)器消息跳轉(zhuǎn),定時任務(wù)等。 centos 系統(tǒng)為例,給大家梳理下游戲架構(gòu)的基礎(chǔ)設(shè)計思想。

如何設(shè)計

1. DB數(shù)據(jù)庫反向代理,屬于內(nèi)網(wǎng)權(quán)限訪問,與外網(wǎng)隔離
2. 提供功能主要是處理數(shù)據(jù)庫的讀寫等,例如 登錄服務(wù)器的反向代理,主要是用戶的信息的校驗。而游戲組的DB
反向代理,是提供游戲數(shù)據(jù)的保存等,所以正常情況下,DB反向代理在每組服務(wù)器組中是2組DB反向代理服務(wù)器。
3. DB方向代理還有一個功能,可以動態(tài)切換不同數(shù)據(jù)庫:redis,mongo,mysql等
4. DB反向代理服務(wù)器開發(fā)人員只提供接口即可
5. DB反向代理服務(wù)器與所有的服務(wù)器通信都采用異步RPC通信

流程分析

1. 整個流程都比較簡單,主要是提供數(shù)據(jù)接口服務(wù)
2. 建議每組物理機上部署2組DB數(shù)據(jù)庫反向代理,主要是針對不等同的業(yè)務(wù)邏輯
3. 建議在處理數(shù)據(jù)時候,保證處理數(shù)據(jù)的頻率,防止惡意訪問

實例代碼

// 主函數(shù)
func main()  {
    conf.InitConfig()
    Mysyl_DB.Init()
    MainListener(conf.GetConfig().Server.WSAddr)
}

// 監(jiān)聽
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獲取登錄數(shù)據(jù)的例子
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. 反向代理服務(wù)器啟動順序
以LollipopGo分布式游戲架構(gòu)為例:
1. DB反向代理服務(wù)器一定是在所有服務(wù)器前啟動,主要是注冊到反向代理服務(wù)器
2. 數(shù)據(jù)庫可以采用集群形式部署,具體看實際項目,如果有不懂的可以直接聯(lián)系我
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

友情鏈接更多精彩內(nèi)容