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