Skip to content

项目学习总结

学习历程

本项目的学习是一个循序渐进的过程:

  • 首先,巩固了版本控制(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 来优化数据库查询性能。

项目思考

  • 模块化: 项目的模块化和微服务架构设计使得各个服务可以独立开发和扩展,提高了系统的可维护性和可靠性。
  • 性能优化: 在实现功能的同时,也需要考虑性能问题,如使用缓存、优化数据库查询等(目前项目仅缓存了部分聊天记录,仍需思考哪些是热门数据)。
  • 安全性: 实现了基本的身份认证,但在实际应用中还需要考虑更多的安全措施。
  • 可扩展性: 当前的架构设计为未来添加新功能(如文件传输)提供了良好的基础。