上传跨服配置项

This commit is contained in:
liwei1dao 2022-09-21 20:02:58 +08:00
parent f10bfa3f04
commit 439ef722d8
8 changed files with 108 additions and 124 deletions

2
.gitignore vendored
View File

@ -26,3 +26,5 @@ pb.bat
cmd/v2/.cache.meta cmd/v2/.cache.meta
cmd/v2/my.db cmd/v2/my.db
.idea/ .idea/
bin/cross.json
bin/gm.json

View File

@ -1,27 +0,0 @@
{
"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"
}
}
}
}

View File

@ -1,29 +0,0 @@
{
"AreaId": "df03",
"ConsulAddr": [
"10.0.0.9:10012"
],
"IsCross": false,
"BelongCrossServerId": "dfcross_2",
"LoaclDB": {
"RedisIsCluster": false,
"RedisAddr": [
"10.0.0.9:10011"
],
"RedisPassword": "li13451234",
"RedisDB": 3,
"MongodbUrl": "mongodb://10.0.0.9:10013",
"MongodbDatabase": "dreamfactory3"
},
"Mainte": "127.0.0.1:7896",
"MaintePort": 9572,
"Gateways": [
"127.0.0.1:7895"
],
"GatewayPorts": [
9571
],
"Workers": [
"127.0.0.1:9573"
]
}

View File

@ -21,7 +21,7 @@ type DBConfig struct {
RedisIsCluster bool //redis 是否是集群模式 RedisIsCluster bool //redis 是否是集群模式
RedisAddr []string //redis 地址 RedisAddr []string //redis 地址
RedisPassword string //redis 密码 RedisPassword string //redis 密码
RedisDB int32 //redis db RedisDB int //redis db
MongodbUrl string //mgondb 地址 MongodbUrl string //mgondb 地址
MongodbDatabase string //数据库地址 MongodbDatabase string //数据库地址
} }

View File

@ -40,7 +40,9 @@ func (this *configureComp) GetMsgDistribute(msgmid, msguid string) (rule string,
rule = item.Routrules rule = item.Routrules
} else { } else {
msgid := strings.ToLower(fmt.Sprintf("%s.%s", msgmid, msguid)) msgid := strings.ToLower(fmt.Sprintf("%s.%s", msgmid, msguid))
item, ok = v.(*cfg.GameMsgdistrib).GetDataMap()[msgid] if item, ok = v.(*cfg.GameMsgdistrib).GetDataMap()[msgid]; ok {
rule = item.Routrules
}
} }
} }
return return

View File

