ZBLOG

go-zero 完成websocket聊天服务实现高并发的完整过程,不使用kaffka,不使用api文件

实现一个高并发的 WebSocket 聊天服务可以使用 Go 的 go-zero 框架。下面是一个简单的步骤和代码示例,展示如何实现一个 WebSocket 聊天服务,而不使用 Kafka 或 API 文件。

步骤

  1. 安装 go-zero: 确保你已经安装了 Go 和 go-zero。在终端中运行:

    go get -u github.com/zeromicro/go-zero
    
  2. 创建项目结构: 创建一个新的项目目录,并在其中创建必要的文件结构。

   websocket-chat/
   ├── main.go
   └── chat.go
  1. 编写 WebSocket 逻辑:

chat.go 中,我们会处理 WebSocket 连接和消息传递。

// chat.go
package main

import (
	"github.com/gorilla/websocket"
	"net/http"
	"sync"
)

var upgrader = websocket.Upgrader{
	CheckOrigin: func(r *http.Request) bool {
		return true // Allow all origins for simplicity, in production use appropriate checks.
	},
}

type Client struct {
	conn *websocket.Conn
	send chan []byte
}

type Hub struct {
	clients map[*Client]bool
	lock    sync.Mutex
}

func NewHub() *Hub {
	return &Hub{
		clients: make(map[*Client]bool),
	}
}

func (h *Hub) Register(client *Client) {
	h.lock.Lock()
	defer h.lock.Unlock()
	h.clients[client] = true
}

func (h *Hub) Unregister(client *Client) {
	h.lock.Lock()
	defer h.lock.Unlock()
	delete(h.clients, client)
	close(client.send)
}

func (h *Hub) Broadcast(message []byte) {
	h.lock.Lock()
	defer h.lock.Unlock()

	for client := range h.clients {
		select {
		case client.send <- message:
		default:
			close(client.send)
			delete(h.clients, client)
		}
	}
}

func handleConnection(w http.ResponseWriter, r *http.Request, hub *Hub) {
	conn, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
		return // Handle error appropriately in production code.
	}
	client := &Client{conn: conn, send: make(chan []byte)}
	hub.Register(client)

	go handleMessages(client, hub)

	for {
		var msg []byte
		err := conn.ReadMessage(&msg)
		if err != nil {
			break // Handle the error appropriately in production code.
		}
		
        hub.Broadcast(msg) // Broadcast incoming message to all clients.
    }

    hub.Unregister(client)
}

// Handle messages sent from a client and write them to the WebSocket connection.
func handleMessages(c *Client, hub *Hub) {
	for msg := range c.send {
        if err := c.conn.WriteMessage(websocket.TextMessage, msg); err != nil {
            return // Handle the error appropriately in production code.
        }
    }
}

// Main function to set up routes and start server.
func main() {
	hub := NewHub()

	http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) { 
	    handleConnection(w, r, hub)
    })

	err := http.ListenAndServe(":8080", nil)
	if err != nil {
        panic("Error starting server")
    }
}
  1. 运行服务器:

在命令行中进入你的项目目录,然后运行:

go run main.go chat.go
  1. 测试聊天功能:

可以使用浏览器中的 JavaScript 客户端或其他 WebSocket 客户端来测试聊天功能。例如,可以用以下 JavaScript 示例进行测试:

const ws = new WebSocket('ws://localhost:8080/ws');

ws.onopen = () => { 
  console.log("Connected");
};

ws.onmessage = (event) => { 
  console.log("Received:", event.data);
};

// Send a message every second for testing purposes.
setInterval(() => { 
  ws.send("Hello World");
}, 1000);

总结

上述代码实现了一个基本的 WebSocket 聊天服务。每当客户端发送消息时,服务将其广播到所有连接的客户端。这只是个基础实现,实际应用中你可能还需要考虑身份验证、错误处理等安全性和性能方面的问题。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=22743

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?