|
|
@@ -6,10 +6,12 @@ import (
|
|
|
"net/http"
|
|
|
"slowwildws/internal/config"
|
|
|
"slowwildws/internal/constants"
|
|
|
+ "slowwildws/internal/service"
|
|
|
"slowwildws/internal/types"
|
|
|
"sync"
|
|
|
"time"
|
|
|
|
|
|
+ slowWildQueue "git.banshen.xyz/huangguangrong/slow_wild_queue"
|
|
|
"github.com/gorilla/websocket"
|
|
|
"github.com/zeromicro/go-zero/core/logx"
|
|
|
"github.com/zeromicro/go-zero/core/threading"
|
|
|
@@ -22,9 +24,11 @@ type WebsocketServer struct {
|
|
|
upgrader websocket.Upgrader
|
|
|
logx.Logger
|
|
|
opt *serverOption
|
|
|
+ ctx context.Context
|
|
|
*threading.TaskRunner
|
|
|
- ctx context.Context
|
|
|
- messageServer *MessageServer
|
|
|
+ messageServer *MessageServer
|
|
|
+ slowwildService *service.SlowWildService
|
|
|
+ msgChatTransferClient slowWildQueue.MsgChatTransferClient
|
|
|
}
|
|
|
|
|
|
func NewWebsockerServer(conf config.Config, opts ...ServerOptions) *WebsocketServer {
|
|
|
@@ -35,12 +39,15 @@ func NewWebsockerServer(conf config.Config, opts ...ServerOptions) *WebsocketSer
|
|
|
return true
|
|
|
},
|
|
|
},
|
|
|
- Logger: logx.WithContext(context.Background()),
|
|
|
- connToUser: make(map[*ConnectionServer]int64),
|
|
|
- userToConn: make(map[int64]*ConnectionServer),
|
|
|
- opt: &opt,
|
|
|
- TaskRunner: threading.NewTaskRunner(opt.concurrency),
|
|
|
- messageServer: NewMessageServer(),
|
|
|
+ Logger: logx.WithContext(context.Background()),
|
|
|
+ connToUser: make(map[*ConnectionServer]int64),
|
|
|
+ userToConn: make(map[int64]*ConnectionServer),
|
|
|
+ opt: &opt,
|
|
|
+ TaskRunner: threading.NewTaskRunner(opt.concurrency),
|
|
|
+ messageServer: NewMessageServer(),
|
|
|
+ ctx: context.Background(), // 后期考虑使用传递进来的ctx
|
|
|
+ slowwildService: service.NewSlowWildService(),
|
|
|
+ msgChatTransferClient: slowWildQueue.NewMsgChatTransferClient(conf.MsgChatTransfer.Addrs, conf.MsgChatTransfer.Topic),
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -132,6 +139,7 @@ func (s *WebsocketServer) ReadAck(conn *ConnectionServer) {
|
|
|
FrameType: constants.FrameAck,
|
|
|
Id: message.Id,
|
|
|
AckSeq: message.AckSeq + 1,
|
|
|
+ Data: "ack 应答",
|
|
|
}, conn)
|
|
|
// 进行业务处理,从队列中移除
|
|
|
conn.readMessageList = conn.readMessageList[1:]
|
|
|
@@ -199,8 +207,19 @@ func (s *WebsocketServer) HandleWrite(conn *ConnectionServer) {
|
|
|
case constants.FramePing:
|
|
|
s.messageServer.Send(&types.Message{FrameType: constants.FramePing}, conn)
|
|
|
case constants.FrameData, constants.FrameNoAck:
|
|
|
- if handler, ok := message.Method; ok {
|
|
|
- handler(s, conn, message)
|
|
|
+ fmt.Println("收到消息:", message)
|
|
|
+ if handler := s.slowwildService.GetMethodHandler(message.Method, s.ctx); handler != nil {
|
|
|
+ messageData, err := handler.ChatHandler(message, conn.Uid)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("执行失败:", err)
|
|
|
+ s.messageServer.Send(s.NewErrMessage(err), conn)
|
|
|
+ }
|
|
|
+ // 推送到kafka由其他服务消费
|
|
|
+ err = s.msgChatTransferClient.Push(messageData)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("执行失败2:", err)
|
|
|
+ s.messageServer.Send(s.NewErrMessage(err), conn)
|
|
|
+ }
|
|
|
} else {
|
|
|
s.messageServer.Send(&types.Message{FrameType: constants.FrameData, Data: []byte(fmt.Sprintf("不存在执行的方法 %v 请检查", message.Method))}, conn)
|
|
|
}
|
|
|
@@ -226,3 +245,10 @@ func (s *WebsocketServer) NewErrMessage(err error) *types.Message {
|
|
|
Data: err.Error(),
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+func (s *WebsocketServer) GetConn(uid int64) *ConnectionServer {
|
|
|
+ s.RWMutex.RLock()
|
|
|
+ defer s.RWMutex.RUnlock()
|
|
|
+
|
|
|
+ return s.userToConn[uid]
|
|
|
+}
|