Go语言实战 - 网站性能优化第一弹“七牛云存储”

时间:2021-01-17 15:45:08

由于用户纷纷反应山坡网的打开速度比较慢,所以两天前我们决定把服务器从linode迁移到阿里云。

整个迁移过程非常平滑,基本上一个小时就完成了。而且阿里云的配套设施提供的也很不错,运行状态监控什么的都有。在此向大家推荐阿里云!

话说由于我们资金有限,就选择了ECS服务器中最低档的一款,512MB内存,2MB带宽。而山坡网上会有很多书籍封面图片,这导致了页面打开的速度并没有想象中提高的多,用户反应速度虽有提升,但不明显。

此时我想到了七牛云存储,虽说知道它已经几个月了,但始终没有正式开始用,总觉得我们挺穷的,云存储这类高端大气上档次的东西一时半会儿估计用不上。但还是抱着学习一下的心思打开它看了看。这一看我就乐疯了。

Go语言实战 - 网站性能优化第一弹“七牛云存储”

这……不敢相信啊!二话不说,立马决定把所有书籍封面图片都迁移到云端!

接着打开七牛的API文档看了一下,嗯,简单明了。10分钟后就照着动手了。

七牛的Go SDK提供了两种上传策略,上传内存数据或者上传文件。本来最佳的方式应该是直接上传内存数据,但考虑到服务器内存比较小,所以我选择了性能上次之的文件上传方式。

思路定下来之后就简单了,在文件下载完成之后,上传到云端,返回key值作为书籍封面的url保存到数据库。上传的函数如下:

//将本地文件上传到七牛云存储,返回key。
func UploadToQiniu(filepath string) (string, error) {
  bucket := "xxxxxxx"

  //获取uptoken
  putPolicy := rs.PutPolicy{Scope: bucket}
  uptoken := putPolicy.Token(nil)

  //上传
  var ret qnio.PutRet
  err := qnio.PutFileWithoutKey(nil, &ret, uptoken, filepath, nil)

  return ret.Key, err
}

接着就可以用“http://xxxxxx.qiniu.com/<key>”的方式访问图片资源了。

有经验的人此时应该想到一个问题,防盗链。对啊,就算每个月有100万次免费的GET请求,可以顶不住盗链哪!

七牛早就想到了,很简单,把存储空间设置成为私有的,然后使用如下函数生成访问链接。

//处理成访问七牛云存储私有空间的url
domain := "xxxx.qiniudn.com"
baseUrl := rs.MakeBaseUrl(domain, urlStr)
policy := rs.GetPolicy{}

return policy.MakeRequest(baseUrl, nil)

这样就会在访问的url后面加上一个有时间限制的token。防盗链完成!

再接下来就处理一下历史数据,写个小程序把所有现有的书籍封面都上传到云端,同时更新数据库。

半小时之内,山坡网就搭上了云存储的快车,我和我的小伙伴们都惊呆了!

我这只是用了七牛提供的众多功能中最简单的,其实照这个思路,可以把站点上所有静态的资源都放到云端,仅让我们的服务器处理必要的动态内容。这样成本会大幅降低。

在此,我向所有网站的开发和运营者们推荐七牛云存储!靠谱!