上传跨服配置代码
This commit is contained in:
parent
eea06bba53
commit
cd575f383d
27
bin/cross.json
Normal file
27
bin/cross.json
Normal file
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
46
bin/gm.json
46
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"
|
||||
]
|
||||
}
|
@ -3,12 +3,17 @@ package comm
|
||||
//游戏区服配置
|
||||
type GameConfig struct {
|
||||
AreaId string //区服id 每个区服id都必须是唯一
|
||||
Loglevel int32 //日志文件输出级别
|
||||
MaxAgeTime int32 //日志文件保存时长
|
||||
ConsulAddr []string //区服Consul
|
||||
IsCross bool ///是否是跨区区服
|
||||
BelongCrossServerId string //所属跨服Id (区服id) 不是跨服区服才有效
|
||||
LoaclDB *DBConfig //本地db
|
||||
CrossDB *DBConfig //跨服db
|
||||
Services []*ServiceConfig //服务列表 可以配置多个gateway 和多个 worker ,只能有一个mainte
|
||||
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
|
||||
}
|
||||
|
@ -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
|
||||
if ss, err := rederServiceSttings(config); err != nil {
|
||||
log.Error("转换服务配置异常!", log.Field{Key: "err", Value: err})
|
||||
} 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
|
||||
}
|
||||
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,17 +142,61 @@ 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})
|
||||
|
||||
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(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 *sindex == -1 || *sindex == i {
|
||||
stopService(sseting)
|
||||
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
|
||||
}
|
||||
|
||||
//读取游戏配置文件
|
||||
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user