Tag: 服务器端Swift

服务器端Swift简介(工具和框架)

这篇文章旨在提供Server Side Swift开发的介绍,并介绍工具和框架。 工具类 Swift软件包管理器(SPM) Swift Package Manager是在Mac和Linux上运行的必不可少的构建和依赖性管理工具。 苹果/快速包装经理 swift-package-manager – Swift编程语言的软件包管理器 github.com 最有用的SPM命令包括: swift build以构建快速软件包 swift build -c release构建用于发布的快速代码 swift package update以更新依赖项 swift package generate-xcodeproj用于从Swift代码创建或更新Xcode项目 swift package resolve以获取所有依赖项 将来,我将发布更完整的SPM指南。 Xcode Apple提供的IDE可以编写,编译和调试Swift代码。 尽管还有其他选择可以开发Server Side Swift ,但是Xcode是最传统的选择。 Xcode –苹果开发人员 Xcode包含了为iPhone,iPad,Mac,Apple Watch和Apple TV创建出色应用程序所需的一切。 developer.apple.com 其他选项包括 文本编辑器,例如vim,Sublime Text,Atom和VS Code + SPM Jetbrains的AppCode AppCode:JetBrains的Smart Swift和Obj-C IDE 适用于iOS / macOS开发的智能IDE,专注于代码质量,高效的代码导航,智能的代码完成… […]

将服务器端Swift部署到Linode

开发完应用程序后,下一步就是将其提供给您的受众群体使用……因此,自然的愿望是将其部署到服务器上。 在本文中,我将演示如何将服务器端Swift应用程序部署到Linode容器。 如果要遵循,必须满足三个先决条件:Perfect Assistant应用程序,Mac上可运行的Docker应用程序以及Linode帐户。 服务器设置 第一步将是设置一个新的Linode容器。 在您的Linode Manager控制台中,单击“添加Linode”链接。 选择所需的大小和数据中心位置。 您将返回到Linodes列表,其中列出了新的Linodes。 单击它,然后按“部署映像” 。 在这里,我们可以创建一个新的Ubuntu 16 Linode,但是我们将使用“ StackScript”为我们完成所有繁重的设置,因此请单击“使用StackScripts进行部署”链接。 在“社区StackScripts:关键字”搜索中,输入“ Swift” 。 这将带来一些,但是您想要的是“ jono / Server-Side-Swift”脚本。 在下一个屏幕上,确保选择了Ubuntu 16.04,然后输入磁盘大小,交换磁盘大小和root密码,然后按“ Deploy” 。 等待“主机作业队列”作业全部完成,然后按“启动” 。 您可以通过选择“ Remote Access”并启动“ Lish via Browser”选项来观看引导和StackScript的进度。 StackScript将所有软件包执行一次完整的更新,以更新到最新的可用软件包,并安装Swift需要Perfect编译的许多常见库所需要的依赖项。 然后,它将安装Swift 3.0.2,并为您建立一些链接。 当最终出现登录提示时,您的Linode就绪了。 记下您新的Linode的IP地址,我们很快将需要它。 编译代码 现在切换到Perfect Assistant,让我们从GitHub获取“ Perfect App Template”。 在“欢迎”屏幕上,单击“创建新项目”,“自定义存储库URL”。 单击位置旁边的“浏览”,然后为模板找到URL,然后粘贴模板的URL:“ https://github.com/PerfectlySoft/PerfectAppTemplate.git” 保留“将Linux构建与Xcode项目集成”的复选框,因为我们在此阶段的目标是Linux部署。 单击“保存”后,系统将启动它是macOS端项目的初始克隆。 进行Linux构建非常简单,只需单击“ BUILD:Linux”按钮。 幕后操作是准备好Docker容器,将项目的依赖项克隆到沙盒位置,并进行沙盒化的Linux构建。 完成后,您应该看到最后三行是这样的: […]

服务器端Swift基础-压缩目录

