项目概述

这是一个基于Go语言开发的完整聊天室系统,采用客户端-服务器架构,支持用户注册、登录认证、即时聊天、私聊等功能。项目使用MySQL作为数据存储,通过Docker容器化部署,展现了现代分布式应用的典型设计模式。

技术栈

  • 后端语言: Go 1.21+
  • 网络通信: TCP Socket
  • 数据库: MySQL 8.0
  • 容器化: Docker & Docker Compose
  • 认证系统: 自定义用户认证
  • 并发模型: Goroutine + Channel

项目架构

1. 服务器端 (Server)

主要组件:

聊天室核心 (main.go)

go

type ChatRoom struct {
    clients    map[*Client]bool      // 在线客户端映射
    broadcast  chan BroadcastMessage // 广播消息通道
    join       chan *Client          // 加入通道
    leave      chan *Client          // 离开通道
    mutex      sync.RWMutex          // 读写锁
    workerPool chan struct{}         // 工作池
}

关键特性:

  • 并发安全设计: 使用读写锁保护共享状态
  • 消息队列: 缓冲通道避免消息丢失
  • 工作池: 控制并发广播任务数
  • 优雅退出: 使用通道通知协程退出

认证模块 (auth.go)

go

type AuthResult struct {
    Success bool
    Message string
    User    *database.User
}
  • 用户名/密码验证
  • 输入格式校验(正则表达式)
  • 错误处理友好提示

2. 数据库层 (database/db.go)

数据模型:

go

type User struct {
    ID        int64
    Username  string
    Password  string    // 明文存储(生产环境应加密)
    Nickname  string
    CreatedAt time.Time
}

核心功能:

  • 连接池管理
  • 用户CRUD操作
  • 唯一性约束检查
  • 自动创建测试数据

3. 客户端 (client/main.go)

客户端状态机:

go

type ClientState struct {
    Authenticated bool   // 认证状态
    Nickname      string // 显示昵称
    Username      string // 登录用户名
}

交互流程:

  1. 连接服务器
  2. 认证阶段(登录/注册)
  3. 聊天阶段(公聊/私聊)
  4. 优雅退出

核心功能实现

1. 用户认证流程

go

// 认证状态转换
未认证 -> [登录/注册] -> 已认证 -> [聊天] -> 退出

注册验证规则:

  • 用户名:3-20位字母/数字/下划线
  • 密码:至少6位
  • 昵称:2-20位中文/字母/数字/下划线

2. 消息广播机制

go

// 广播消息给所有在线用户
func (cr *ChatRoom) sendToAll(msg string, exclude *Client) {
    cr.mutex.RLock()
    defer cr.mutex.RUnlock()
    
    for client := range cr.clients {
        if exclude != nil && client == exclude {
            continue
        }
        client.channel <- msg
    }
}

3. 私聊功能

go

// 私聊消息格式
/whisper 目标昵称 消息内容
/w 目标昵称 消息内容(简写)

4. 在线用户管理

go

// 获取在线用户列表
func (cr *ChatRoom) getOnlineUsers() []string {
    users := make([]string, 0, len(cr.clients))
    for client := range cr.clients {
        users = append(users, client.user.Nickname)
    }
    return users
}

并发模型设计

1. 基于Channel的消息传递

go

// 三个核心通道
broadcast  // 处理广播消息
join       // 处理用户加入
leave      // 处理用户离开

2. 读写锁保护共享状态

go

// 读操作 - 共享锁
cr.mutex.RLock()
// ... 读取操作
cr.mutex.RUnlock()

// 写操作 - 排他锁
cr.mutex.Lock()
// ... 写入操作
cr.mutex.Unlock()

3. 协程生命周期管理

go

go func() { // 接收消息协程
    defer wg.Done()
    // ... 消息处理
}()

go func() { // 发送消息协程
    defer wg.Done()
    // ... 输入处理
}()

部署架构

Docker Compose编排

yaml

services:
  mysql:           # 数据库服务
  chatroom-server: # 服务器应用
  chatroom-client: # 客户端应用

网络配置:

  • 自定义bridge网络 chatroom-network
  • 容器间通过服务名通信
  • 端口映射对外暴露服务

健康检查

yaml

healthcheck:
  test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
  interval: 10s
  timeout: 5s
  retries: 10

项目亮点

1. 完整的错误处理

  • 网络异常恢复
  • 数据库连接重试
  • 用户输入验证

2. 资源管理

  • 数据库连接池
  • 内存泄漏防护
  • 协程泄露避免

3. 可观测性

  • 连接状态日志
  • 在线人数统计
  • 消息广播计数

4. 扩展性设计

  • 模块化架构
  • 配置外部化
  • 接口预留

使用指南

启动服务

bash

docker-compose up -d

客户端操作

  1. 登录:/login username password
  2. 注册:/register username password nickname
  3. 查看帮助:/help
  4. 私聊:/w nickname message
  5. 退出:/exit

性能优化点

  1. 消息缓冲: 使用缓冲通道减少阻塞
  2. 连接复用: 保持TCP长连接
  3. 批量处理: 消息批量广播
  4. 内存池: 复用消息对象

安全考虑

  1. 输入验证: 防止注入攻击
  2. 认证限制: 同一用户多处登录限制
  3. 资源限制: 连接数控制
  4. 超时机制: 空闲连接清理

扩展方向

  1. 消息持久化: 聊天记录存储
  2. 文件传输: 支持图片/文件
  3. 群组功能: 创建聊天群组
  4. Web界面: 提供WebSocket支持
  5. 消息加密: 端到端加密通信

总结

这个项目展示了如何使用Go语言构建一个完整的实时聊天系统。它涵盖了:

  • 网络编程: TCP Socket通信
  • 并发处理: Goroutine和Channel
  • 数据存储: MySQL数据库操作
  • 系统设计: 模块化架构
  • 部署运维: Docker容器化

代码结构清晰,功能完整,既适合学习Go语言的高级特性,也展示了生产级应用的设计思路。通过这个项目,开发者可以掌握构建分布式实时系统所需的核心技能。


项目地址: [你的GitHub仓库链接]
技术栈: Go, MySQL, Docker, TCP/IP
适用场景: 学习项目、原型验证、技术演示

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