DB反向代理服務(wù)器
游戲服務(wù)器開發(fā)過程中铃辖,整個服務(wù)器的架構(gòu)設(shè)計(jì)對于項(xiàng)目的影響是至關(guān)重要的,其中包括登錄流程窖梁,消息機(jī)制流程赘风,消息加密流程 內(nèi)部服務(wù)器消息跳轉(zhuǎn),定時任務(wù)等纵刘。 centos 系統(tǒng)為例邀窃,給大家梳理下游戲架構(gòu)的基礎(chǔ)設(shè)計(jì)思想。
如何設(shè)計(jì)
1. DB數(shù)據(jù)庫反向代理假哎,屬于內(nèi)網(wǎng)權(quán)限訪問瞬捕,與外網(wǎng)隔離
2. 提供功能主要是處理數(shù)據(jù)庫的讀寫等鞍历,例如 登錄服務(wù)器的反向代理,主要是用戶的信息的校驗(yàn)肪虎。而游戲組的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. 建議每組物理機(jī)上部署2組DB數(shù)據(jù)庫反向代理钾挟,主要是針對不等同的業(yè)務(wù)邏輯
3. 建議在處理數(shù)據(jù)時候洁灵,保證處理數(shù)據(jù)的頻率饱岸,防止惡意訪問
實(shí)例代碼
// 主函數(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
}
注意事項(xiàng)
- 反向代理服務(wù)器啟動順序
以LollipopGo分布式游戲架構(gòu)為例:
1. DB反向代理服務(wù)器一定是在所有服務(wù)器前啟動掺出,主要是注冊到反向代理服務(wù)器
2. 數(shù)據(jù)庫可以采用集群形式部署,具體看實(shí)際項(xiàng)目苫费,如果有不懂的可以直接聯(lián)系我