项目学习总结
学习历程
本项目的学习是一个循序渐进的过程:
- 首先,巩固了版本控制(Git)和数据存储(MySQL、Redis)及容器化技术 Docker 的基础知识,为项目的技术栈奠定基础。
- 随后,深入学习了微服务架构理论,为项目的主体开发做准备。
- 重点研究了 Golang 生态中的主流框架:
- Gin:用于构建 Web 应用
- Gorm:作为 ORM 工具
- Go-Zero:用于微服务开发
- 将理论知识应用于实践,开发了一个基于微服务架构的 Web 应用。
主要收获
- 微服务架构: 通过实现用户、好友、消息等服务,我深入理解了微服务的设计和实现原则。
- API 网关: 学会了使用 Gin 封装 gateway,统一处理请求和认证。
- 身份认证: 实现了基于 JWT 的用户认证机制,了解了 JWT 的不同加密算法。
- 数据库操作: 使用 Gorm 进行 ORM 操作,提高了数据库交互的效率。
- 缓存应用: 学会了 Redis 的 Hash, Zset 和 String 数据结构的使用。
- 实时通信: 实现了基于 WebSocket 的即时消息推送功能。
- 代码组织: 学会了如何更好地组织代码,如逻辑和 Dao 层的分离。
遇到的难点和解决方案
- 微服务架构设计: 最初设计时,没有对微服务的边界和职责进行清晰划分,后来重新设计了服务的划分和组织。
- DAO 层的错误处理: 最初在 DAO 层过度包装错误,后来了解到需要保持 DAO 层的简洁性,将错误判断逻辑移至业务层。
- gateway 路由拆分:在 gateway 的路由设计中,遇到了路由过多的问题,通过将路由拆分到不同的文件解决了这个问题。
- gateway 层的多 rpc 客户端集成: 通过使用全局变量和封装 init 函数,优化了初始化过程,并减少传参以简化代码。
- WebSocket 的集成与实时通信: 在群聊功能的实现中,遇到了 WebSocket 的多对多连接管理问题,通过参考 Go-Zero 的 example 解决了这个问题。
- 用户登出的 token 处理: 在用户登出时,将 token 加入黑名单,设置过期时间为 token 内设置的剩余有效时间,以防止过期 token 继续有效。(另一方案是将 token 存入 redis,通过 redis 的删除 token 来实现登出,但项目目前保留了黑名单方案)
- 多个写入操作的事务处理: 在创建群组并将群主加入群时,需要保证多个写入操作的原子性,通过使用事务来解决这个问题。
- 数据库查询优化: 意识到需要优先考虑磁盘 IO 来优化数据库查询性能。
项目思考
- 模块化: 项目的模块化和微服务架构设计使得各个服务可以独立开发和扩展,提高了系统的可维护性和可靠性。
- 性能优化: 在实现功能的同时,也需要考虑性能问题,如使用缓存、优化数据库查询等(目前项目仅缓存了部分聊天记录,仍需思考哪些是热门数据)。
- 安全性: 实现了基本的身份认证,但在实际应用中还需要考虑更多的安全措施。
- 可扩展性: 当前的架构设计为未来添加新功能(如文件传输)提供了良好的基础。