Knative 实战:三步走!基于 Knative Serverless 技术实现一个短网址服务
短网址顾名思义就是使用比较短的网址代替很长的网址。维基百科上面的解释是这样的:
短网址又称网址缩短、缩短网址、URL 缩短等,指的是一种互联网上的技术与服务,此服务可以提供一个非常短小的 URL 以代替原来的可能较长的URL,将长的 URL 位址缩短。用户访问缩短后的 URL 时通常将会重定向到原来的长 URL
起源
虽然现在互联网已经非常发达了,但还是有很多场景会对用户输入的内容有长度限制。比如 :
- 微薄、Twitter 长度不能超过 140 个字
- 一些早期的 BBS 文章单行的长度不能超过 78 字符等场景
- 运营商短信的长度不能超过 70 个字
而现在很多媒体、电商平台的内容大多都是多人协作通过比较复杂的系统、框架生成的,链接长度几十个甚至上百字符都是很平常的事情,所以如果在上述的几个场景中传播链接使用短网址服务就是一个必然的结果。比如下面这些短信截图你应该不会陌生:
应用场景
短网址服务的最初本意就是缩短长 url,方便传播。但其实短网址服务还能做很多其他的事情。比如下面这些:
- 访问次数的限制,比如只能访问 1 次,第二次访问的时候就拒绝服务
- 时间的限制,比如只能在一周内提供访问服务,超过一周就拒绝服务
- 根据访问者的地域的限制
- 通过密码访问
- 访问量统计
- 高峰访问时间统计等等
- 统计访问者的一些信息,比如:
- 来源城市
- 访问时间
- 使用的终端设备、浏览器
- 访问来源 IP
- 在营销活动中其实还可以对不同的渠道生成不通的短网址,这样通过统计这些短网址还能判断不同渠道的访问量等信息
基于 Knative Serverless 技术实现一个短网址服务
在 Knative 模式下可以实现按需分配,没有流量的时候实例缩容到零,当有流量进来的时候再自动扩容实例提供服务。
现在我们就基于阿里云容器服务的 Knative 来实现一个 serverless 模式的短网址服务。本示例会给出一个完整的 demo,你可以自己在阿里云容器服务上面创建一个 Knative 集群,使用本示例提供服务。本示例中实现一个最简单的功能
- 通过接口实现长网址到短网址的映射服务
- 当用户通过浏览器访问短网址的时候通过 301 跳转到长网址
下面我们一步一步实现这个功能
数据库
既然要实现短网址到长网址的映射,那么就需要保存长网址的信息到数据库,并且生成一个短的 ID 作为短网址的一部分。所以我们首先需要选型使用什么数据库。在本示例中我们选择使用阿里云的表格存储,表格存储最大的优势就是按量服务,你只需要为你使用的量付费,而且价格也很实惠。如下所示的按量计费价格表。1G 的数据保存一年的费用是3.65292元/年( 0.000417 _ 24 _ 365=3.65292) ,是不是很划算。
短网址生成 API
我们需要有一个 API 生成短网址
/new?origin-url=${长网址}
- origin-url 访问地址
返回结果
vEzm6v
假设我们服务的域名是 short-url.default.serverless.kuberun.com ,那么现在访问 http://short-url.default.serverless.kuberun.com/vEzm6v 就可以跳转到长网址了。
代码实现
package main import ( "crypto/md5" "encoding/hex" "fmt" "log" "net/http" "os" "strconv" "time" "strings" "github.com/aliyun/aliyun-tablestore-go-sdk/tablestore" ) var ( alphabet = []byte("abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ") l = &Log{} ) func ShortUrl(url string) string { md5Str := getMd5Str(url) var tempVal int64 var result [4]string for i := 0; i < 4; i++ { tempSubStr := md5Str[i*8 : (i+