上传跨服配置代码

This commit is contained in:
liwei1dao 2022-09-21 19:07:41 +08:00
parent eea06bba53
commit cd575f383d
4 changed files with 154 additions and 96 deletions

27
bin/cross.json Normal file
View 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"
}
}
}
}

View File

@ -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"
]
}

View File

@ -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
}

View File

@ -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
}