fix: 客户端和网关只能通过长连接方式通信,移除 HTTP 注册端点

This commit is contained in:
fish
2026-03-28 20:26:24 +08:00
parent b6efd99ea3
commit 4f1c0ca9b6
4 changed files with 73 additions and 65 deletions

View File

@@ -19,10 +19,6 @@ func main() {
log.Fatalf("Failed to load config: %v", err)
}
// 创建 WebSocket Hub
hub := ws.NewHub()
go hub.Run()
// 初始化用户服务
userService, err := service.NewUserService(cfg)
if err != nil {
@@ -30,6 +26,10 @@ func main() {
}
logger.Info("User service initialized successfully")
// 创建 WebSocket Hub
hub := ws.NewHub(userService)
go hub.Run()
// 创建路由器
r := router.NewRouter(hub, userService)
@@ -38,7 +38,6 @@ func main() {
log.Printf("Gateway service starting on %s", serverAddr)
log.Printf("WebSocket endpoint: ws://localhost%s/ws", 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 {
log.Fatalf("Failed to start server: %v", err)

View File

@@ -41,64 +41,10 @@ func (r *Router) SetupRoutes() http.Handler {
// 健康检查
mux.HandleFunc("/health", r.handleHealth)
// 用户注册
mux.HandleFunc("/api/user/register", r.handleRegister)
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(&registerReq); 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) {
conn, err := upgrader.Upgrade(w, req, nil)

View File

@@ -133,7 +133,64 @@ func (c *Client) handleCommand(msg *Message) {
// 这里可以根据命令类型执行不同的操作
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{
Type: MessageTypeText,
Content: "Command executed successfully",

View File

@@ -2,6 +2,8 @@ package ws
import (
"log"
"backend/gateway/internal/service"
)
type Hub struct {
@@ -16,14 +18,18 @@ type Hub struct {
// 注销请求
unregister chan *Client
// 用户服务
userService *service.UserService
}
func NewHub() *Hub {
func NewHub(userService *service.UserService) *Hub {
return &Hub{
broadcast: make(chan *Message),
register: make(chan *Client),
unregister: make(chan *Client),
clients: make(map[*Client]bool),
broadcast: make(chan *Message),
register: make(chan *Client),
unregister: make(chan *Client),
clients: make(map[*Client]bool),
userService: userService,
}
}