fix: 客户端和网关只能通过长连接方式通信,移除 HTTP 注册端点
This commit is contained in:
@@ -19,10 +19,6 @@ func main() {
|
|||||||
log.Fatalf("Failed to load config: %v", err)
|
log.Fatalf("Failed to load config: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 创建 WebSocket Hub
|
|
||||||
hub := ws.NewHub()
|
|
||||||
go hub.Run()
|
|
||||||
|
|
||||||
// 初始化用户服务
|
// 初始化用户服务
|
||||||
userService, err := service.NewUserService(cfg)
|
userService, err := service.NewUserService(cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -30,6 +26,10 @@ func main() {
|
|||||||
}
|
}
|
||||||
logger.Info("User service initialized successfully")
|
logger.Info("User service initialized successfully")
|
||||||
|
|
||||||
|
// 创建 WebSocket Hub
|
||||||
|
hub := ws.NewHub(userService)
|
||||||
|
go hub.Run()
|
||||||
|
|
||||||
// 创建路由器
|
// 创建路由器
|
||||||
r := router.NewRouter(hub, userService)
|
r := router.NewRouter(hub, userService)
|
||||||
|
|
||||||
@@ -38,7 +38,6 @@ func main() {
|
|||||||
log.Printf("Gateway service starting on %s", serverAddr)
|
log.Printf("Gateway service starting on %s", serverAddr)
|
||||||
log.Printf("WebSocket endpoint: ws://localhost%s/ws", serverAddr)
|
log.Printf("WebSocket endpoint: ws://localhost%s/ws", serverAddr)
|
||||||
log.Printf("Health check: http://localhost%s/health", serverAddr)
|
log.Printf("Health check: http://localhost%s/health", serverAddr)
|
||||||
log.Printf("User register endpoint: http://localhost%s/api/user/register", serverAddr)
|
|
||||||
|
|
||||||
if err := http.ListenAndServe(serverAddr, r.SetupRoutes()); err != nil {
|
if err := http.ListenAndServe(serverAddr, r.SetupRoutes()); err != nil {
|
||||||
log.Fatalf("Failed to start server: %v", err)
|
log.Fatalf("Failed to start server: %v", err)
|
||||||
|
|||||||
@@ -41,64 +41,10 @@ func (r *Router) SetupRoutes() http.Handler {
|
|||||||
// 健康检查
|
// 健康检查
|
||||||
mux.HandleFunc("/health", r.handleHealth)
|
mux.HandleFunc("/health", r.handleHealth)
|
||||||
|
|
||||||
// 用户注册
|
|
||||||
mux.HandleFunc("/api/user/register", r.handleRegister)
|
|
||||||
|
|
||||||
return mux
|
return mux
|
||||||
}
|
}
|
||||||
|
|
||||||
// 注册请求结构
|
|
||||||
type registerRequest struct {
|
|
||||||
Account string `json:"account"`
|
|
||||||
Password string `json:"password"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// 注册响应结构
|
|
||||||
type registerResponse struct {
|
|
||||||
UserID string `json:"user_id"`
|
|
||||||
Account string `json:"account"`
|
|
||||||
Message string `json:"message"`
|
|
||||||
Code int `json:"code"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// handleRegister 处理用户注册请求
|
|
||||||
func (r *Router) handleRegister(w http.ResponseWriter, req *http.Request) {
|
|
||||||
if req.Method != http.MethodPost {
|
|
||||||
w.WriteHeader(http.StatusMethodNotAllowed)
|
|
||||||
w.Write([]byte(`{"code": 405, "message": "Method not allowed"}`))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// 解析请求体
|
|
||||||
var registerReq registerRequest
|
|
||||||
if err := json.NewDecoder(req.Body).Decode(®isterReq); err != nil {
|
|
||||||
w.WriteHeader(http.StatusBadRequest)
|
|
||||||
w.Write([]byte(`{"code": 400, "message": "Invalid request body"}`))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// 调用用户服务注册
|
|
||||||
resp, err := r.userService.Register(req.Context(), registerReq.Account, registerReq.Password)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Register failed: %v", err)
|
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
|
||||||
w.Write([]byte(`{"code": 500, "message": "Internal server error"}`))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// 构造响应
|
|
||||||
response := registerResponse{
|
|
||||||
UserID: resp.UserId,
|
|
||||||
Account: resp.Account,
|
|
||||||
Message: resp.Response.Message,
|
|
||||||
Code: int(resp.Response.Code),
|
|
||||||
}
|
|
||||||
|
|
||||||
// 返回响应
|
|
||||||
w.Header().Set("Content-Type", "application/json")
|
|
||||||
w.WriteHeader(http.StatusOK)
|
|
||||||
json.NewEncoder(w).Encode(response)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *Router) handleWebSocket(w http.ResponseWriter, req *http.Request) {
|
func (r *Router) handleWebSocket(w http.ResponseWriter, req *http.Request) {
|
||||||
conn, err := upgrader.Upgrade(w, req, nil)
|
conn, err := upgrader.Upgrade(w, req, nil)
|
||||||
|
|||||||
@@ -133,7 +133,64 @@ func (c *Client) handleCommand(msg *Message) {
|
|||||||
// 这里可以根据命令类型执行不同的操作
|
// 这里可以根据命令类型执行不同的操作
|
||||||
log.Printf("Received command: %v", msg.Data)
|
log.Printf("Received command: %v", msg.Data)
|
||||||
|
|
||||||
// 示例:回复命令执行结果
|
// 检查是否是注册命令
|
||||||
|
if cmdData, ok := msg.Data.(map[string]interface{}); ok {
|
||||||
|
if cmdType, ok := cmdData["type"].(string); ok && cmdType == "register" {
|
||||||
|
// 提取注册信息
|
||||||
|
account, accountOk := cmdData["account"].(string)
|
||||||
|
password, passwordOk := cmdData["password"].(string)
|
||||||
|
|
||||||
|
if !accountOk || !passwordOk {
|
||||||
|
// 回复错误信息
|
||||||
|
errorResponse := &Message{
|
||||||
|
Type: MessageTypeError,
|
||||||
|
Content: "Invalid register command: missing account or password",
|
||||||
|
}
|
||||||
|
c.send <- errorResponse
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 调用用户服务注册
|
||||||
|
if c.hub.userService != nil {
|
||||||
|
// 异步调用用户服务注册
|
||||||
|
go func() {
|
||||||
|
resp, err := c.hub.userService.Register(nil, account, password)
|
||||||
|
if err != nil {
|
||||||
|
// 回复错误信息
|
||||||
|
errorResponse := &Message{
|
||||||
|
Type: MessageTypeError,
|
||||||
|
Content: "Register failed: " + err.Error(),
|
||||||
|
}
|
||||||
|
c.send <- errorResponse
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 回复成功信息
|
||||||
|
successResponse := &Message{
|
||||||
|
Type: MessageTypeText,
|
||||||
|
Content: "Register successful",
|
||||||
|
Data: map[string]interface{}{
|
||||||
|
"user_id": resp.UserId,
|
||||||
|
"account": resp.Account,
|
||||||
|
"message": resp.Response.Message,
|
||||||
|
"code": resp.Response.Code,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
c.send <- successResponse
|
||||||
|
}()
|
||||||
|
} else {
|
||||||
|
// 回复错误信息
|
||||||
|
errorResponse := &Message{
|
||||||
|
Type: MessageTypeError,
|
||||||
|
Content: "User service not available",
|
||||||
|
}
|
||||||
|
c.send <- errorResponse
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 其他命令处理
|
||||||
response := &Message{
|
response := &Message{
|
||||||
Type: MessageTypeText,
|
Type: MessageTypeText,
|
||||||
Content: "Command executed successfully",
|
Content: "Command executed successfully",
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package ws
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
|
"backend/gateway/internal/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Hub struct {
|
type Hub struct {
|
||||||
@@ -16,14 +18,18 @@ type Hub struct {
|
|||||||
|
|
||||||
// 注销请求
|
// 注销请求
|
||||||
unregister chan *Client
|
unregister chan *Client
|
||||||
|
|
||||||
|
// 用户服务
|
||||||
|
userService *service.UserService
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewHub() *Hub {
|
func NewHub(userService *service.UserService) *Hub {
|
||||||
return &Hub{
|
return &Hub{
|
||||||
broadcast: make(chan *Message),
|
broadcast: make(chan *Message),
|
||||||
register: make(chan *Client),
|
register: make(chan *Client),
|
||||||
unregister: make(chan *Client),
|
unregister: make(chan *Client),
|
||||||
clients: make(map[*Client]bool),
|
clients: make(map[*Client]bool),
|
||||||
|
userService: userService,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user