• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

使用Swift和Vapor3构建可扩展的URL Shortener服务

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

使用Vapor3和Swift超越“世界,你好”

Con KarampelasUnsplash上的照片

在完成了一些基本的Vapor教程并编写有关使用Vapor创建Mock服务器的文章之后,我努力思考下一步该怎么做。 我最终在Medium上遇到了这篇帖子,这似乎是一个尝试使用Vapor进行构建的优秀项目。

在这篇文章中,我将实际研究通过结合VaporRedis ,Nginx和Postgres并利用Docker简化开发和测试,基于上面的一些设计构建URL缩短服务。

目标

该项目的目标是构建可扩展的快速URL缩短器,以使用Vapor支持自动和自定义URL缩短功能。 创建防枚举**的目的不在该项目的范围之内–假设链接创建者有责任确保共享URL免受未授权用户的攻击。

该设计

我将按组件细分设计,然后研究每个部分如何适应创建新URL和访问现有URL的逻辑流程。

蒸气网络应用

从路由逻辑到缩短算法本身,大多数实际的业务逻辑将在Vapor应用程序内部进行。 我已尝试以某种方式进行计划,以便可以根据需要扩大Vapor应用程序的实例数量,以满足需求。

Postgres数据库

Postgres将充当应用程序的持久存储。 Postgres似乎是一个不错的选择,因为它易于使用,使用Fluent与蒸气集成并且与云无关。

雷迪斯

Redis将担任双重职务。 首先,它将充当原子计数器,以允许应用程序的多个实例并行运行。 其次,它将作为快速缓存来响应频繁的链接请求。

Nginx的

Nginx将作为对任何数量的Vapor实例的边界反向代理和轮询请求。

泊坞窗(docker-compose)

在此示例中,我使用docker-compose将所有内容捆绑在一起,并简化了本地开发和测试。

网络图

编码

入门

本教程假定您已经安装了docker-composeVapor

要做的第一件事是创建一个新目录来存储我们所有的项目文件。

然后初始化一个新的Vapor项目。 此命令应该为您设置一个新的Vapor模板,其中包括示例ToDo应用程序的代码。

由于我喜欢利用XCode的代码完成功能,因此我还将添加一个xcodeproj文件并在XCode中打开我们的项目。

脚手架

首先,我们需要考虑如何在该项目中使用docker。 由于XCode实际上只关心软件包文件,因此我们将使用命令行来创建Dockerfiledocker-compose.yml文件。 由于Docker基础知识不在本教程的讨论范围之内,因此我不会赘述太多,但是我们将用于开发的所有内容都是非常基础的。 我可能会在以后的文章中介绍如何为生产部署配置您的应用程序。

通过运行以下命令来创建新的Dockerfiledocker -compose.yml文件。

将以下内容粘贴到Dockerfile中 此代码将在docker容器中构建并启动我们的Vapor应用程序,并在端口8080上公开API。

接下来,将以下内容添加到docker-compose.yml文件。 还有更多一点会在这里,但在较高的水平它定义我们的每一个图像API的应用蒸汽,DB的Postgres数据库中,为的Redis Redis的,和Nginx的为Nginx的。 它还将为Postgres配置一些基本的身份验证,并为数据库操作和服务API创建单独的网络。

您还需要为nginx定义配置,以使转发按预期工作。 我的conf.d / api.conf文件看起来像这样。

蒸气网络应用

要查看的第一段蒸气代码是我们的Package.swift文件。 如前所述,我们将要确保我们的项目具有与Redis和Postgres交互所需的所有必要依赖项。 将现有的Package.swift文件替换为以下内容。

组态

接下来,我们可以看一下configure.swift文件,以了解我们如何使用Vapor应用程序中docker文件中描述的一些环境变量。 该文件非常简单明了,注释应该消除任何歧义,因此在这里我将不做详细介绍。

至于其余的样板代码,在您的项目中应该有一个app.swift和一个boot.swift文件,此处使用的默认值对于我们而言是很好的。

该模型

接下来,我们将删除模板中包含的Todo.swift文件,并创建一个新的Link.swift文件来描述我们的Link模型。 Link模型不包含任何意外的属性。 它具有一个ID (在Fluent中是一个特殊字段)和一个friendlyUrl(一个表示自定义定义的url),一个shortUrl(一个表示将重定向到originalUrl的缩短的URL),一个createdAt元数据属性( 蒸气可以自动填充 )和一个shortUrl。最后是expiresAt属性,可用于清理旧链接。

