news 2026/6/22 19:11:29

连接数据库并部署到Linux上使用Docker Compose编排的go语言网络聊天室

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
连接数据库并部署到Linux上使用Docker Compose编排的go语言网络聊天室

项目概述

这是一个基于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
适用场景: 学习项目、原型验证、技术演示

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 18:35:38

Vue2 的数据响应式原理给实例新增响应式属性

Vue2 响应式原理的案例 <template><div id"app"><div>用户名&#xff1a;{{ user.name }}</div><div>年龄&#xff1a;{{ user.age }}</div> <button click"addAgeDirectly">直接添加年龄&#xff08;无响应式&…

作者头像 李华
网站建设 2026/6/21 17:29:40

轰炸敌人,最多可以摧毁的敌人城堡数目

我的解法&#xff1a; 对于每一个空位置&#xff0c;进行一次bfs&#xff0c;从上下左右四个方向去寻找&#xff0c;这是岛屿问题的相似处理&#xff0c;但是这个题可以优化&#xff0c;因为横竖方向可以进行动规优化。 我们不需要对每个 0 都重新数一遍它所在的行和列有多少敌…

作者头像 李华
网站建设 2026/6/22 8:43:39

微信小程序 == rsa加解密工具

wxmp-rsa 1、简介 前端rsa加解密工具。 基于jsencrypt修改扩展功能。兼容小程序环境&#xff0c;压缩后60kb左右的大小&#xff0c;节省小程序空间。支持超长文本加解密。支持中文字符的加解密。 仓库地址 https://github.com/jiayc4215/wxmp-rsa2、安装 npm i wxmp-rsa …

作者头像 李华
网站建设 2026/6/21 17:09:36

安达发|精准排产,守护生命:医疗器械行业车间排产的数字化革命

在关乎人类生命健康的医疗器械制造领域&#xff0c;每一台设备、每一个部件的准时交付&#xff0c;都可能直接影响到患者的治疗与康复。这个行业以其严苛的质量法规&#xff08;如FDA、ISO 13485&#xff09;、复杂的生产工艺和极高的可追溯性要求而著称。在这样的背景下&#…

作者头像 李华
网站建设 2026/6/13 15:25:28

Spring MVC核心流程深度解析:从请求到响应的完美掌控

Spring MVC 核心流程深度解析&#xff1a;从请求到响应的完美掌控 Spring MVC 是 Spring 框架中处理 Web 请求的核心模块&#xff0c;基于 Model-View-Controller (MVC) 设计模式。它以 DispatcherServlet 为入口&#xff0c;实现从 HTTP 请求到响应的完整生命周期管理。下面从…

作者头像 李华
网站建设 2026/6/13 23:26:47

Java毕设选题推荐:基于springboot的游戏售卖商城系统基于SpringBoot+Vue的游戏装备交易商城系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华