@ -24,8 +24,9 @@ import (
服务描述:通过读取游戏json配置,启动服务程序 服务描述:通过读取游戏json配置,启动服务程序
*/ */
var ( var (
cpath = flag.String("g", "./gm.json", "游戏区服配置") //服务列表下标 gmpath = flag.String("g", "./gm.json", "游戏区服配置") //服务列表下标
sindex = flag.Int("i", -1, "曲阜列表下标") //服务列表下标 crosspath = flag.String("c", "./cross.json", "游戏跨服配置") //服务列表下标
sid = flag.String("i", "", "曲阜列表下标") //服务列表下标
) )
var startCmd = &cobra.Command{ var startCmd = &cobra.Command{
Use: "start", Use: "start",
@ -79,7 +80,7 @@ func Execute() {
//启动程序 //启动程序
func start() { func start() {
if config, err := readergmconf(*cpath); err != nil { if config, err := readergmconf(*gmpath); err != nil {
log.Error("读取区服配置失败!", log.Field{Key: "err", Value: err}) log.Error("读取区服配置失败!", log.Field{Key: "err", Value: err})
} else { } else {
var ( var (
@ -90,8 +91,12 @@ func start() {
if ss, err := rederServiceSttings(config); err != nil { if ss, err := rederServiceSttings(config); err != nil {
log.Error("转换服务配置异常!", log.Field{Key: "err", Value: err}) log.Error("转换服务配置异常!", log.Field{Key: "err", Value: err})
} else { } else {
for i, v := range ss { for _, v := range ss {
if *sindex == -1 || *sindex == i { if *sid == "" || fmt.Sprintf("%s_%s", v.Tag, *sid) == v.Id {
if err = writeServiceConfig(fmt.Sprintf("./conf/%s.yaml", v.Id), v); err != nil {
log.Error("写入配置文件失败!", log.Field{Key: "err", Value: err})
return
}
switch v.Type { switch v.Type {
case comm.Service_Gateway: //网关服务 case comm.Service_Gateway: //网关服务
gateways = append(gateways, v) gateways = append(gateways, v)
@ -139,19 +144,18 @@ func start() {
//关闭程序 //关闭程序
func stop() { func stop() {
if config, err := readergmconf(*cpath); err != nil { if config, err := readergmconf(*gmpath); err != nil {
log.Error("读取区服配置失败!", log.Field{Key: "err", Value: err}) log.Error("读取区服配置失败!", log.Field{Key: "err", Value: err})
} else { } else {
if ss, err := rederServiceSttings(config); err != nil { if ss, err := rederServiceSttings(config); err != nil {
log.Error("转换服务配置异常!", log.Field{Key: "err", Value: err}) log.Error("转换服务配置异常!", log.Field{Key: "err", Value: err})
} else { } else {
for i, v := range ss { for _, v := range ss {
if *sindex == -1 || *sindex == i { if *sid == "" || fmt.Sprintf("%s_%s", v.Tag, *sid) == v.Id {
stopService(v) stopService(v)
} }
} }
} }
} }
} }
@ -162,26 +166,24 @@ func rederServiceSttings(config *comm.GameConfig) (ss []*core.ServiceSttings, er
var ( var (
ip string ip string
port int port int
n int
sseting *core.ServiceSttings sseting *core.ServiceSttings
) )
if ip, port, err = parseaddr(config.Mainte); err != nil { if ip, port, err = parseaddr(config.Mainte); err != nil {
return return
} else { } else {
if sseting, err = convertServiceSttings(config, n, comm.Service_Mainte, ip, config.MaintePort, port); err != nil { if sseting, err = convertServiceSttings(config, 0, comm.Service_Mainte, ip, config.MaintePort, port); err != nil {
return return
} }
n++
ss = append(ss, sseting) ss = append(ss, sseting)
} }
for _, v := range config.Workers { for i, v := range config.Workers {
if ip, port, err = parseaddr(v); err != nil { if ip, port, err = parseaddr(v); err != nil {
return return
} else { } else {
if sseting, err = convertServiceSttings(config, n, comm.Service_Worker, ip, port, 0); err != nil { if sseting, err = convertServiceSttings(config, i, comm.Service_Worker, ip, port, 0); err != nil {
return return
} }
n++
ss = append(ss, sseting) ss = append(ss, sseting)
} }
} }
@ -189,10 +191,9 @@ func rederServiceSttings(config *comm.GameConfig) (ss []*core.ServiceSttings, er
if ip, port, err = parseaddr(v); err != nil { if ip, port, err = parseaddr(v); err != nil {
return return
} else { } else {
if sseting, err = convertServiceSttings(config, n, comm.Service_Worker, ip, config.GatewayPorts[i], port); err != nil { if sseting, err = convertServiceSttings(config, i, comm.Service_Gateway, ip, config.GatewayPorts[i], port); err != nil {
return return
} }
n++
ss = append(ss, sseting) ss = append(ss, sseting)
} }
} }
@ -221,6 +222,9 @@ func readergmconf(path string) (config *comm.GameConfig, err error) {
//转换游戏服务配置 //转换游戏服务配置
func convertServiceSttings(config *comm.GameConfig, id int, stype string, ip string, rport int, lport int) (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 = &core.ServiceSttings{}
sseting.Tag = config.AreaId
sseting.Ip = ip
sseting.Port = rport
sseting.Modules = make(map[string]map[string]interface{}) sseting.Modules = make(map[string]map[string]interface{})
sseting.Sys = make(map[string]map[string]interface{}) sseting.Sys = make(map[string]map[string]interface{})
sseting.Sys["rpcx"] = map[string]interface{}{ sseting.Sys["rpcx"] = map[string]interface{}{
@ -228,6 +232,7 @@ func convertServiceSttings(config *comm.GameConfig, id int, stype string, ip str
} }
switch stype { switch stype {
case comm.Service_Gateway: //网关服务 case comm.Service_Gateway: //网关服务
sseting.Id = fmt.Sprintf("%s_%s%d", config.AreaId, comm.Service_Gateway, id)
sseting.Type = comm.Service_Gateway sseting.Type = comm.Service_Gateway
sseting.Sys["rpcx"]["RpcxStartType"] = 1 sseting.Sys["rpcx"]["RpcxStartType"] = 1
sseting.Modules["gateway"] = map[string]interface{}{ sseting.Modules["gateway"] = map[string]interface{}{
@ -236,10 +241,12 @@ func convertServiceSttings(config *comm.GameConfig, id int, stype string, ip str
} }
break break
case comm.Service_Worker: //业务服务 case comm.Service_Worker: //业务服务
sseting.Id = fmt.Sprintf("%s_%s%d", config.AreaId, comm.Service_Worker, id)
sseting.Type = comm.Service_Worker sseting.Type = comm.Service_Worker
sseting.Sys["rpcx"]["RpcxStartType"] = 0 sseting.Sys["rpcx"]["RpcxStartType"] = 0
break break
case comm.Service_Mainte: //维护服务 case comm.Service_Mainte: //维护服务
sseting.Id = fmt.Sprintf("%s_%s", config.AreaId, comm.Service_Mainte)
sseting.Type = comm.Service_Mainte sseting.Type = comm.Service_Mainte
sseting.Sys["rpcx"]["RpcxStartType"] = 0 sseting.Sys["rpcx"]["RpcxStartType"] = 0
sseting.Modules["web"] = map[string]interface{}{ sseting.Modules["web"] = map[string]interface{}{
@ -252,11 +259,6 @@ func convertServiceSttings(config *comm.GameConfig, id int, stype string, ip str
err = fmt.Errorf("服务类型异常 stype:%s", sseting.Type) err = fmt.Errorf("服务类型异常 stype:%s", sseting.Type)
return return
} }
sseting.Id = fmt.Sprintf("%s_s%d", config.AreaId, id)
sseting.Tag = config.AreaId
sseting.Ip = ip
sseting.Port = rport
sseting.Sys["log"] = map[string]interface{}{ sseting.Sys["log"] = map[string]interface{}{
"FileName": fmt.Sprintf("./log/%s.log", sseting.Id), "FileName": fmt.Sprintf("./log/%s.log", sseting.Id),
"Loglevel": config.Loglevel, "Loglevel": config.Loglevel,
@ -265,15 +267,16 @@ func convertServiceSttings(config *comm.GameConfig, id int, stype string, ip str
sseting.Sys["configure"] = map[string]interface{}{ sseting.Sys["configure"] = map[string]interface{}{
"ConfigurePath": "./json", "ConfigurePath": "./json",
} }
sseting.Sys["db"] = map[string]interface{}{} sseting.Sys["db"] = map[string]interface{}{
sseting.Sys["db"]["Loacl"] = map[string]interface{}{ "IsCross": config.IsCross,
"Enabled": true, "CrossTag": config.AreaId,
"RedisIsCluster": config.LoaclDB.RedisIsCluster, "RedisIsCluster": config.LoaclDB.RedisIsCluster,
"RedisAddr": config.LoaclDB.RedisAddr, "RedisAddr": config.LoaclDB.RedisAddr,
"RedisPassword": config.LoaclDB.RedisPassword, "RedisPassword": config.LoaclDB.RedisPassword,
"RedisDB": config.LoaclDB.RedisDB, "RedisDB": config.LoaclDB.RedisDB,
"MongodbUrl": config.LoaclDB.MongodbUrl, "MongodbUrl": config.LoaclDB.MongodbUrl,
"MongodbDatabase": config.LoaclDB.MongodbDatabase, "MongodbDatabase": config.LoaclDB.MongodbDatabase,
"CrossConfig": *crosspath,
} }
return return
} }

View File

@ -1,7 +1,12 @@
package db package db
import ( import (
"fmt"
"go_dreamfactory/comm"
"go_dreamfactory/lego/sys/log" "go_dreamfactory/lego/sys/log"
"go_dreamfactory/lego/utils/codec/json"
"io/ioutil"
"os"
"sync" "sync"
) )
@ -26,25 +31,72 @@ type DB struct {
} }
func (this *DB) init() (err error) { func (this *DB) init() (err error) {
if this.local, err = newDBConn(this.options.Loacl); err != nil { if this.local, err = newDBConn(DBConfig{
RedisIsCluster: this.options.RedisIsCluster,
RedisAddr: this.options.RedisAddr,
RedisPassword: this.options.RedisPassword,
RedisDB: this.options.RedisDB,
MongodbUrl: this.options.MongodbUrl,
MongodbDatabase: this.options.MongodbDatabase,
}); err != nil {
return return
} }
if this.options.Cross.Enabled { err = this.readercrossconf(this.options.CrossConfig)
if this.cross, err = newDBConn(this.options.Cross); err != nil { return
}
//读取游戏配置文件
func (this *DB) readercrossconf(path string) (err error) {
config := make(comm.CrossConfigs, 0)
var (
jsonFile *os.File
byteValue []byte
)
if jsonFile, err = os.Open(path); err != nil {
return
} else {
defer jsonFile.Close()
if byteValue, err = ioutil.ReadAll(jsonFile); err != nil {
return return
} }
} if err = json.Unmarshal(byteValue, &config); err != nil {
if this.options.ServerList != nil && len(this.options.ServerList) > 0 { return
this.servers = make(map[string]*DBConn, len(this.options.ServerList)) }
for k, v := range this.options.ServerList { if cf, ok := config[this.options.CrossTag]; !ok {
if this.servers[k], err = newDBConn(v); err != nil { err = fmt.Errorf("no found Crossconfig:%s", this.options.CrossTag)
return return
} else {
if !this.options.IsCross {
if this.cross, err = newDBConn(DBConfig{
RedisIsCluster: cf.LoaclDB.RedisIsCluster,
RedisAddr: cf.LoaclDB.RedisAddr,
RedisPassword: cf.LoaclDB.RedisPassword,
RedisDB: cf.LoaclDB.RedisDB,
MongodbUrl: cf.LoaclDB.MongodbUrl,
MongodbDatabase: cf.LoaclDB.MongodbDatabase,
}); err != nil {
log.Error("comment db err!", log.Field{Key: "stag", Value: cf.AreaId}, log.Field{Key: "db", Value: cf.LoaclDB}, log.Field{Key: "err", Value: err})
return
}
} else {
for k, v := range cf.ServiceList {
if this.servers[k], err = newDBConn(DBConfig{
RedisIsCluster: v.RedisIsCluster,
RedisAddr: v.RedisAddr,
RedisPassword: v.RedisPassword,
RedisDB: v.RedisDB,
MongodbUrl: v.MongodbUrl,
MongodbDatabase: v.MongodbDatabase,
}); err != nil {
log.Error("comment db err!", log.Field{Key: "stag", Value: k}, log.Field{Key: "db", Value: v}, log.Field{Key: "err", Value: err})
return
}
}
} }
} }
} }
return return
} }
func (this *DB) Local() *DBConn { func (this *DB) Local() *DBConn {
if this.local == nil { if this.local == nil {
log.Panic("LocalDBConn on init") log.Panic("LocalDBConn on init")

View File

@ -8,7 +8,6 @@ import (
//DB层配置 //DB层配置
type DBConfig struct { type DBConfig struct {
Enabled bool //是否生效
RedisIsCluster bool //是否是集群 RedisIsCluster bool //是否是集群
RedisAddr []string //redis 的集群地址 RedisAddr []string //redis 的集群地址
RedisPassword string //redis的密码 RedisPassword string //redis的密码
@ -19,33 +18,19 @@ type DBConfig struct {
type Option func(*Options) type Option func(*Options)
type Options struct { type Options struct {
Loacl DBConfig //本服配置 IsCross bool //是否是跨服
Cross DBConfig //跨服配置 CrossTag string //跨服区服id
ServerList map[string]DBConfig //服务列表配置 RedisIsCluster bool //是否是集群
Debug bool //日志是否开启 RedisAddr []string //redis 的集群地址
Log log.ILogger RedisPassword string //redis的密码
RedisDB int //数据库位置
MongodbUrl string //数据库连接地址
MongodbDatabase string //数据库名
CrossConfig string //跨服配置文件地址
Debug bool //日志是否开启
Log log.ILogger
} }
//设置本服配置
func SetLoacl(v DBConfig) Option {
return func(o *Options) {
o.Loacl = v
}
}
//设置本服配置
func SetCross(v DBConfig) Option {
return func(o *Options) {
o.Cross = v
}
}
//设置跨服区服列表
func SetServerList(v map[string]DBConfig) Option {
return func(o *Options) {
o.ServerList = v
}
}
func SetDebug(v bool) Option { func SetDebug(v bool) Option {
return func(o *Options) { return func(o *Options) {
o.Debug = v o.Debug = v
@ -58,11 +43,7 @@ func SetLog(v log.ILogger) Option {
} }
} }
func newOptions(config map[string]interface{}, opts ...Option) (options *Options, err error) { func newOptions(config map[string]interface{}, opts ...Option) (options *Options, err error) {
options = &Options{ options = &Options{}
Loacl: DBConfig{},
Cross: DBConfig{},
ServerList: make(map[string]DBConfig),
}
if config != nil { if config != nil {
if err = mapstructure.Decode(config, options); err != nil { if err = mapstructure.Decode(config, options); err != nil {
return return