游戏服务器开发过程中,整个服务器的架构设计对于项目的影响是至关重要的,其中包括登录流程,消息机制流程,消息加密流程 内部服务器消息跳转,定时任务等。centos系统为例,给大家梳理下游戏架构的基础设计思想。
如何设计
1. 登录服务器通信方式:采用http或者https与游戏客户端进行信
2. 校验数据,游戏客户端发过来的数据是否正确,采用DBserver(数据库反向代理)校验,异步通信方式RPC
3. 数据通信格式:采用json,返回数据也同样是json
4. 每个功能采用的都是路由方式访问,彼此隔离
流程分析
1. 支持不同登录的方式,例如:第三方登录(微信、微博、QQ等),手机号注册,游客登录
2. 每个玩家登录成功后,会随机生成一个token,及代理服务器的地址(反向代理)
3. 玩家通过2步骤获取的数据,主动连接代理服务器的地址,发送tocken校验数据的正确
4. 校验成功,返回玩家的数据,同时进入游戏主界面,后端记录玩家此刻的游戏的状态
5. 以上只是粗略的简述流程,实际开发中要复杂一些
实例代码
// 主函数
func main() {
conf.InitConfig()
DB.DBInit()
http.HandleFunc("/"+conf.GetConfig().Server.URL+"/client/login", Login) // 登录流程
http.HandleFunc("/"+conf.GetConfig().Server.URL+"/client/register", Login) // 注册流程
http.HandleFunc("/"+conf.GetConfig().Server.URL+"/server/list", servers) // 获取区域列表
http.HandleFunc("/"+conf.GetConfig().Server.URL+"/server/login", GameToken) // 服务器校验,token数据流程
err := http.ListenAndServe(conf.GetConfig().Server.HTTPAddr, nil)
if err != nil {
glog.Errorln("http.ListenAndServe()函数执行错误,错误为:%v\n", err)
return
}
}
// 登录操作
func Login(w http.ResponseWriter, req *http.Request) {
w.Header().Set("Accss-Control-Allow-Origin", "*")
req.Header.Add("content-type", "charset=UTF-8")
// 获取账号密码
fmt.Println("req:",req)
if req.Method == "GET" {
if accountable := req.FormValue("AccountName"); accountable != "" {
if accountPw := req.FormValue("AccountPw"); accountPw != "" {
// 获取玩家数据
data := twlib_proto.C2SUserLogin{
AccountName: accountable,
AccountPw: util.MD5_LollipopGO(accountPw),
}
// 发送给DB sever 去验证数据
ulcerate := DbLogin(&data)
fmt.Println(ulcerate)
// token生成的机制 -- 19位时间戳 md5
stricken := util.GetNowtimeMD5_LollipopGO() // 时间19位时间
GMapUser[stricken] = ulcerate
rcdata := &msg.LoginData{
Token: stricken,
Url: ulcerate.LatestArea, // 默认新区,或者近期登录
ServerList: ulcerate.ServerList, // 30个区数据(分页是没30区一页)
}
// 确保登录正确
if ulcerate.RoleUid > 0 {
rcdata.AesKey = conf.GetConfig().Server.AesKey
}
// 返回客户端
sendData, _ := json.Marshal(rcdata)
replyJson(w, sendData)
return
}
}
replyJson(w, "parameter is wrong!")
}
}
注意事项
- 登录服务器tocken生成逻辑
以LollipopGo分布式游戏架构为例:
1. 采用底层库:LollipopGo/util
2. 调用方式:util.Md5_LollipopGO(动态的19位时间)
3. 19位时间生成函数:util.GetNowUnixNano_LollipopGo()
- 登录服务器的数据库设计
1. 测试前期登录服务器的数据库反向代理可以使用游戏逻辑架构中的服务
2. 预发布及上线期间需要分离,也就是登录服务器的数据和游戏逻辑数据不同,主要是考虑到性能及安全性
3. 登录服务器的数据库反向代理服务器建议增加redis缓存玩家数据,对应的玩家同时TTL可以设置