彬哥Go语言笔记Golang语言社区Go语言游戏服务器相关

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版本号

上一篇下一篇

猜你喜欢

热点阅读