上传跨服配置代码
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",
|
"BelongCrossServerId": "dfcross_2",
|
||||||
"LoaclDB": {
|
"LoaclDB": {
|
||||||
"RedisIsCluster": false,
|
"RedisIsCluster": false,
|
||||||
"RedisAddr": ["10.0.0.9:10011"],
|
"RedisAddr": [
|
||||||
|
"10.0.0.9:10011"
|
||||||
|
],
|
||||||
"RedisPassword": "li13451234",
|
"RedisPassword": "li13451234",
|
||||||
"RedisDB": 3,
|
"RedisDB": 3,
|
||||||
"MongodbUrl": "mongodb://10.0.0.9:10013",
|
"MongodbUrl": "mongodb://10.0.0.9:10013",
|
||||||
"MongodbDatabase": "dreamfactory3"
|
"MongodbDatabase": "dreamfactory3"
|
||||||
},
|
},
|
||||||
"CrossDB": {
|
"Mainte": "127.0.0.1:7896",
|
||||||
"RedisIsCluster": false,
|
"MaintePort": 9572,
|
||||||
"RedisAddr": ["10.0.0.9:10011"],
|
"Gateways": [
|
||||||
"RedisPassword": "li13451234",
|
"127.0.0.1:7895"
|
||||||
"RedisDB": 12,
|
],
|
||||||
"MongodbUrl": "mongodb://10.0.0.9:10013",
|
"GatewayPorts": [
|
||||||
"MongodbDatabase": "dreamfactory12"
|
9571
|
||||||
},
|
],
|
||||||
"Services": [
|
"Workers": [
|
||||||
{
|
"127.0.0.1:9573"
|
||||||
"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
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
}
|
}
|
@ -2,13 +2,18 @@ package comm
|
|||||||
|
|
||||||
//游戏区服配置
|
//游戏区服配置
|
||||||
type GameConfig struct {
|
type GameConfig struct {
|
||||||
AreaId string //区服id 每个区服id都必须是唯一
|
AreaId string //区服id 每个区服id都必须是唯一
|
||||||
ConsulAddr []string //区服Consul
|
Loglevel int32 //日志文件输出级别
|
||||||
IsCross bool ///是否是跨区区服
|
MaxAgeTime int32 //日志文件保存时长
|
||||||
BelongCrossServerId string //所属跨服Id (区服id) 不是跨服区服才有效
|
ConsulAddr []string //区服Consul
|
||||||
LoaclDB *DBConfig //本地db
|
IsCross bool ///是否是跨区区服
|
||||||
CrossDB *DBConfig //跨服db
|
BelongCrossServerId string //所属跨服Id (区服id) 不是跨服区服才有效
|
||||||
Services []*ServiceConfig //服务列表 可以配置多个gateway 和多个 worker ,只能有一个mainte
|
LoaclDB *DBConfig //本地db
|
||||||
|
Mainte string //维护服
|
||||||
|
MaintePort int //维护服通信端口
|
||||||
|
Gateways []string //网关服务["127.0.0.1:7895"]
|
||||||
|
GatewayPorts []int //网关通信端口
|
||||||
|
Workers []string //工作服
|
||||||
}
|
}
|
||||||
|
|
||||||
//区服db配置
|
//区服db配置
|
||||||
@ -21,12 +26,11 @@ type DBConfig struct {
|
|||||||
MongodbDatabase string //数据库地址
|
MongodbDatabase string //数据库地址
|
||||||
}
|
}
|
||||||
|
|
||||||
//服务配置
|
//跨服服务列表配置
|
||||||
type ServiceConfig struct {
|
type CrossConfigs map[string]*CrossConfig
|
||||||
ServiceType string //服务类型:gateway(网关服务),worker(业务服务),mainte(维护服务)
|
|
||||||
Host string //运行主机ip
|
type CrossConfig struct {
|
||||||
Port int32 //监控Prot
|
AreaId string //区服id
|
||||||
Loglevel int32 //日志文件输出级别
|
LoaclDB *DBConfig //本地db
|
||||||
MaxAgeTime int32 //日志文件保存时长
|
ServiceList map[string]*DBConfig
|
||||||
ListenPort int32 //网关和维护服务 都需要提供http服务 所以需要监听端口
|
|
||||||
}
|
}
|
||||||
|
@ -8,8 +8,11 @@ import (
|
|||||||
"go_dreamfactory/lego/core"
|
"go_dreamfactory/lego/core"
|
||||||
"go_dreamfactory/lego/sys/log"
|
"go_dreamfactory/lego/sys/log"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"net"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
@ -80,48 +83,41 @@ func start() {
|
|||||||
log.Error("读取区服配置失败!", log.Field{Key: "err", Value: err})
|
log.Error("读取区服配置失败!", log.Field{Key: "err", Value: err})
|
||||||
} else {
|
} else {
|
||||||
var (
|
var (
|
||||||
maintes []*core.ServiceSttings = make([]*core.ServiceSttings, 0)
|
maintes *core.ServiceSttings
|
||||||
workers []*core.ServiceSttings = make([]*core.ServiceSttings, 0)
|
workers []*core.ServiceSttings = make([]*core.ServiceSttings, 0)
|
||||||
gateways []*core.ServiceSttings = make([]*core.ServiceSttings, 0)
|
gateways []*core.ServiceSttings = make([]*core.ServiceSttings, 0)
|
||||||
)
|
)
|
||||||
for i, v := range config.Services {
|
if ss, err := rederServiceSttings(config); err != nil {
|
||||||
if sseting, err := convertServiceSttings(config, i, v); err != nil {
|
log.Error("转换服务配置异常!", log.Field{Key: "err", Value: err})
|
||||||
log.Error("转换服务配置异常!", log.Field{Key: "v", Value: v}, log.Field{Key: "err", Value: err})
|
} else {
|
||||||
return
|
for i, v := range ss {
|
||||||
} 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 *sindex == -1 || *sindex == i {
|
if *sindex == -1 || *sindex == i {
|
||||||
switch sseting.Type {
|
switch v.Type {
|
||||||
case comm.Service_Gateway: //网关服务
|
case comm.Service_Gateway: //网关服务
|
||||||
gateways = append(gateways, sseting)
|
gateways = append(gateways, v)
|
||||||
break
|
break
|
||||||
case comm.Service_Worker: //业务服务
|
case comm.Service_Worker: //业务服务
|
||||||
workers = append(workers, sseting)
|
workers = append(workers, v)
|
||||||
break
|
break
|
||||||
case comm.Service_Mainte: //维护服务
|
case comm.Service_Mainte: //维护服务
|
||||||
maintes = append(maintes, sseting)
|
maintes = v
|
||||||
break
|
break
|
||||||
default:
|
default:
|
||||||
err = fmt.Errorf("服务类型异常 stype:%s", sseting.Type)
|
err = fmt.Errorf("服务类型异常 stype:%s", v.Type)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(maintes) > 1 {
|
|
||||||
log.Error("maintes服一个区服只能有一个!")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
//优先启动 维护服
|
//优先启动 维护服
|
||||||
for _, v := range maintes {
|
if maintes != nil {
|
||||||
if err = startService(v); err != nil {
|
if err = startService(maintes); err != nil {
|
||||||
log.Error("启动服务失败!", log.Field{Key: "id", Value: v.Id}, log.Field{Key: "err", Value: err})
|
log.Error("启动服务失败!", log.Field{Key: "id", Value: maintes.Id}, log.Field{Key: "err", Value: err})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
time.Sleep(time.Second * 3)
|
time.Sleep(time.Second * 3)
|
||||||
// 业务服
|
// 业务服
|
||||||
for _, v := range workers {
|
for _, v := range workers {
|
||||||
@ -146,19 +142,63 @@ func stop() {
|
|||||||
if config, err := readergmconf(*cpath); err != nil {
|
if config, err := readergmconf(*cpath); err != nil {
|
||||||
log.Error("读取区服配置失败!", log.Field{Key: "err", Value: err})
|
log.Error("读取区服配置失败!", log.Field{Key: "err", Value: err})
|
||||||
} else {
|
} else {
|
||||||
for i, v := range config.Services {
|
|
||||||
if sseting, err := convertServiceSttings(config, i, v); err != nil {
|
if ss, err := rederServiceSttings(config); err != nil {
|
||||||
log.Error("转换服务配置异常!", log.Field{Key: "v", Value: v}, log.Field{Key: "err", Value: err})
|
log.Error("转换服务配置异常!", log.Field{Key: "err", Value: err})
|
||||||
return
|
} else {
|
||||||
} else {
|
for i, v := range ss {
|
||||||
if *sindex == -1 || *sindex == i {
|
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) {
|
func readergmconf(path string) (config *comm.GameConfig, err error) {
|
||||||
config = &comm.GameConfig{}
|
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 = &core.ServiceSttings{}
|
||||||
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{}{
|
||||||
"ConsulServers": config.ConsulAddr,
|
"ConsulServers": config.ConsulAddr,
|
||||||
}
|
}
|
||||||
switch sconfig.ServiceType {
|
switch stype {
|
||||||
case comm.Service_Gateway: //网关服务
|
case comm.Service_Gateway: //网关服务
|
||||||
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{}{
|
||||||
"ListenPort": sconfig.ListenPort,
|
"ListenPort": lport,
|
||||||
"SpanServiceTag": config.BelongCrossServerId,
|
"SpanServiceTag": config.BelongCrossServerId,
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
@ -204,7 +244,7 @@ func convertServiceSttings(config *comm.GameConfig, id int, sconfig *comm.Servic
|
|||||||
sseting.Sys["rpcx"]["RpcxStartType"] = 0
|
sseting.Sys["rpcx"]["RpcxStartType"] = 0
|
||||||
sseting.Modules["web"] = map[string]interface{}{
|
sseting.Modules["web"] = map[string]interface{}{
|
||||||
"WebDir": "./dist",
|
"WebDir": "./dist",
|
||||||
"Port": sconfig.ListenPort,
|
"Port": lport,
|
||||||
"Key": "@234%67g12q4*67m12#4l67!",
|
"Key": "@234%67g12q4*67m12#4l67!",
|
||||||
}
|
}
|
||||||
break
|
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.Id = fmt.Sprintf("%s_s%d", config.AreaId, id)
|
||||||
sseting.Tag = config.AreaId
|
sseting.Tag = config.AreaId
|
||||||
sseting.Ip = sconfig.Host
|
sseting.Ip = ip
|
||||||
sseting.Port = int(sconfig.Port)
|
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": sconfig.Loglevel,
|
"Loglevel": config.Loglevel,
|
||||||
"MaxAgeTime": sconfig.MaxAgeTime,
|
"MaxAgeTime": config.MaxAgeTime,
|
||||||
}
|
}
|
||||||
sseting.Sys["configure"] = map[string]interface{}{
|
sseting.Sys["configure"] = map[string]interface{}{
|
||||||
"ConfigurePath": "./json",
|
"ConfigurePath": "./json",
|
||||||
@ -235,18 +275,6 @@ func convertServiceSttings(config *comm.GameConfig, id int, sconfig *comm.Servic
|
|||||||
"MongodbUrl": config.LoaclDB.MongodbUrl,
|
"MongodbUrl": config.LoaclDB.MongodbUrl,
|
||||||
"MongodbDatabase": config.LoaclDB.MongodbDatabase,
|
"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
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -321,3 +349,22 @@ func writeServiceConfig(filename string, sseting *core.ServiceSttings) (err erro
|
|||||||
}
|
}
|
||||||
return
|
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