只需花几分钟的时间,就可以避免通过HTTP发送文件的麻烦,让我们看一下如何获取目录,并使用Swift在服务器上将其压缩。 我将向您展示如何以隔离的方式执行此操作,但是如果您有现有的Swift服务器应用程序,则可以轻松地将其添加到现有的代码库中。 因此,让我们从一个基本的swift应用开始,其中没有任何内容。 mkdir ziptest cd ziptest 快速包初始化 首先,在该新目录中,创建一个要压缩的新目录,并在其中放置一个随机文本文件: 接下来,让我们将库添加到Package.swift文件中。 添加到依赖项数组: .Package(网址:“ https://github.com/PerfectlySoft/Perfect-Zip.git”,majorVersion:2) 确定,因此将ziptests.swift重命名为main.swift(以便将其识别为可执行文件),然后打开并删除占位符内容。 我们在这里只需要几件事: 导入PerfectZip // zip对象 让zippy = Zip() //将文件压缩到源目录中, //放入目标文件,覆盖所有现有文件。 let zipResult = zippy.zipFiles(路径:[“ ../randomzip”],zipFilePath:“ ./randomzip.zip”,覆盖:true,密码:“”) // ZipResult包含带有操作结果的枚举。 打印(zipResult == .ZipSuccess,zipResult.description) 现在让我们执行我们的小应用程序: “ swift build” ,然后“ .build / debug / ziptests” 现在,解压缩几乎完全相同: //实例化zip对象 让unZippy = Zip() //将文件解压缩到目标目录,启用覆盖 让UnZipResult = unZippy.unzipFile(源:“ ./randomzip.zip”,目标:“ ./randomzip2”,覆盖:true) […]

将服务器端Swift部署到Digital Ocean

我的“部署服务器端Swift”系列文章中的第三篇,现在我将演示如何将服务器端Swift应用程序部署到Digital Ocean Droplet。 如果要遵循,必须满足三个先决条件:Perfect Assistant应用程序,Mac上可运行的Docker应用程序以及Digital Ocean帐户。 服务器设置 第一步将是设置一个新的Digital Ocean Droplet。 在Digital Ocean控制台中,单击“创建液滴”按钮。 选择Ubuntu 16.0.2.x64发行版,所需的大小,数据中心位置以及所需的其他任何特定选项。 您将返回到Droplet列表,其中列出了新的Droplet。 创建完成后,您将看到IP地址。 复制此文件,然后在终端中输入 ssh root @ 您的root密码将到达您的电子邮件中,并使用它登录。将立即要求您更改密码-这是一项安全功能,意味着只有现在您知道该密码。 现在我们要安装Swift并安装所有正确的依赖项。 转到https://github.com/PerfectlySoft/Perfect-Ubuntu并复制“ install.sh”的内容 接下来,创建安装文件并对其进行编辑: 触摸install.sh 纳米-w install.sh 将内容粘贴到剪贴板,然后按ctrl-x并保存。 然后我们要使其可执行并运行: chmod + x install.sh ./install.sh-确定 完成此操作后,您的系统将可以使用Swift和Perfect! 编译代码 如果您遵循了《服务器端Swift部署》系列中的上一期文章,则可能会注意到接下来的部分几乎是相同的。 那是因为他们是…… 现在切换到Perfect Assistant,让我们从GitHub获取“ Perfect App Template”。 在“欢迎”屏幕上,单击“创建新项目”,“自定义存储库URL”。 单击位置旁边的“浏览”,然后为模板找到URL,然后粘贴模板的URL:“ https://github.com/PerfectlySoft/PerfectAppTemplate.git” 保留“将Linux构建与Xcode项目集成”的复选框,因为我们在此阶段的目标是Linux部署。 单击“保存”后,系统将启动它是macOS端项目的初始克隆。 进行Linux构建非常简单,只需单击“ BUILD:Linux”按钮。 幕后操作是准备好Docker容器,将项目的依赖项克隆到沙盒位置,并进行沙盒化的Linux构建。 完成后,您应该看到最后三行是这样的: 编译Swift模块’Perfect_App_Template’(10个来源) 链接./.build_lin/release/Perfect-App-Template […]

Cloud Foundry上的蒸气3

您对如何编写服务器端swift代码感兴趣,并且在第一个hello世界之后,您在脑海中听到了声音,例如“在哪里可以运行此代码”? 因此,一种解决方案是在swift运行时内的Cloud Foundry上运行它。 我知道服务器端快速是当前鲜为要求的话题,但是当我开始使用Vapor 3时,我意识到花了一些时间和一些研究才能在Cloud Foundry上运行它。 我的希望是,如果有人在那里尝试相同的内容,将会找到此博客文章,并且有助于使这些内容正常运行。 现在,让我们开始吧,让我解释一下如何将Vapor 3应用程序带到Cloud Foundry。 首先,您需要访问应在其上运行应用程序的Cloud Foundry环境。 接下来,您需要一个快速的应用程序,就我而言,它是一个简单的CRUD服务,可以处理待办事项。 作为标题 假设,此应用使用了蒸气3 Web框架。 我选择此Web框架,因为我将使用最新的Swift网络堆栈,更好地称为Swift NIO(2018年3月发布)。 Cloud Foundry(CF)的概念之一是对“ 12要素应用程序”模式的大力支持。 CF希望您遵循此模式,并按照“ 12因子应用”网页上主题3所述从环境变量读取所有配置。 在我的情况下,我必须提供一个数据库配置(PostgreSQL),并且对于cf运行时,我必须读取套接字配置,这两者都将通过环境变量提供。 服务器套接字的环境变量名称基于cf运行时。 为此,运行时使用标准变量VCAP_APP_HOST和PORT提供套接字配置。 为了简化本地开发设置,我采用了相同的方法并重用了它。 对于数据库,我使用自己的一组环境变量,并在所有变量前面都加上了PSQL *。 对于我的本地开发,我将所有内容都配置为本地资源,将套接字配置为127.0.0.1:8080,并将数据库配置为本地PostgreSQL数据库。 在CF运行时中,总是为我提供套接字配置,但是数据库变量必须由我自己提供,因此我必须将带有cf set-env的PostgreSQL变量添加到我的CF应用运行时中。 这样,我可以从cf环境中读取托管云PostgreSQL数据库实例的配置,就像在本地计算机上一样。 bash $ cf set-env snatch-todos PSQLHOSTNAME psql.clouddb.hostname.com bash $ cf set-env snatch-todos PSQLPORT 5432 bash $ cf set-env snatch-todos PSQLUSERNAME“ xxxxx” bash […]

Swift的无服务器计算

为什么选择无服务器Swift? 与无服务器计算是否值得追求的问题不同,为什么要在Swift中实现无服务器系统? 有三个主要原因使Swift成为Lambda实现语言的理想选择。 首先,Swift是一种功能强大,健壮且富有表现力的语言,旨在在包括服务器端计算在内的各种环境中发挥作用。 就其本身而言,区别不大,因为可以用这种方式描述其他几种语言(Rust,Go)。 但是,Swift提供了两种附加的可能性-利用现有开发人员资源的机会,以及在系统的多个层(尤其是后端和移动客户端)之间共享代码的机会。 让我们考虑一个示例场景。 一个例子 我决定组建一家初创公司-这是我可以做的酵母菌,一家专门提供美味面包的在线面包店。 由于没有健壮的云基础架构,没有任何自重的面包店会被杀死,因此我的首要任务是构建微服务来处理向客户发送收据的工作。 具体来说,我想要一种服务,其输入是要订购的项目列表。 物品是面包的种类和数量。 例如三个羊角面包。 输入以JSON编码。 输出是收据的字符串表示形式。 它列出了每个订购的项目,其小计以及整个订单的总计。 现在,我不必担心收据太漂亮。 首先,我忽略了网络连接并编写了可用作命令行工具的代码。 首先,我将创建一个新目录,并使用Swift Package Manager(SPM)创建一个Swift应用程序。 请注意,该应用程序将命名为bru 。 姆迪尔布鲁 光盘布鲁 快速包初始化—type = executable 现在,我指定数据类型。 考虑到可重用性,我在与主应用程序不同的模块中定义它们。 我创建一个目录Sources / bruModels,并在该目录中使用以下代码创建Item.swift , Order.swift和Receipt.swift文件(完整列表可在https://gist.github.com/profburke/2e951f48542a9a1ff470515725727751c中找到): // Item.swift 枚举样式:字符串,可编码{ 羊角面包 凯恩 裸露镍 黑麦 } 结构项目:可编码{ 出租数量:整数 let style:样式 } // Order.swift struct顺序:可编码{ 公共私有(设置)各种商品:[商品] … } // […]

在JSON API中处理传入数据

我被问到的常见问题之一是如何处理来自移动或Web应用程序的不同格式的请求。 可以为JSON API提交数据的三种主要方式: 通过URL传递的数据(即http://www.example.com/api/v1/stuff?var1=myName) 作为POST请求中的表单参数 作为JSON提交的POST,PATCH或PUT请求的主体。 因此,我将从“完美应用程序模板”的一个简单实例开始: $ git clone https://github.com/PerfectlySoft/PerfectAppTemplate.git jsontest $ cd jsontest $ swift包generate-xcodeproj 这将创建一个Xcode项目…打开它,然后打开“ Sources-> Perfect-App-Template-> configuration-> Routes.swift” 在第29行,有一条GET请求的路由,URI为“ /” 如果我们现在按原样运行此项目,则它将构建应用程序并运行它。 要运行:从“方案”下拉列表中选择可执行目标,然后运行(CMD-R)。 然后,在浏览器中访问http:// localhost:8181-您将看到“ Hello,World!” JSON路由和Postman测试 尽管我们可以使用浏览器轻松测试GET路由,但对于其他请求类型(如POST)却并非如此简单。 这是诸如Postman之类的工具介入的地方-这使我们能够通过各种选项模拟不同类型的请求。 JSON GET路线 我们需要添加的两件事是路由,以及该路由的处理程序。 路线: route.append([[“ method”:“ get”,“ uri”:“ / api / v1 / test”,“ handler”:Handlers.JSONtestGET]) 这指向新的路由Handlers.JSONtestGET ,我们需要创建它: 静态函数JSONtestGET(data:[String:Any])抛出-> RequestHandler { 返回{ 请求,回应 做{ […]

流利的蒸气关系-服务器端Swift

了解如何在模型,父母,孩子和兄弟姐妹之间建立关系。 我们将创建一个小型Web应用程序,了解如何实现Model作为Parent , Children和Siblings之间的关系 。 本文假定您已经对 Vapor 有所了解, 并希望 使用 Fluent 在您的模型之间 建立一些 关系 。 否则,您可以参考 Vapor的Documentation 来设置您的第一个项目 。 列出主人约翰的所有宠物 在第一个教程中,我们将构建一个简单的Web API,以在线添加宠物及其主人信息。 让我们将数据保存到数据库中 ,该数据库可通过路线访问。 我们将通过JSON将数据提供给客户端。 建立关系 关系允许数据库实体之间基于外键的连接。 我们要做的是创建Pet并将其设置为“ Children”作为所有者 。 这样,我们将能够从一个所有者那里获取所有Pet 。 外键 为使魔术发生,我们需要在Pet上添加一个外键 ,该键将是一个Node类型,该类型将存储Parent的ID,即Node。 var owner_id: Node? 并在数据库中建立关系,请将以下行添加到prepare方法中: pets.parent(Owner.self, optional: false) 如果您想迁移数据库,请单击“如何使用Vapor的Fluent迁移数据库”的链接。 最后,您的Pet.swift文件应如下所示: 此外,要建立关系,您需要将所有者的ID设置为宠物的owner_id 。 注意:请记住,实体 所有者 将获得一个 id 在 save() 。 我们知道我们其中一位主人的id为1 ,我们可以设置一条路线来放置Pet […]

服务器端Swift:制作机盖(1/6)

最近,我构建并发布了Canopy,该服务可通过Mac和iOS应用程序为您的GitHub存储库上的活动提供即时推送通知。 我多年没有在服务器端工作过,设置服务器和编写服务器端代码真的很有趣。 中断与事件驱动的类似应用程序的编程并做一些不同的事情是令人耳目一新的,但是我仍然必须用自己喜欢的语言编写它:JavaScript……只是在开玩笑,Swift。 客户端和服务器端都是Swift。 关于服务器端Swift的信息量很低,这不足为奇,但是我在这里告诉您,如果您已经了解Swift并且也了解macOS命令行的话,这并不是一件容易的事。 斯威夫特很棒 Swift并不是所有语言中最好的语言,但它是最佳的折衷方案,这使它成为目前所有事物(它支持)的最佳语言。 自宣布以来,Swift-Core清晰而谨慎的设计决定给我留下了深刻的印象,可以全心投入。 我已经用许多种语言进行编程,并且经常发现该语言及其标准库的质量不一致,Team-Swift对他们的语言及其标准库一无所知。 本周,我将重点介绍Swift为什么适用于服务器的一些细节。 显然,协议驱动的开发,功能编程,可选的选项,错误处理模型等使Swift总体上很棒,但是我不会特别指出。 当然,这些事情使写Canopy成为一种快乐。 没有JSON 应用程序和服务器使用JSON进行通信,但是我不知道或不在乎,因为它的两端都是Codable 。 创建我的结构,传输,接收我的类型安全的结构。 感觉很棒。 我几乎不需要做任何工作就可以进行固有的类型安全跨进程,这使我和服务器之间的1,000英里看上去与在视图控制器之间传递数据没有什么不同。 但是,缺乏动态性意味着即使向这些结构添加单个参数也意味着对端点进行版本控制或将新参数设置为Optional 。 并非全是玫瑰花,但坦率地说,版本管理工作得很好,这意味着我解释输入数据的代码不是if语句的逻辑炸弹,它是经过仔细地,单独封装和测试的,类型安全的端点。 正常运行时间 由于使用太多文件描述符,服务器代码在生产中一次“崩溃”,因为我不得不使用(C库)libcurl编写我的APNs(Apple Push Notification service)代码(我编写了Swift,而不是C,这是另一个很棒的功能Swift能够轻松地与C库接口),但我做错了,因为UnmanagedPointer很难。 因此内核终止了它。 一次崩溃:Swift很棒。 您必须积极地致力于编写不稳定的Swift代码。 当然,Swift可为您提供健壮的代码和高性能。 很棒的开发者经验 Xcode非常棒(它很烂,但是考虑到同等的开发人员工具时,这是相当令人惊讶的),Swift软件包管理器意味着跨平台开发所需的工具随Swift发行版一起提供,没有成千上万个组件的史诗级工具链出问题并要安装,这是Mac上来自App Store的一个二进制文件,服务器上是swift.org的一个二进制文件。 您可以在Mac上开发和测试服务器代码,同时运行客户端应用程序并使它们一起通信(仅使用Xcode)。 目前,这样做比我们想要的要笨拙,您必须让SwiftPM从描述服务器端应用程序的Package.swift中生成一个Xcodeproj( swift package generate-xcodeproj ),然后将其嵌入到.xcodeproj (拖放)到您的客户端应用程序。 Xcode知道此后该怎么办。 这样做还可以更轻松地在各种服务器和客户端应用程序之间共享代码。 由于SwiftPM并不真正支持iOS,但您仍然需要Carthage作为iOS应用程序的依赖项,但是,如果您制作的是macOS应用程序,则可以使用SwiftPM获取的依赖项(如果您正在使用类似的依赖项)。 当然,这是不理想的,但是到2020年会变得更好(所以我们被告知-更好的Xcode集成即将到来)。 您必须在此时使用Xcode(我想您可能可以使用AppCode),因为愉快地使用Swift 绝对需要自动完成。 苹果公司承认这是阻碍其广泛采用的障碍,并且最近已承诺提供语言服务器协议服务,以便其他编辑者和其他平台可以为其开发人员提供一流的Swift体验。 在服务器端运行代码就像rsync和swift run foo一样简单。 显然,您应该有一个比这更好的部署过程,但是我试图证明它是多么简单。 守则第一次生效 我喜欢Swift的许多原因之一是在编写它之后感觉到,如果对其进行编译,它将可以正常工作。 显然,情况并非总是如此,但大多数情况是这样,对于Canopy,大多数情况下都是如此。 语言是严格的,可以使您严格地编写它,但是以某种方式仍然绝对是编写代码的乐趣。 […]

重新思考适用于Swift的服务器架构

本文是我在东京-服务器端Swift聚会#5上演讲的幻灯片的英文摘要。 Swift中的并行性 DispatchQueue使我们能够轻松地在系统(或libdispatch)托管线程上进行多线程编程。 它具有两种执行属性。 serial :在单独的线程上按顺序执行任务 并发:在单独的线程上并行执行任务 哪种服务器架构适合Swift? 基于上述内容,让我们考虑一种适用于Swift的服务器架构。 当然应该注意C10K问题。 (这一次,我坚持使用Swift的标准API创建服务器。由于它应该适合Swift,因此对Swift程序员很友好,而且很生态。) 我的答案之一是… 基于DispatchSource的EventDriven模型+基于DispatchQueue的工作线程模型体系结构 通过这种体系结构,您可以不加意识地使用GCD提供的大量功能。 当然,没有自己的线程管理,没有回调地狱(通常)并且有效地使用了系统资源。 你喜欢它? GCD的问题 最后,我找到了Swifty服务器架构的答案之一。 但是..在GCD中……尤其是DispatchQueue有时会出现问题。 DispatchQueue问题 比赛条件 回调地狱 比赛条件 如果我们在并发模式下执行DispatchQueue.async并从多个队列访问变量,则可能发生竞争情况。 因此,我们必须对Mutex或Semaphore的每个操作都使用排他控制来避免这种情况。 但是,即使现在,独占控制仍然非常困难。 回调地狱 在事件驱动器范例中,回调地狱是一个严重的问题。 在Swift中,我们通常不必担心它,因为几乎所有操作都在阻塞。 但是,如果要异步访问文件系统或网络,还需要再次调用DispatchQueue.async。 我看到一个有10次嵌套回调的iOS应用… 避免回调地狱的现代方法 未来/承诺 异步/等待 但是Swift没有这些设备……所以我们应该放弃……? 不! 我们应该知道一种可以使用同步语法控制异步操作​​的语言……这是一种GO编程语言🐭 Go提供了称为Goroutines的原始并发/并行API。 它的行为就像在多个线程上多路复用的协程。 而Go可以避免Channel带来的比赛条件。 就像goroutine和goroutine之间的共享内存一样。 DispatchQueue也是基于线程的api,因此,如果我们将Goroutines和Channels之类的接口引入Swift,则使异步流控制变得容易,可读和安全。 简介 我实现了具有HTTP(S),TCP Server / Client和Go并发系统(称为Prorsum)的网络环境。 它的HTTP Server体系结构是EventDriven模型+工作线程模型,向您展示了上面的内容。 GitHub :https://github.com/noppoMan/Prorsum 像设备一样 使用Prorsum,我们可以像异步流控制一样轻松编写Go。 标杆管理 最后,我必须证明我所介绍的体系结构是否有效。 […]