diff --git a/bin/cross.json b/bin/cross.json new file mode 100644 index 000000000..5ca6a6600 --- /dev/null +++ b/bin/cross.json @@ -0,0 +1,27 @@ +{ + "dfcross_2": { + "AreaId": "dfcross_2", + "LoaclDB": { + "RedisIsCluster": false, + "RedisAddr": [ + "10.0.0.9:10011" + ], + "RedisPassword": "li13451234", + "RedisDB": 12, + "MongodbUrl": "mongodb://10.0.0.9:10013", + "MongodbDatabase": "dreamfactory12" + }, + "ServiceList": { + "df03": { + "RedisIsCluster": false, + "RedisAddr": [ + "10.0.0.9:10011" + ], + "RedisPassword": "li13451234", + "RedisDB": 3, + "MongodbUrl": "mongodb://10.0.0.9:10013", + "MongodbDatabase": "dreamfactory3" + } + } + } +} \ No newline at end of file diff --git a/bin/gm.json b/bin/gm.json index d768ccf95..79ec98fc3 100644 --- a/bin/gm.json +++ b/bin/gm.json @@ -7,43 +7,23 @@ "BelongCrossServerId": "dfcross_2", "LoaclDB": { "RedisIsCluster": false, - "RedisAddr": ["10.0.0.9:10011"], + "RedisAddr": [ + "10.0.0.9:10011" + ], "RedisPassword": "li13451234", "RedisDB": 3, "MongodbUrl": "mongodb://10.0.0.9:10013", "MongodbDatabase": "dreamfactory3" }, - "CrossDB": { - "RedisIsCluster": false, - "RedisAddr": ["10.0.0.9:10011"], - "RedisPassword": "li13451234", - "RedisDB": 12, - "MongodbUrl": "mongodb://10.0.0.9:10013", - "MongodbDatabase": "dreamfactory12" - }, - "Services": [ - { - "ServiceType": "gateway", - "Host": "127.0.0.1", - "Port": 9571, - "Loglevel": 5, - "MaxAgeTime": 7, - "ListenPort": 7895 - }, - { - "ServiceType": "mainte", - "Host": "127.0.0.1", - "Port": 9572, - "Loglevel": 5, - "MaxAgeTime": 7, - "ListenPort": 7896 - }, - { - "ServiceType": "worker", - "Host": "127.0.0.1", - "Port": 9573, - "Loglevel": 5, - "MaxAgeTime": 7 - } + "Mainte": "127.0.0.1:7896", + "MaintePort": 9572, + "Gateways": [ + "127.0.0.1:7895" + ], + "GatewayPorts": [ + 9571 + ], + "Workers": [ + "127.0.0.1:9573" ] } \ No newline at end of file diff --git a/comm/gameconfig.go b/comm/gameconfig.go index 0b49da264..4981936c2 100644 --- a/comm/gameconfig.go +++ b/comm/gameconfig.go @@ -2,13 +2,18 @@ package comm //游戏区服配置 type GameConfig struct { - AreaId string //区服id 每个区服id都必须是唯一 - ConsulAddr []string //区服Consul - IsCross bool ///是否是跨区区服 - BelongCrossServerId string //所属跨服Id (区服id) 不是跨服区服才有效 - LoaclDB *DBConfig //本地db - CrossDB *DBConfig //跨服db - Services []*ServiceConfig //服务列表 可以配置多个gateway 和多个 worker ,只能有一个mainte + AreaId string //区服id 每个区服id都必须是唯一 + Loglevel int32 //日志文件输出级别 + MaxAgeTime int32 //日志文件保存时长 + ConsulAddr []string //区服Consul + IsCross bool ///是否是跨区区服 + BelongCrossServerId string //所属跨服Id (区服id) 不是跨服区服才有效 + LoaclDB *DBConfig //本地db + Mainte string //维护服 + MaintePort int //维护服通信端口 + Gateways []string //网关服务["127.0.0.1:7895"] + GatewayPorts []int //网关通信端口 + Workers []string //工作服 } //区服db配置 @@ -21,12 +26,11 @@ type DBConfig struct { MongodbDatabase string //数据库地址 } -//服务配置 -type ServiceConfig struct { - ServiceType string //服务类型:gateway(网关服务),worker(业务服务),mainte(维护服务) - Host string //运行主机ip - Port int32 //监控Prot - Loglevel int32 //日志文件输出级别 - MaxAgeTime int32 //日志文件保存时长 - ListenPort int32 //网关和维护服务 都需要提供http服务 所以需要监听端口 +//跨服服务列表配置 +type CrossConfigs map[string]*CrossConfig + +type CrossConfig struct { + AreaId string //区服id + LoaclDB *DBConfig //本地db + ServiceList map[string]*DBConfig } diff --git a/services/cmd/main.go b/services/cmd/main.go index 673c4ec00..a9b45d2c3 100644 --- a/services/cmd/main.go +++ b/services/cmd/main.go @@ -8,8 +8,11 @@ import ( "go_dreamfactory/lego/core" "go_dreamfactory/lego/sys/log" "io/ioutil" + "net" "os" "os/exec" + "strconv" + "strings" "time" "github.com/spf13/cobra" @@ -80,48 +83,41 @@ func start() { log.Error("读取区服配置失败!", log.Field{Key: "err", Value: err}) } else { var ( - maintes []*core.ServiceSttings = make([]*core.ServiceSttings, 0) + maintes *core.ServiceSttings workers []*core.ServiceSttings = make([]*core.ServiceSttings, 0) gateways []*core.ServiceSttings = make([]*core.ServiceSttings, 0) ) - for i, v := range config.Services { - if sseting, err := convertServiceSttings(config, i, v); err != nil { - log.Error("转换服务配置异常!", log.Field{Key: "v", Value: v}, log.Field{Key: "err", Value: err}) - return - } else { - if err = writeServiceConfig(fmt.Sprintf("./conf/%s.yaml", sseting.Id), sseting); err != nil { - log.Error("写入服务配置失败!", log.Field{Key: "sseting", Value: sseting}, log.Field{Key: "err", Value: err}) - return - } + if ss, err := rederServiceSttings(config); err != nil { + log.Error("转换服务配置异常!", log.Field{Key: "err", Value: err}) + } else { + for i, v := range ss { if *sindex == -1 || *sindex == i { - switch sseting.Type { + switch v.Type { case comm.Service_Gateway: //网关服务 - gateways = append(gateways, sseting) + gateways = append(gateways, v) break case comm.Service_Worker: //业务服务 - workers = append(workers, sseting) + workers = append(workers, v) break case comm.Service_Mainte: //维护服务 - maintes = append(maintes, sseting) + maintes = v break default: - err = fmt.Errorf("服务类型异常 stype:%s", sseting.Type) + err = fmt.Errorf("服务类型异常 stype:%s", v.Type) return } } } } - if len(maintes) > 1 { - log.Error("maintes服一个区服只能有一个!") - return - } + //优先启动 维护服 - for _, v := range maintes { - if err = startService(v); err != nil { - log.Error("启动服务失败!", log.Field{Key: "id", Value: v.Id}, log.Field{Key: "err", Value: err}) + if maintes != nil { + if err = startService(maintes); err != nil { + log.Error("启动服务失败!", log.Field{Key: "id", Value: maintes.Id}, log.Field{Key: "err", Value: err}) return } } + time.Sleep(time.Second * 3) // 业务服 for _, v := range workers { @@ -146,19 +142,63 @@ func stop() { if config, err := readergmconf(*cpath); err != nil { log.Error("读取区服配置失败!", log.Field{Key: "err", Value: err}) } else { - for i, v := range config.Services { - if sseting, err := convertServiceSttings(config, i, v); err != nil { - log.Error("转换服务配置异常!", log.Field{Key: "v", Value: v}, log.Field{Key: "err", Value: err}) - return - } else { + + if ss, err := rederServiceSttings(config); err != nil { + log.Error("转换服务配置异常!", log.Field{Key: "err", Value: err}) + } else { + for i, v := range ss { if *sindex == -1 || *sindex == i { - stopService(sseting) + stopService(v) } } + } } } +///转换区服配置到服务配置 +func rederServiceSttings(config *comm.GameConfig) (ss []*core.ServiceSttings, err error) { + ss = make([]*core.ServiceSttings, 0) + var ( + ip string + port int + n int + sseting *core.ServiceSttings + ) + if ip, port, err = parseaddr(config.Mainte); err != nil { + return + } else { + if sseting, err = convertServiceSttings(config, n, comm.Service_Mainte, ip, config.MaintePort, port); err != nil { + return + } + n++ + ss = append(ss, sseting) + } + for _, v := range config.Workers { + if ip, port, err = parseaddr(v); err != nil { + return + } else { + if sseting, err = convertServiceSttings(config, n, comm.Service_Worker, ip, port, 0); err != nil { + return + } + n++ + ss = append(ss, sseting) + } + } + for i, v := range config.Gateways { + if ip, port, err = parseaddr(v); err != nil { + return + } else { + if sseting, err = convertServiceSttings(config, n, comm.Service_Worker, ip, config.GatewayPorts[i], port); err != nil { + return + } + n++ + ss = append(ss, sseting) + } + } + return +} + //读取游戏配置文件 func readergmconf(path string) (config *comm.GameConfig, err error) { config = &comm.GameConfig{} @@ -179,19 +219,19 @@ func readergmconf(path string) (config *comm.GameConfig, err error) { } //转换游戏服务配置 -func convertServiceSttings(config *comm.GameConfig, id int, sconfig *comm.ServiceConfig) (sseting *core.ServiceSttings, err error) { +func convertServiceSttings(config *comm.GameConfig, id int, stype string, ip string, rport int, lport int) (sseting *core.ServiceSttings, err error) { sseting = &core.ServiceSttings{} sseting.Modules = make(map[string]map[string]interface{}) sseting.Sys = make(map[string]map[string]interface{}) sseting.Sys["rpcx"] = map[string]interface{}{ "ConsulServers": config.ConsulAddr, } - switch sconfig.ServiceType { + switch stype { case comm.Service_Gateway: //网关服务 sseting.Type = comm.Service_Gateway sseting.Sys["rpcx"]["RpcxStartType"] = 1 sseting.Modules["gateway"] = map[string]interface{}{ - "ListenPort": sconfig.ListenPort, + "ListenPort": lport, "SpanServiceTag": config.BelongCrossServerId, } break @@ -204,7 +244,7 @@ func convertServiceSttings(config *comm.GameConfig, id int, sconfig *comm.Servic sseting.Sys["rpcx"]["RpcxStartType"] = 0 sseting.Modules["web"] = map[string]interface{}{ "WebDir": "./dist", - "Port": sconfig.ListenPort, + "Port": lport, "Key": "@234%67g12q4*67m12#4l67!", } break @@ -214,13 +254,13 @@ func convertServiceSttings(config *comm.GameConfig, id int, sconfig *comm.Servic } sseting.Id = fmt.Sprintf("%s_s%d", config.AreaId, id) sseting.Tag = config.AreaId - sseting.Ip = sconfig.Host - sseting.Port = int(sconfig.Port) + sseting.Ip = ip + sseting.Port = rport sseting.Sys["log"] = map[string]interface{}{ "FileName": fmt.Sprintf("./log/%s.log", sseting.Id), - "Loglevel": sconfig.Loglevel, - "MaxAgeTime": sconfig.MaxAgeTime, + "Loglevel": config.Loglevel, + "MaxAgeTime": config.MaxAgeTime, } sseting.Sys["configure"] = map[string]interface{}{ "ConfigurePath": "./json", @@ -235,18 +275,6 @@ func convertServiceSttings(config *comm.GameConfig, id int, sconfig *comm.Servic "MongodbUrl": config.LoaclDB.MongodbUrl, "MongodbDatabase": config.LoaclDB.MongodbDatabase, } - if !config.IsCross { //不是跨服区服务 需要配置所属跨服db - sseting.Sys["db"]["Cross"] = map[string]interface{}{ - "Enabled": true, - "RedisIsCluster": config.CrossDB.RedisIsCluster, - "RedisAddr": config.CrossDB.RedisAddr, - "RedisPassword": config.CrossDB.RedisPassword, - "RedisDB": config.CrossDB.RedisDB, - "MongodbUrl": config.CrossDB.MongodbUrl, - "MongodbDatabase": config.CrossDB.MongodbDatabase, - } - } - return } @@ -321,3 +349,22 @@ func writeServiceConfig(filename string, sseting *core.ServiceSttings) (err erro } return } + +func parseaddr(addr string) (ip string, port int, err error) { + ss := strings.Split(addr, ":") + if len(ss) != 2 { + err = fmt.Errorf("addr:%s解析异常", addr) + return + } + address := net.ParseIP(ss[0]) + if address == nil { + err = fmt.Errorf("addr:%s解析异常 ip:%s 校验失败", addr, ss[0]) + return + } + ip = ss[0] + if port, err = strconv.Atoi(ss[1]); err != nil { + err = fmt.Errorf("addr:%s解析异常 port:%s 校验失败", addr, ss[1]) + return + } + return +}