上传跨服配置项

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/my.db
.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 是否是集群模式
RedisAddr []string //redis 地址
RedisPassword string //redis 密码
RedisDB int32 //redis db
RedisDB int //redis db
MongodbUrl string //mgondb 地址
MongodbDatabase string //数据库地址
}

View File

@ -40,7 +40,9 @@ func (this *configureComp) GetMsgDistribute(msgmid, msguid string) (rule string,
rule = item.Routrules
} else {
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

View File

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

View File

@ -1,7 +1,12 @@
package db
import (
"fmt"
"go_dreamfactory/comm"
"go_dreamfactory/lego/sys/log"
"go_dreamfactory/lego/utils/codec/json"
"io/ioutil"
"os"
"sync"
)
@ -26,25 +31,72 @@ type DB struct {
}
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
}
if this.options.Cross.Enabled {
if this.cross, err = newDBConn(this.options.Cross); err != nil {
err = this.readercrossconf(this.options.CrossConfig)
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
}
}
if this.options.ServerList != nil && len(this.options.ServerList) > 0 {
this.servers = make(map[string]*DBConn, len(this.options.ServerList))
for k, v := range this.options.ServerList {
if this.servers[k], err = newDBConn(v); err != nil {
return
if err = json.Unmarshal(byteValue, &config); err != nil {
return
}
if cf, ok := config[this.options.CrossTag]; !ok {
err = fmt.Errorf("no found Crossconfig:%s", this.options.CrossTag)
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
}
func (this *DB) Local() *DBConn {
if this.local == nil {
log.Panic("LocalDBConn on init")

View File

@ -8,7 +8,6 @@ import (
//DB层配置
type DBConfig struct {
Enabled bool //是否生效
RedisIsCluster bool //是否是集群
RedisAddr []string //redis 的集群地址
RedisPassword string //redis的密码
@ -19,33 +18,19 @@ type DBConfig struct {
type Option func(*Options)
type Options struct {
Loacl DBConfig //本服配置
Cross DBConfig //跨服配置
ServerList map[string]DBConfig //服务列表配置
Debug bool //日志是否开启
Log log.ILogger
IsCross bool //是否是跨服
CrossTag string //跨服区服id
RedisIsCluster bool //是否是集群
RedisAddr []string //redis 的集群地址
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 {
return func(o *Options) {
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) {
options = &Options{
Loacl: DBConfig{},
Cross: DBConfig{},
ServerList: make(map[string]DBConfig),
}
options = &Options{}
if config != nil {
if err = mapstructure.Decode(config, options); err != nil {
return