Go 语言写大项目 | 青训营

136 阅读2分钟

这一篇同样是先占坑后完善,我们组大项目的文档雏形大概就是从这里诞生的。

技术栈

功能实现
http框架go-zero
rpc框架go-zero
orm框架gorm
数据库Innodb-cluster,redis-cluster,mongodb
对象存储腾讯云cos,minio
服务发现、注册与配置中心etcd,nacos
链路追踪jaeger
服务监控prometheus,grafana
消息队列kafka
日志搜集filebeat,go-stash,elasticsearch,kibana
网关traefik
部署Docker,docer-compose
CI/CDGithub Action

配置中心,服务发现和注册中心

nacos作为配置中心

etcd作为服务发现和注册中心

架构图

数据库

MySQL+Redis

消息表

字段数据类型说明
idbigint主键id
from_user_idbigint发送方id
to_user_idbigint接收方id
contentvarchar消息内容
create_timebigint发送时间
  • 使用 redis 缓存用户的最后一条消息
  • 使用雪花算法

用户注册

流程

首先对用户名和密码进行格式校验,这里使用的是vilidator包

再从redis中查询是否该用户名已经存在,若存在则直接返回用户名已经存在,请重新注册

校验通过后,通过雪花算法生成user_id,将user_id、用户名和进行加盐加密的密码写入kafka,再生成token,然后直接返回信息

kafka消费消息,再加上返回随机图片的url作为头像和背景的url,个性签名也是请求能返回随机个性签名的网站,然后将用户名写入redis,用户信息写入mysql

用户登录

首先校验用户名和密码的格式

通过后先从redis查询该用户名是否存在,不存在直接返回错误,

存在后进行密码校验,根据盐值和加密算法校验密码

通过后同样返回token

用户信息

首先通过jwt中间件验证身份,通过后获取用户id

根据id获取用户信息,并发调用其他rpc拼接最终的返回信息

jwt双token

  1. accessToken的存在,保证了登录态的正常验证,因其过期时间的短暂也保证了帐号的安全性
  2. refreshToekn的存在,保证了用户(即使是非活跃用户)无需在短时间内进行反复的登陆操作来保证登录态的有效性,同时也保证了活跃用户的登录态可以一直存续而不需要进行重新登录,其反复刷新也防止某些不怀好意的人获取refreshToken后对用户帐号进行动手动脚的操作