go-zero + WebSocket 小白入门

go-zero + WebSocket 小白入门 先搞懂3个概念用电话打比方1. go-zero 是什么go-zero 是一个帮你写网络服务的工具箱。你只需要告诉它「我要开一个服务器端口8888」它帮你把服务器搭好。2. HTTP 请求 打一次电话就挂你喂现在几点服务器10:30。挂电话你想再问得重新拨号。3. WebSocket 打通不挂的电话你喂我要知道每1秒的时间。服务器好电话不挂每到整秒我告诉你。10:30:00你自动收到10:30:01你自动收到10:30:02你自动收到...例子服务器每秒推时钟项目结构你的项目/├── apiGateway.go ← main函数启动服务器├── internal/ │├── config/ ││ └── config.go ← 配置端口等│ ├── svc/ ││ └── servicecontext.go ← 全局上下文│ └── handler/│ └── wstimehandler.go ← ← ← WebSocket核心代码你自己写第1步装包装电话机驱动终端执行go get github.com/gorilla/websocket第2步写 WebSocket 处理器新建internal/handler/wstimehandler.gopackage handler import ( net/http time github.com/gorilla/websocket ) // 1. 升级器把普通HTTP升级成WebSocket标配不用改 var upgrader websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true // 允许所有来源连接 }, } // 2. 处理函数浏览器连上来时执行这个 func WsTimeHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { // 2.1 升级成 WS 连接 // 相当于电话接通了不挂 conn, _ : upgrader.Upgrade(w, r, nil) defer conn.Close() // 函数结束时挂电话 // 2.2 循环推送每1秒 for { // 获取当前时间 now : time.Now().Format(15:04:05) // 把时间写进WS连接 → 浏览器自动收到 err : conn.WriteMessage(websocket.TextMessage, []byte(now)) if err ! nil { break // 浏览器断开就退出循环 } // 等1秒 time.Sleep(1 * time.Second) } } }每一行解释var upgrader定义一个「电话升级器」它知道怎么把普通电话变成不挂的电话CheckOrigin: true允许任何人打进来开发时用conn, _ : upgrader.Upgrade(...)真正执行升级返回一个「不挂的电话线」conn.WriteMessage(...)通过这条电话线发送消息websocket.TextMessage发送的是文字不是二进制第3步注册路由告诉服务器这个WS电话在哪接打开apiGateway.go在main函数里加一行func main() { // ... 前面的代码不用动... server : rest.MustNewServer(c.RestConf) defer server.Stop() // 加这一行 // 意思如果有人访问 ws://127.0.0.1:8888/ws/clock // 就用刚才写的 WsTimeHandler 处理 server.AddRoute(rest.Route{ Method: http.MethodGet, // GET 请求 Path: /ws/clock, // WS 路径 Handler: handler.WsTimeHandler(svcCtx), // 处理函数 }) // // ... 后面的代码不用动... server.Start() }第4步浏览器连接测试也可以用接口工具测试启动你的 go-zero 服务后打开浏览器按F12→ 点Console控制台→ 粘贴下面代码// 4.1 连接 WebSocket let ws new WebSocket(ws://127.0.0.1:8888/ws/clock) // 4.2 收到消息时自动执行 ws.onmessage function(event) { console.log(服务器说, event.data) } // 4.3 连接打开时执行 ws.onopen function() { console.log(已连接等着收时间吧) } // 4.4 连接断开时执行 ws.onclose function() { console.log(连接断开了) }看到的效果已连接等着收时间吧服务器说 21:52:03服务器说 21:52:04服务器说 21:52:05...每秒自动出现一行如果你只想抄走3个文件就够了文件你要做的事internal/handler/wstimehandler.go全文复制改WriteMessage里的内容apiGateway.go加一行server.AddRoute(...)浏览器 Console粘贴new WebSocket()代码换个功能只用改2处wstimehandler.go的now : time.Now()...→ 换成你的数据apiGateway.go的/ws/clock→ 换个路径名新手最容易犯的3个错错误表现原因修法忘装包编译报错undefined: websocket没执行go get执行go get github.com/gorilla/websocket忘注册路由浏览器报404没在apiGateway.go加AddRoute加那一行WS路径不对连不上前端ws://host:port/xxx和后端路径不一致前后端路径拼写一致