1
This commit is contained in:
parent
17ac92f5a1
commit
adaf454d36
@ -48,6 +48,12 @@ func HandShakeRecv(a *Agent, m *msg.Msg) error {
|
|||||||
RemoteAddr: m.Extra.(string),
|
RemoteAddr: m.Extra.(string),
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
} else {
|
||||||
|
syncMsg := &msg.Msg{
|
||||||
|
Type: msg.CLUSTER_FRIEND_SYNC,
|
||||||
|
To: ServerId,
|
||||||
|
}
|
||||||
|
sendGameMsg(syncMsg)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@ -85,6 +85,7 @@ type GameLogic struct {
|
|||||||
VarMgr *VarMgr // 变量管理器
|
VarMgr *VarMgr // 变量管理器
|
||||||
BanMgr *BanMgr // 封号管理器
|
BanMgr *BanMgr // 封号管理器
|
||||||
StartTime int64 // 服务器启动时间
|
StartTime int64 // 服务器启动时间
|
||||||
|
MessageMgr *MessageMgr // 消息管理器
|
||||||
}
|
}
|
||||||
|
|
||||||
type ServerInfo struct {
|
type ServerInfo struct {
|
||||||
@ -361,6 +362,13 @@ func (ad *GameLogic) CreateMailMgr() {
|
|||||||
ad.MailMgr.Init()
|
ad.MailMgr.Init()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ad *GameLogic) CreateMessageMgr() {
|
||||||
|
ad.MessageMgr = &MessageMgr{
|
||||||
|
ServerMod: new(ServerMod),
|
||||||
|
}
|
||||||
|
ad.MessageMgr.MessageMgrInit()
|
||||||
|
}
|
||||||
|
|
||||||
func (ad *GameLogic) MailMgrSend(m *MsgMod.Msg) {
|
func (ad *GameLogic) MailMgrSend(m *MsgMod.Msg) {
|
||||||
ad.MailMgr.Send(m)
|
ad.MailMgr.Send(m)
|
||||||
}
|
}
|
||||||
@ -552,6 +560,7 @@ func G_getGameLogic() *GameLogic {
|
|||||||
G_GameLogicPtr.CreateChampshipMgr() // 创建竞标赛管理器
|
G_GameLogicPtr.CreateChampshipMgr() // 创建竞标赛管理器
|
||||||
G_GameLogicPtr.CreateVarMgr() // 创建变量管理器
|
G_GameLogicPtr.CreateVarMgr() // 创建变量管理器
|
||||||
G_GameLogicPtr.CreateBanMgr() // 创建封号管理器
|
G_GameLogicPtr.CreateBanMgr() // 创建封号管理器
|
||||||
|
G_GameLogicPtr.CreateMessageMgr() // 创建消息管理器
|
||||||
ClusterMgrInit() //初始化集群
|
ClusterMgrInit() //初始化集群
|
||||||
G_GameLogicPtr.StartTime = time.Now().Unix()
|
G_GameLogicPtr.StartTime = time.Now().Unix()
|
||||||
// G_GameLogicPtr.CreateHttpManager()
|
// G_GameLogicPtr.CreateHttpManager()
|
||||||
|
|||||||
@ -20,11 +20,18 @@ type MessageMgr struct {
|
|||||||
*ServerMod
|
*ServerMod
|
||||||
middlewares []MessageMiddleware
|
middlewares []MessageMiddleware
|
||||||
workerPool *WorkerPool
|
workerPool *WorkerPool
|
||||||
|
handler map[int]MessageHandlerFunc
|
||||||
}
|
}
|
||||||
|
|
||||||
type MessageData struct {
|
type MessageData struct {
|
||||||
MessageList map[int64][]*msg.Msg
|
MessageList map[int64]*MessageList
|
||||||
PlayerList map[int64]int
|
PlayerList map[int64]int
|
||||||
|
mu sync.Mutex
|
||||||
|
}
|
||||||
|
|
||||||
|
type MessageList struct {
|
||||||
|
Messages []*msg.Msg
|
||||||
|
mu sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
// Worker Pool 结构
|
// Worker Pool 结构
|
||||||
@ -52,7 +59,13 @@ type TaskResult struct {
|
|||||||
|
|
||||||
func (m *MessageMgr) MessageMgrInit() {
|
func (m *MessageMgr) MessageMgrInit() {
|
||||||
m.key = MESSAGE_MGR_KEY
|
m.key = MESSAGE_MGR_KEY
|
||||||
m.data = &MessageData{}
|
m.data = &MessageData{
|
||||||
|
MessageList: make(map[int64]*MessageList),
|
||||||
|
PlayerList: make(map[int64]int),
|
||||||
|
}
|
||||||
|
// 注册处理函数
|
||||||
|
m.init()
|
||||||
|
m.handler = make(map[int]MessageHandlerFunc)
|
||||||
m.middlewares = []MessageMiddleware{}
|
m.middlewares = []MessageMiddleware{}
|
||||||
// 初始化 Worker Pool (10个worker, 1000个队列大小)
|
// 初始化 Worker Pool (10个worker, 1000个队列大小)
|
||||||
m.workerPool = NewWorkerPool(10, 1000)
|
m.workerPool = NewWorkerPool(10, 1000)
|
||||||
@ -60,8 +73,61 @@ func (m *MessageMgr) MessageMgrInit() {
|
|||||||
m.Use(RecoveryMiddleware())
|
m.Use(RecoveryMiddleware())
|
||||||
m.Use(LoggingMiddleware())
|
m.Use(LoggingMiddleware())
|
||||||
m.Use(TimeoutMiddleware(5 * time.Second))
|
m.Use(TimeoutMiddleware(5 * time.Second))
|
||||||
// 注册处理函数
|
if conf.Server.ServerType == "center" {
|
||||||
m.init()
|
m.RegisterHandler(msg.HANDLE_MOD_PLAYER_LOGIN, MessageHandlerFunc(PlayerLogin))
|
||||||
|
m.RegisterHandler(msg.HANDLE_MOD_PLAYER_MSG, MessageHandlerFunc(SendToPlayer))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 注册处理器
|
||||||
|
func (s *MessageMgr) RegisterHandler(HandlerType int, fun MessageHandlerFunc) {
|
||||||
|
s.handler[HandlerType] = fun
|
||||||
|
}
|
||||||
|
|
||||||
|
func getData() *MessageData {
|
||||||
|
return G_GameLogicPtr.MessageMgr.data.(*MessageData)
|
||||||
|
}
|
||||||
|
|
||||||
|
func PlayerLogin(data *msg.Msg) (interface{}, error) {
|
||||||
|
// 关闭 Worker Pool
|
||||||
|
messageMgrData := getData()
|
||||||
|
messageMgrData.mu.Lock()
|
||||||
|
defer messageMgrData.mu.Unlock()
|
||||||
|
messageMgrData.PlayerList[int64(data.From)] = data.Extra.(int)
|
||||||
|
if _, ok := messageMgrData.MessageList[int64(data.From)]; !ok {
|
||||||
|
messageMgrData.MessageList[int64(data.From)] = &MessageList{
|
||||||
|
Messages: []*msg.Msg{},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
messageMgrData.PlayerList[int64(data.From)] = data.Extra.(int)
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func SendToPlayer(data *msg.Msg) (interface{}, error) {
|
||||||
|
PlayerId := int64(data.To)
|
||||||
|
messageMgrData := getData()
|
||||||
|
// 遍历消息列表,发送消息给在线玩家
|
||||||
|
messages, ok := messageMgrData.MessageList[int64(PlayerId)]
|
||||||
|
if !ok {
|
||||||
|
messageMgrData.mu.Lock()
|
||||||
|
messages = &MessageList{
|
||||||
|
Messages: []*msg.Msg{},
|
||||||
|
}
|
||||||
|
messageMgrData.MessageList[int64(PlayerId)] = messages
|
||||||
|
messageMgrData.mu.Unlock()
|
||||||
|
}
|
||||||
|
messages.mu.Lock()
|
||||||
|
defer messages.mu.Unlock()
|
||||||
|
messages.Messages = append(messages.Messages, data)
|
||||||
|
if node, ok := messageMgrData.PlayerList[int64(PlayerId)]; ok {
|
||||||
|
for _, message := range messages.Messages {
|
||||||
|
err := SendMsgToNode(message, node)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("Failed to send message to player %d: %v", PlayerId, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加中间件
|
// 添加中间件
|
||||||
@ -86,7 +152,7 @@ func (m *MessageMgr) RegisterMessageHandler(hType int, handler MessageHandlerFun
|
|||||||
|
|
||||||
func (m *MessageMgr) Handle(msg *msg.Msg) (interface{}, error) {
|
func (m *MessageMgr) Handle(msg *msg.Msg) (interface{}, error) {
|
||||||
if fun, ok := m.handler[msg.Type]; ok {
|
if fun, ok := m.handler[msg.Type]; ok {
|
||||||
return fun.(MessageHandlerFunc)(msg)
|
return fun(msg)
|
||||||
}
|
}
|
||||||
log.Error("server mod key:%s handle not exist handle type:%d", m.key, msg.Type)
|
log.Error("server mod key:%s handle not exist handle type:%d", m.key, msg.Type)
|
||||||
return nil, fmt.Errorf("server mod handler err")
|
return nil, fmt.Errorf("server mod handler err")
|
||||||
@ -107,9 +173,9 @@ func SendMessage(m1 *msg.Msg) error {
|
|||||||
|
|
||||||
// 异步处理消息 (多线程版本)
|
// 异步处理消息 (多线程版本)
|
||||||
func (m *MessageMgr) MessageHandleAsync(message *msg.Msg) error {
|
func (m *MessageMgr) MessageHandleAsync(message *msg.Msg) error {
|
||||||
if fun, ok := m.handler[message.Type]; ok {
|
if fun, ok := m.handler[message.HandleType]; ok {
|
||||||
// 应用中间件
|
// 应用中间件
|
||||||
handlerWithMiddleware := m.applyMiddlewares(fun.(MessageHandlerFunc))
|
handlerWithMiddleware := m.applyMiddlewares(fun)
|
||||||
|
|
||||||
// 创建任务
|
// 创建任务
|
||||||
task := &MessageTask{
|
task := &MessageTask{
|
||||||
@ -142,7 +208,7 @@ func (m *MessageMgr) MessageHandleAsync(message *msg.Msg) error {
|
|||||||
func MessageHandle(m *msg.Msg) error {
|
func MessageHandle(m *msg.Msg) error {
|
||||||
log.Debug("RecvMessage m %v", m)
|
log.Debug("RecvMessage m %v", m)
|
||||||
// 这里可以调用 MessageMgr 的处理方法
|
// 这里可以调用 MessageMgr 的处理方法
|
||||||
// G_GameLogicPtr.MessageMgr.MessageHandleAsync(m)
|
G_GameLogicPtr.MessageMgr.MessageHandleAsync(m)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -334,13 +400,13 @@ func SendMsgToNode(m *msg.Msg, node int) error {
|
|||||||
func SendPlayerMsg(m *msg.Msg) error {
|
func SendPlayerMsg(m *msg.Msg) error {
|
||||||
clone := m.Clone()
|
clone := m.Clone()
|
||||||
clone.UniKey = GoUtil.UniKey(fmt.Sprintf("%v,Player Msg", m))
|
clone.UniKey = GoUtil.UniKey(fmt.Sprintf("%v,Player Msg", m))
|
||||||
clone.HandleType = msg.HANDLE_TYPE_PLAYER_MSG
|
clone.HandleType = msg.HANDLE_MOD_PLAYER_MSG
|
||||||
return mergeCluster.SendServerMsg(m, conf.Server.CenterNode)
|
return mergeCluster.SendServerMsg(m, conf.Server.CenterNode)
|
||||||
}
|
}
|
||||||
|
|
||||||
func CallPlayerMsg(m *msg.Msg) (interface{}, error) {
|
func CallPlayerMsg(m *msg.Msg) (interface{}, error) {
|
||||||
clone := m.Clone()
|
clone := m.Clone()
|
||||||
clone.UniKey = GoUtil.UniKey(fmt.Sprintf("%v,Player Msg", m))
|
clone.UniKey = GoUtil.UniKey(fmt.Sprintf("%v,Player Msg", m))
|
||||||
clone.HandleType = msg.HANDLE_TYPE_PLAYER_MSG
|
clone.HandleType = msg.HANDLE_MOD_PLAYER_MSG
|
||||||
return mergeCluster.CallServerMsg(m, conf.Server.CenterNode)
|
return mergeCluster.CallServerMsg(m, conf.Server.CenterNode)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,7 +20,9 @@ var MSG_ZERO_UPDATE = &Msg{Type: SERVER_ZERO_UPDATE}
|
|||||||
var MSG_NOON_UPDATE = &Msg{Type: SERVER_NOON_UPDATE}
|
var MSG_NOON_UPDATE = &Msg{Type: SERVER_NOON_UPDATE}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
HANDLE_TYPE_PLAYER_MSG = 20001 // 玩家消息
|
HANDLE_MOD_PLAYER_MSG = 20001 // 玩家消息
|
||||||
|
HANDLE_MOD_CLUSTER_MSG = 20002 // 集群消息
|
||||||
|
HANDLE_MOD_PLAYER_LOGIN = 20003 // 玩家登录消息
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user