在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
使用Vapor3和Swift超越“世界,你好”在完成了一些基本的Vapor教程并编写有关使用Vapor创建Mock服务器的文章之后,我努力思考下一步该怎么做。 我最终在Medium上遇到了这篇帖子,这似乎是一个尝试使用Vapor进行构建的优秀项目。 在这篇文章中,我将实际研究通过结合Vapor , Redis ,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-compose和Vapor 。 要做的第一件事是创建一个新目录来存储我们所有的项目文件。 然后初始化一个新的Vapor项目。 此命令应该为您设置一个新的Vapor模板,其中包括示例ToDo应用程序的代码。 由于我喜欢利用XCode的代码完成功能,因此我还将添加一个xcodeproj文件并在XCode中打开我们的项目。 脚手架首先,我们需要考虑如何在该项目中使用docker。 由于XCode实际上只关心软件包文件,因此我们将使用命令行来创建Dockerfile和docker-compose.yml文件。 由于Docker基础知识不在本教程的讨论范围之内,因此我不会赘述太多,但是我们将用于开发的所有内容都是非常基础的。 我可能会在以后的文章中介绍如何为生产部署配置您的应用程序。 通过运行以下命令来创建新的Dockerfile和docker -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服务的实际业务逻辑。 这里有一些工作流程,所以我将逐一介绍。
如您在上面的routing.swift中所见,创建新的Link是通过向 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并且已经按照上述步骤操作,那么在开发模式下运行应用程序(下面的更多产品介绍)应该很简单。 您可以在这里找到我的所有代码。 要启动应用程序,只需从项目的根目录运行 为了扩大正在运行的快速节点的数量,您只需要添加 下一步是什么?显然,此应用程序存在许多问题,无法将其用作生产就绪服务。 如果要继续执行本示例,则在部署此应用程序之前,需要添加很多内容。
这值得一提,因为我们需要模拟我们的依赖关系。
在我们的示例中,所有所有的postgres和redis配置信息都被硬编码到应用程序和docker-compose文件中。 对于生产准备就绪的服务,我们希望对此进行强化,并且可能不使用其他业务流程来管理我们的数据存储。 但是docker-compose对于本地开发非常有用。
该应用程序当前可以正确处理错误,但是如果我们的Postgres存储区无法访问或者原子计数器被重置并且与现有记录发生冲突,该怎么办-显然有待改进。 参考文献您可以在此处查看该项目的所有代码。 |
请发表评论