我将稍后讨论如何计划使用该数据库上的短网址和ID查询,但是由于我们还将允许用户使用自定义的“友好”网址,因此我们应该为此添加唯一索引好。 在项目的App目录中,创建一个名为Migrations的新目录。 在此目录中,创建一个名为migrations.swift的新文件,并添加以下代码。 您可以在上方的configure.swift的第56行中看到将实际运行此迁移的代码。

路由

接下来,我们将看看routes.swift ,这是Vapor希望定义您的路线的地方。 由于此服务实际上只有两个功能; 1.创建一个重定向(链接)并2.重定向一个请求,我们的route.swift文件将非常简单。 用以下内容替换自动生成的routes.swift文件。

控制器

最后,我们最终到达控制器,即将为我们的API服务的实际业务逻辑。 这里有一些工作流程,所以我将逐一介绍。

  1. 保存新链接

如您在上面的routing.swift中所见,创建新的Link是通过向/links发出POST请求来完成的。 发出请求时,它将做的第一件事是从其原子计数器请求redis寻求新的ID。 然后,我们将使用该数字ID和POST请求中提供的其余有效负载来创建Link的新实例并将其保存到Postgres。 假设保存成功,我们将这个链接添加到我们的redis缓存中并返回对象。

2.重定向

该服务的后半部分将所有GET请求重定向到适当的URL(如果存在)。 我将稍后讨论该服务使用的缩短算法,但是通常该服务将首先检查redis,以查看其是否已缓存重定向。 假设它在redis中找不到匹配项,它将把请求传递给lookup(),后者将尝试根据我们的base62编码的id或基于用户定义的友好url查找该url。 不管使用哪种查找方法,如果找到结果,我们将构建大多数浏览器应遵循的307重定向响应。 如果在redis或Postgres中未找到结果,则返回404错误。

缩短网址

由于我们将主要依赖整数ID进行链接查找,因此我们需要一些将整数缩短为更紧凑格式的方法。 整数可以很好地工作,直到您达到100,000或数百万为止,此时您实际上可能并没有节省太多空间。 这就是Base62编码发挥作用的地方。

毫不奇怪,Base62使用62个字符的映射[a-zA-Z0-9]。 这意味着可以用更紧凑的“ fxSK”表示一个很长的数字,例如10,000,000。

我还通过在重定向处理过程中解析提供的路径(如果路径以“。”开头)时在自动生成的Base62字符串前添加“。”来区分自动生成的URL与自定义url。 我们知道要查询id索引,如果不查询,则知道要使用friendlyUrl进行查询。

运行应用程序

假设您已经设置了docker-compose并且已经按照上述步骤操作,那么在开发模式下运行应用程序(下面的更多产品介绍)应该很简单。 您可以在这里找到我的所有代码。

要启动应用程序,只需从项目的根目录运行docker-compose up 第一次启动可能需要几分钟,因为它需要下载Vapor的所有依赖项并构建应用程序。

为了扩大正在运行的快速节点的数量,您只需要添加--scale api=N ,其中N是您想要的节点数量。 Docker应该处理Nginx,Redis和Swift节点之间的路由。

下一步是什么?

显然,此应用程序存在许多问题,无法将其用作生产就绪服务。 如果要继续执行本示例,则在部署此应用程序之前,需要添加很多内容。

  • 添加单元和组件测试范围
这值得一提,因为我们需要模拟我们的依赖关系。
  • 生产配置已更改
在我们的示例中,所有所有的postgres和redis配置信息都被硬编码到应用程序和docker-compose文件中。 对于生产准备就绪的服务,我们希望对此进行强化,并且可能不使用其他业务流程来管理我们的数据存储。 但是docker-compose对于本地开发非常有用。
  • 增强弹性
该应用程序当前可以正确处理错误,但是如果我们的Postgres存储区无法访问或者原子计数器被重置并且与现有记录发生冲突,该怎么办-显然有待改进。

参考文献

您可以在此处查看该项目的所有代码。

From: https://hackernoon.com/building-a-scalable-url-shortener-service-using-swift-with-vapor3-853032a9a130


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
iOS学习笔记44-Swift(四)枚举和结构体发布时间:2022-07-13
下一篇:
swift对于NSDate日期获取年月日及其他操作发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap