基于Nats的跨服实现
This commit is contained in:
parent
0439bffb99
commit
fc9d334695
|
@ -0,0 +1,6 @@
|
||||||
|
package corss
|
||||||
|
|
||||||
|
type Message struct {
|
||||||
|
ServerId int64 `json:"server_id"`
|
||||||
|
Packet []byte `json:"packet"`
|
||||||
|
}
|
|
@ -0,0 +1,70 @@
|
||||||
|
package corss
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"github.com/kercylan98/minotaur/server"
|
||||||
|
"github.com/kercylan98/minotaur/utils/log"
|
||||||
|
"github.com/kercylan98/minotaur/utils/synchronization"
|
||||||
|
"github.com/nats-io/nats.go"
|
||||||
|
"go.uber.org/zap"
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewNats(url string, options ...nats.Option) *Nats {
|
||||||
|
return &Nats{
|
||||||
|
url: url,
|
||||||
|
subject: "MINOTAUR_CROSS",
|
||||||
|
options: options,
|
||||||
|
messagePool: synchronization.NewPool[*Message](1024*100, func() *Message {
|
||||||
|
return new(Message)
|
||||||
|
}, func(data *Message) {
|
||||||
|
data.ServerId = 0
|
||||||
|
data.Packet = nil
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewNatsWithSubject(url, subject string, options ...nats.Option) *Nats {
|
||||||
|
n := NewNats(url, options...)
|
||||||
|
n.subject = subject
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
type Nats struct {
|
||||||
|
conn *nats.Conn
|
||||||
|
url string
|
||||||
|
subject string
|
||||||
|
realSubject string
|
||||||
|
options []nats.Option
|
||||||
|
messagePool *synchronization.Pool[*Message]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (slf *Nats) Init(server *server.Server, packetHandle func(serverId int64, packet []byte)) (err error) {
|
||||||
|
slf.realSubject = fmt.Sprintf("%s_%d", slf.subject, server.GetID())
|
||||||
|
slf.conn, err = nats.Connect(slf.url, slf.options...)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = slf.conn.Subscribe(slf.realSubject, func(msg *nats.Msg) {
|
||||||
|
message := slf.messagePool.Get()
|
||||||
|
defer slf.messagePool.Release(message)
|
||||||
|
if err := json.Unmarshal(msg.Data, &message); err != nil {
|
||||||
|
log.Error("Cross.Nats", zap.Error(err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
packetHandle(message.ServerId, message.Packet)
|
||||||
|
})
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (slf *Nats) PushMessage(serverId int64, packet []byte) error {
|
||||||
|
message := slf.messagePool.Get()
|
||||||
|
defer slf.messagePool.Release(message)
|
||||||
|
message.ServerId = serverId
|
||||||
|
message.Packet = packet
|
||||||
|
data, err := json.Marshal(message)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return slf.conn.Publish(slf.realSubject, data)
|
||||||
|
}
|
|
@ -5,7 +5,7 @@ type Cross interface {
|
||||||
// - serverId: 本服id
|
// - serverId: 本服id
|
||||||
// - packetHandle.serverId: 发送跨服消息的服务器id
|
// - packetHandle.serverId: 发送跨服消息的服务器id
|
||||||
// - packetHandle.packet: 数据包
|
// - packetHandle.packet: 数据包
|
||||||
Init(serverId int64, packetHandle func(serverId int64, packet []byte))
|
Init(server *Server, packetHandle func(serverId int64, packet []byte)) error
|
||||||
// PushMessage 推送跨服消息
|
// PushMessage 推送跨服消息
|
||||||
// - serverId: 目标服务器id
|
// - serverId: 目标服务器id
|
||||||
PushMessage(serverId int64, packet []byte) error
|
PushMessage(serverId int64, packet []byte) error
|
||||||
|
|
|
@ -122,6 +122,7 @@ func (slf *event) OnConnectionReceiveWebsocketPacketEvent(conn *Conn, packet []b
|
||||||
// RegReceiveCrossPacketEvent 在接收到跨服数据包时将立即执行被注册的事件处理函数
|
// RegReceiveCrossPacketEvent 在接收到跨服数据包时将立即执行被注册的事件处理函数
|
||||||
func (slf *event) RegReceiveCrossPacketEvent(handle ReceiveCrossPacketEventHandle) {
|
func (slf *event) RegReceiveCrossPacketEvent(handle ReceiveCrossPacketEventHandle) {
|
||||||
slf.receiveCrossPacketEventHandles = append(slf.receiveCrossPacketEventHandles, handle)
|
slf.receiveCrossPacketEventHandles = append(slf.receiveCrossPacketEventHandles, handle)
|
||||||
|
log.Info("Server", zap.String("RegEvent", runtimes.CurrentRunningFuncName()), zap.String("handle", reflect.TypeOf(handle).String()))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (slf *event) OnReceiveCrossPacketEvent(serverId int64, packet []byte) {
|
func (slf *event) OnReceiveCrossPacketEvent(serverId int64, packet []byte) {
|
||||||
|
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"github.com/kercylan98/minotaur/utils/log"
|
"github.com/kercylan98/minotaur/utils/log"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
|
"reflect"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -28,9 +29,13 @@ func WithCross(serverId int64, cross Cross) Option {
|
||||||
return func(srv *Server) {
|
return func(srv *Server) {
|
||||||
srv.id = serverId
|
srv.id = serverId
|
||||||
srv.cross = cross
|
srv.cross = cross
|
||||||
srv.cross.Init(serverId, func(serverId int64, packet []byte) {
|
err := srv.cross.Init(srv, func(serverId int64, packet []byte) {
|
||||||
srv.PushMessage(MessageTypeCross, serverId, packet)
|
srv.PushMessage(MessageTypeCross, serverId, packet)
|
||||||
})
|
})
|
||||||
|
if err != nil {
|
||||||
|
log.Error("WithCross", zap.Int64("ServerID", serverId), zap.String("Cross", reflect.TypeOf(cross).String()))
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue