这一篇同样是先占坑后完善,我们组大项目的文档雏形大概就是从这里诞生的。
技术栈
| 功能 | 实现 |
|---|---|
| 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/CD | Github Action |
配置中心,服务发现和注册中心
nacos作为配置中心
etcd作为服务发现和注册中心
架构图
数据库
MySQL+Redis
消息表
| 字段 | 数据类型 | 说明 |
|---|---|---|
| id | bigint | 主键id |
| from_user_id | bigint | 发送方id |
| to_user_id | bigint | 接收方id |
| content | varchar | 消息内容 |
| create_time | bigint | 发送时间 |
- 使用 redis 缓存用户的最后一条消息
- 使用雪花算法
用户注册
流程
首先对用户名和密码进行格式校验,这里使用的是vilidator包
再从redis中查询是否该用户名已经存在,若存在则直接返回用户名已经存在,请重新注册
校验通过后,通过雪花算法生成user_id,将user_id、用户名和进行加盐加密的密码写入kafka,再生成token,然后直接返回信息
kafka消费消息,再加上返回随机图片的url作为头像和背景的url,个性签名也是请求能返回随机个性签名的网站,然后将用户名写入redis,用户信息写入mysql
用户登录
首先校验用户名和密码的格式
通过后先从redis查询该用户名是否存在,不存在直接返回错误,
存在后进行密码校验,根据盐值和加密算法校验密码
通过后同样返回token
用户信息
首先通过jwt中间件验证身份,通过后获取用户id
根据id获取用户信息,并发调用其他rpc拼接最终的返回信息
jwt双token
accessToken的存在,保证了登录态的正常验证,因其过期时间的短暂也保证了帐号的安全性refreshToekn的存在,保证了用户(即使是非活跃用户)无需在短时间内进行反复的登陆操作来保证登录态的有效性,同时也保证了活跃用户的登录态可以一直存续而不需要进行重新登录,其反复刷新也防止某些不怀好意的人获取refreshToken后对用户帐号进行动手动脚的操作