LollipopGo游戏服务器--启动控制优化
2019-04-16 本文已影响0人
Golang语言社区
之前版本启动顺序,如下Windows下控制:
echo start
echo LoginServer:登录服务器启动(http)
start LollipopGo.exe 8891 DT
echo GateWay:网关服务器启动(websocket)
start LollipopGo.exe 8888 GW
echo DBServer:数据库服务器启动(rpc)
start LollipopGo.exe 8890 DB
echo Global Server:公共服务器启动(websocket,内服务)
start LollipopGo.exe 8894 GL
echo GM server :服务器启动(http)
start LollipopGo.exe 8892 GM
echo DSQ server :服务器启动(websocket)
echo LollipopGo.exe 8895 DSQ
exit
但是启动后我们会看到大量的log,虽然这些log后期回去掉;但是启动后发下很多log是在启动的时候出现的,如下
以DSQ服务器为例子:
var addrDSQ = flag.String("addrDSQ", "127.0.0.1:8888", "http service address") // 链接gateway
var ConnDSQ *websocket.Conn // 保存用户的链接信息,数据会在主动匹配成功后进行链接
var ConnDSQRPC *rpc.Client // 链接DB server
var DSQAllMap map[string]*RoomPlayerDSQ // 游戏逻辑存储
var DSQ_qi = []int{ // 1-8 A ;9-16 B ; 17 未翻牌; 18 已翻牌
Proto2.Elephant, Proto2.Lion, Proto2.Tiger, Proto2.Leopard, Proto2.Wolf, Proto2.Dog, Proto2.Cat, Proto2.Mouse,
Proto2.Mouse + Proto2.Elephant, Proto2.Mouse + Proto2.Lion, Proto2.Mouse + Proto2.Tiger, Proto2.Mouse + Proto2.Leopard,
Proto2.Mouse + Proto2.Wolf, Proto2.Mouse + Proto2.Dog, Proto2.Mouse + Proto2.Cat, 2 * Proto2.Mouse}
var cacheDSQ *cache2go.CacheTable
var DSQLeftTime int = 30
var DSQTimeSpeed = time.Millisecond * 2000
var TimeOutDSQ chan map[int]int64
type RoomPlayerDSQ struct {
RoomID int
IsRoomID bool
OpenIDA string
OpenIDB string
OpenIDA_Seat int // 默认是0; 1 表示坐下
OpenIDB_Seat int // 默认是0; 1 表示坐下
Default [4][4]int // 未翻牌的
ChessData [4][4]int // 棋盘数据
ReChessData [4][4]int // 重连棋盘数据
AChessNum int // A的剩余的棋子的数量
BChessNum int // B的剩余的棋子的数量
GoAround int // 回合,如果每人出10次都没有吃子,系统推送平局;第七个回合提示数据 第10局平局
LeftTime int // 剩余的时间
}
/*
-----------------------------------------
| |
| [0,0]01 [1,0]02 [2,0]03 [3,0]04 |
| |
| |
| [0,1]05 [1,1]06 [2,1]07 [3,1]08 |
| |
| |
| [0,2]09 [1,2]10 [2,2]11 [3,2]12 |
| |
| |
| [0,3]13 [1,3]14 [2,3]15 [3,3]16 |
| |
-----------------------------------------
*/
// 初始化操作
func init() {
TimeOutDSQ = make(chan map[int]int64, 10000)
//if strServerType == "DSQ" {
if !initDSQGateWayNet() {
fmt.Println("链接 gateway server 失败!")
return
}
fmt.Println("链接 gateway server 成功!")
// 初始化数据
initDSQNetRPC()
//}
return
}
func initDSQNetRPC() {
client, err := jsonrpc.Dial("tcp", service)
if err != nil {
log.Debug("dial error:", err)
}
ConnDSQRPC = client
cacheDSQ = cache2go.Cache("LollipopGo_DSQ")
}
func initDSQGateWayNet() bool {
fmt.Println("用户客户端客户端模拟!")
log.Debug("用户客户端客户端模拟!")
url := "ws://" + *addrDSQ + "/GolangLtd"
conn, err := websocket.Dial(url, "", "test://golang/")
if err != nil {
fmt.Println("err:", err.Error())
return false
}
ConnDSQ = conn
go GameServerReceiveDSQ(ConnDSQ)
initConnDSQ(ConnDSQ)
return true
}
func initConnDSQ(conn *websocket.Conn) {
fmt.Println("---------------------------------")
data := &Proto2.DSQ2GW_ConnServer{
Protocol: Proto.G_GameDSQ_Proto, // 游戏主要协议
Protocol2: Proto2.DSQ2GW_ConnServerProto2,
ServerID: util.MD5_LollipopGO("8895" + "DSQ server"),
}
fmt.Println(data)
PlayerSendToServer(conn, data)
return
}
因为存在每个服务器有init()函数,导致了启动时候出现大量无用的初始化数据,刚刚测试一个例子 如下:
26.png每个文件中只有 如下init函数:
package main
import (
"fmt"
)
func init() {
fmt.Println("AAAAA init")
}
测试结果:
27.png
测试结果可以看出,Windows下是按照文件顺序执行对应的init函数的,所有这个可以作为参考;在进一步优化我们的游戏服务器启动顺序;具体优化版本更新请查看github版本号