0%

Golang云存储实战

3mysql

数据库分表
水平分表:假设分成256张文件表,按文件Sha1值后两位来切分,则以:tb_${FILE_SHA1}[:-2]的规则到对应表进行存取。

// OnFileUploadFinished : 文件上传完成,保存meta (插入)
// GetFileMeta : 从mysql获取文件元信息(查询)
// UpdateFileLocation : 更新文件的存储地址(如文件被转移了) (更新)
涉及源码:db(file.go mysql(conn.go))

使用MySQL小结:
通过sql.DB来管理数据连接对象
通过sql.Open来创建协程安全的sql.DB
优先使用Prepared Statement

4-1用户系统用户表设计(注册和登录)

由于原有情况下,唯一索引用在了字段phone上. 而当前插入表的sql语句中, user_name才是应该要保持唯一的, 因此相对于视频所演示的建表语句进行了更新, 具体如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE `tbl_user` ( 
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(64) NOT NULL DEFAULT '' COMMENT '用户名',
`user_pwd` varchar(256) NOT NULL DEFAULT '' COMMENT '用户encoded密码',
`email` varchar(64) DEFAULT '' COMMENT '邮箱',
`phone` varchar(128) DEFAULT '' COMMENT '手机号',
`email_validated` tinyint(1) DEFAULT 0 COMMENT '邮箱是否已验证',
`phone_validated` tinyint(1) DEFAULT 0 COMMENT '手机号是否已验证',
`signup_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '注册日期',
`last_active` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后活跃时间戳',
`profile` text COMMENT '用户属性',
`status` int(11) NOT NULL DEFAULT '0' COMMENT '账户状态(启用/禁用/锁定/标记删除等)',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`user_name`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

登录
// 1. 校验用户名及密码
// 2. 生成访问凭证(token)
// 3. 登录成功后重定向到首页
涉及源码:
db(user.go )
handle(user.go)

访问鉴权(验证token的拦截器)
handler(auth.go)

5.hash算法对比以及秒传原理

6.Redis

分块上传与断点续传
分块上传:文件切成多块,独立上传,上传完成后合并(初始化上传->上传分块(并行)->通知上传完成)
断点续传:传输暂停或一场终端后,可基于原来进度重传

小文件不建议分块上传
可以并行上传分块,并且可以无序传输
分块上传能极大提高传输效率
减少传输失败后重试的流量和时间

初始化分块信息
上传分块
通知分块上传完成
取消上传分块
查看分块上传的整体状态

涉及源码:
cache(redis(conn.go))

handler(mpupload.go)

7.Ceph

Ceph:redhat开源出来的分布式存储系统

8.阿里云对象存储OSS

8-3 OSS术语

oss01.png

8-4 OSS网页具体操作

9.RabbitMQ

RabbitMQ:一种开源的消息代理

10.微服务

微服务架构图

基于gin改造用户service

go-micro

源码说明:

  • master分支: 通过原生net/http实现各接口功能
  • gin分支: 通过Gin框架来改造(微服务化章节之后主要基于Gin框架来进行演示)
  • pkg分支: 通过go-bindata等工具实现静态资源打包的一个示例
  • 第九章(RabbitMQ异步存储)章节的代码,可以下载标签为v0.3的版本
  • 第八章(OSS)及之前章节的代码,可以下载标签为v0.2的版本

参考资料