9 个不稳定版本
0.5.4 | 2020年6月15日 |
---|---|
0.5.3 | 2020年1月24日 |
0.5.2 | 2019年9月3日 |
0.5.1 | 2019年7月9日 |
#1567 in 网页开发
42 每月下载次数
在 shorty-http 中使用
23KB
415 行
shorty
Shorty 是一个 URL 缩短器:它为任意长度的 URL 分配一个短 ID,当人们使用该短 ID 访问 URL 时,将被重定向到原始 URL。
这在需要发送短信通知等场景中非常有用,当您字符数有限,不想用长 URL 和其参数浪费它们时。
Shorty 将其数据存储在 Redis 上。
多种部署方式
Shorty 可以下载为
- 一个 Rust 库
- 一个 HTTP 微服务
- 一个 AWS Lambda
- 一个 Azure 函数
Rust 库
Shorty 用 Rust 编写,并作为 crate 库提供。
有关更多信息,请参阅 文档,并以 shorty-http 二进制 crate 为例。
HTTP 微服务
Shorty 将其数据存储在 Redis 上,因此您首先需要安装 Redis。具体操作取决于您的操作系统。如果您使用的是类似 Debian 的 Linux 发行版,那么操作很简单:
apt-get install redis
如果您更喜欢 docker
,那么操作如下:
docker run --rm -it -p 6379:6379 redis:alpine
Redis 准备就绪后,下载最新的 shorty 版本,解压归档,然后使用以下命令运行 shorty:
SHORTENER_API_KEY_MANDATORY=false ./shorty-http
再次,如果您更喜欢 docker
,那么操作如下:
docker run --rm -it -e SHORTENER_API_KEY_MANDATORY=false --network host ffissore/shorty
Shorty 将记录 Starting server on 127.0.0.1:8088
。
现在向下滚动到 使用 Shorty。
AWS Lambda
为了在 AWS 上部署 Shorty,您需要 node.js。当然!这是一个遗憾,但是 serverless
是一个 node 包,并且是 AWS 上 Lambda 的 de-facto 标准,它运行得很好。
使用以下命令安装所需的依赖:
npm install
然后运行
npx serverless deploy
这将下载一个Docker镜像,用于编译shorty。然后,它将在AWS上创建一个Redis实例,所有必要的网络组件以便lambda连接到Redis,最后它将部署lambda。
完成后,它将打印类似以下内容:
endpoints:
GET - https://9tgwceucu4.execute-api.us-east-1.amazonaws.com/dev/{key}
POST - https://9tgwceucu4.execute-api.us-east-1.amazonaws.com/dev/
请注意:
- 您的AWS账户将被收费:lambda服务在1百万请求内是免费的,但用于暴露它们的“NAT网关”不是。
- 您在
serverless.yml
中找到的CloudFormation膨胀是复制粘贴的(感谢ittus),我几乎不懂它做什么。
当您玩完shorty后,使用以下命令删除所有内容:
npx serverless remove
现在向下滚动到 使用 Shorty。
Azure函数
Azure不支持直接运行Rust,但他们允许您运行任何类型的运行时,只要它在Docker中运行。
Shorty Docker镜像可在Docker Hub找到。
以下命令取自此Azure指南。
- 创建一个资源组
az group create --name shorty-resources --location "West Europe"
- 创建一个Redis实例
az redis create --resource-group shorty-resources --name shorty-redis --location "West Europe" --sku Basic --vm-size c0 --enable-non-ssl-port
- 创建一个服务计划
az appservice plan create --name shorty-service-plan --resource-group shorty-resources --sku B1 --is-linux
- 创建一个Web应用程序
az webapp create --resource-group shorty-resources --plan shorty-service-plan --name shortyshorty --deployment-container-image-name ffissore/shorty:latest
- 告诉Azure Shorty监听8088端口
az webapp config appsettings set --resource-group shorty-resources --name shortyshorty --settings WEBSITES_PORT=8088
- 并且目前我们不需要API密钥
az webapp config appsettings set --resource-group shorty-resources --name shortyshorty --settings SHORTENER_API_KEY_MANDATORY=false
- 现在在Azure门户中找到您的Redis实例,并复制其主访问密钥。它看起来像这样:
RandomString=
,这是Redis密码。相应地设置redis host变量
az webapp config appsettings set --resource-group shorty-resources --name shortyshorty --settings SHORTENER_REDIS_HOST=:RandomString=@shorty-redis.redis.cache.windows.net
Shorty将在https://shortyshorty.azurewebsites.net/提供
请注意,您将因上述所有内容而付费。
当您玩完shorty后,使用以下命令删除所有内容:
az group delete --name shorty-resources
现在向下滚动到 使用 Shorty。
使用shorty
以下说明假定shorty在您的PC上运行。如果不是这样,请将https://127.0.0.1:8088
替换为正确的域名。
尝试此curl
以存储URL
curl -vv https://127.0.0.1:8088/ -H 'Content-Type: application/json' --data '{"url":"https://en.wikipedia.org/wiki/URL_shortening#Techniques"}'
如果您已启用API密钥,请将API密钥添加到有效载荷中,如下所示
curl -vv https://127.0.0.1:8088/ -H 'Content-Type: application/json' --data '{"api_key": "test", "url":"https://en.wikipedia.org/wiki/URL_shortening#Techniques"}'
它将输出类似以下内容
{"id":"CGQ6LM8bfj","url":"https://en.wikipedia.org/wiki/URL_shortening#Techniques"}
现在尝试解析该ID
curl -vv https://127.0.0.1:8088/CGQ6LM8bfj
curl的输出头将包含Location: https://en.wikipedia.org/wiki/URL_shortening#Techniques
。尝试用您的浏览器打开shorty URL。
配置
Shorty可以通过环境变量进行配置
SHORTENER_REDIS_HOST
:redis服务器的地址,默认为127.0.0.1SHORTENER_REDIS_PORT
:redis服务器的端口,默认为6379SHORTENER_API_KEY_MANDATORY
:用户是否必须提供API密钥以创建新的短URL?布尔值,默认为trueSHORTENER_RATE_LIMIT
:单个API密钥在一段时间内可以创建的新短URL数量,默认为10,如果设置为0则不应用限制SHORTENER_RATE_LIMIT_PERIOD
:速率限制的周期,如果激活,默认为600秒(10分钟)SHORTENER_ID_LENGTH
:为每个URL生成的ID的长度,默认为10。字符集是a-zA-Z0-9
= 62个字符。如果您打算仅在内部使用shorty,则可以使用更短的ID,例如4个字符。SHORTENER_ID_GENERATION_MAX_ATTEMPTS
:生成唯一ID的最大尝试次数,默认为10。当ID长度较短且创建了大量的短URL时尤为重要。SHORTENER_HOST
:shorty将监听的地址SHORTENER_PORT
:shorty将监听的端口
Redis上的内容
- API密钥:它们以
API_KEY_
为前缀,存储为API_KEY_my_api_key
,并分配一个布尔值。缺少API密钥或将API密钥分配给false
将返回错误信息“无效的API密钥”。 - 调用率密钥:它们以
RATE_
为前缀,存储为RATE_my_api_key
,并分配注册的调用次数。密钥在调用率限制周期
(见上文段落)结束前有效。 - 短ID,长度配置(见上述示例):它们被分配给原始URL
依赖项
~7MB
~159K SLoC