服务器端Swift与Kitura和Bluemix –编码自我–中

服务器端Swift与Kitura和Bluemix

IBM Bluemix是一个云平台即服务解决方案,它使您能够专注于编写应用程序,而Bluemix处理大多数DevOps-y东西,例如网络,服务器,存储和软件依赖项。 它支持多种编程语言,包括Swift。 它也易于使用-您只需管理Web浏览器即可管理服务。 您甚至可以在IBM Swift Sandbox的浏览器中编写Swift代码。

本教程将带您了解Kitura和Bluemix入门的基础知识。 首先,我们将设置Bluemix,以便在准备就绪时可以以最小的努力上载我们的应用程序并启动服务器。 然后,我们将逐步完成Swift Package Manager和Kitura。 一旦建立了一定的熟悉度,我们将构建一些有用的东西并将其上传到Bluemix。 我们将使用Swift Package Manager中的SwiftCron软件包构建一个小型服务,该服务采用cron表达式并返回该表达式的可读描述。

设置IBM Bluemix

首先,请前往IBM BlueMix并注册免费的30天试用版。 登录时,系统会要求您命名组织的名称,这实际上是可以添加其他人员到您的团队并选择其位置的团队。 只需选择最接近您的位置-这些选项就限于Bluemix当前已设置基础架构的位置。 然后,将要求您设置一个空间,这是Bluemix组织应用程序和服务的方式。

然后,您将导航到仪表盘,该仪表盘是空的。 单击创建应用程序,我们将使事情变得更加生动。

Bluemix是基于Cloud Foundry构建的,Cloud Foundry是一种开源平台即服务(PaaS)。 然后,Bluemix为一些流行的Web框架(例如Python的Flask框架)提供了样板,以帮助您立即开始。 不幸的是,Swift还没有样板产品,因此我们将向下滚动这些诱人的选项,移至Cloud Foundry Apps部分。 为Swift选择运行时

设置您的应用名称。 我选择了SwiftCronServer,并将主机名保留为相同的自动填充值。

只需几分钟,我们已经在启动服务器。 那不是那么容易吗?

返回仪表盘,您应该可以看到您的新应用。

点击它。 然后,向下滚动到“持续交付”部分,然后单击“启用”。

您可以使用命令行界面手动将代码部署到Bluemix,但是将其向上游推送到Github并自动构建它更容易,更可靠。

在“持续交付工具链”页面上,向下滚动到可配置的集成。 链接您的GitHub帐户,然后单击“创建”。

轻松享受SPM和Kitura

现在是时候在本地运行Kitura项目了。 为您的项目创建一个新文件夹。

mkdir SwiftCronServer 
cd SwiftCronServer

我们将要使用的Kitura和Cron库都可以通过Swift Package Manager作为软件包使用,因此,我们将使用带有swift package init —type executable SPM创建一个新项目。

类型规范有四个选项: 可执行文件系统模块

  • empty具有空的Sources和Tests文件夹,以及一个Package.swift,其包名称设置为“ empty”
  • 库中有一个Sources文件夹,其中有一个以创建该文件夹的文件夹命名的快速文件(以下称为软件包名称),其结构以该软件包命名。 它还设置了一些用于测试的样板,以及带有包名称的Package.swift
  • 可执行文件有一个Sources文件夹,其中包含main.swift,一个空的Tests文件夹以及一个带有包名称的Package.swift
  • 系统模块为您创建一个package.swift和一个Clang模块映射

大! 现在,让我们在Package.swift中将Kitura和SwiftCron添加为依赖项。 更改您的Package.swift文件,如下所示:

 import PackageDescription 
 let package = Package( name: "SwiftCronServer", dependencies: [ 
.Package(url: "https://github.com/IBM-Swift/Kitura.git", majorVersion: 1, minor: 2),
.Package(url: "https://github.com/TheCodedSelf/SwiftCron.git", majorVersion: 0)
])

现在,您应该可以运行swift build ,Swift软件包管理器将克隆依赖项数组中列出的软件包以及这些软件包包含的所有依赖项。

注意:

如果您在获取Package.swift中列出的依赖项的正确标记版本时遇到麻烦,请尝试以下操作:1.如果是您的存储库,请确保推送该依赖项的标签: git push —tag 2.如果您确定该标签存在于远程存储库中,但是Swift Package Manager似乎很难将其拾取,请删除克隆的存储库以使SPM再次将其拉出: rm -rf Packages/MyRepository-Version

现在我们可以在终端中输入.build/debug/SwiftCronServer来运行我们的项目:

现在我们已经运行了Hello World SPM可执行文件,剩下三个步骤:1.将其放入Kitura应用程序中2.将SwiftCron集成为一个“有用的” Kitura应用程序3.将应用程序放到Bluemix上

首先将main.swift的内容替换为以下内容:

 import Kitura 
 let router = Router() 
 router.get("/") { 
request, response, next in
response.send("Hello, World!")
next()
}
 Kitura.addHTTPServer(onPort: 8090, with: router) Kitura.run() 

您可以再次构建并运行该项目,然后打开Web浏览器访问http:// localhost:8090 /以查看结果。 swift build .build/debug/SwiftCronServer

建立有用的东西

现在,我们将开始使用SwiftCron。 更新main.swift使其如下所示:

 import Kitura 
import SwiftCron
 let router = Router() 
 router.get("/:cron") { 
request, response, next in
defer { next() }
guard let cronString = request.parameters["cron"],
let cronExpression = SwiftCron.CronExpression(cronString: cronString)
else {
response.send("Invalid cron expression.")
return
}
  response.send(cronExpression.longDescription) 
}
 Kitura.addHTTPServer(onPort: 8090, with: router) 
 Kitura.run() 

让我们谈谈我们在做什么:

let router = Router()创建一个可以用不同路径配置的路由器对象。

router.get("/:cron”)

使用名为“ cron”的参数查找对根URL的GET请求

 defer { next() } 

next是一个闭包,告诉Kitura如果有的话,开始在路径中执行下一个处理程序。 延迟块将始终在函数末尾执行,而不管遵循的代码路径如何,这使其成为放置清除代码的好地方。

 guard let cronString = request.parameters["cron"], 
let cronExpression = SwiftCron.CronExpression(cronString: cronString) else {
response.status(.badRequest).send("Invalid cron expression.")
return
}

获取传递给get请求的参数,并使用它创建一个cron表达式。 如果该参数不存在或无效,并且无法创建cron表达式,请使用400响应(错误请求)和问题描述通知用户。 然后返回,触发上面的延迟块。

response.status(.OK).send(cronExpression.longDescription)

如果一切正常,请发送200响应(OK),其中包含对传入的cron字符串的易于理解的描述。

大! 生成并运行项目。 在浏览器中,尝试通过指定cron表达式来调用Kitura服务器,例如0 12 * * * *

http:// localhost:8090/0%2012%20 %20 %20 %20

再试一次: 42 7 11 5 3 *

http:// localhost:8090/42%207%2011%205%203%20 *

现在一切都按预期工作了,是时候将其移出localhost了。

放在云端

克隆在集成Bluemix和Github时创建的Github存储库。 如果您在Sources目录中查看,您会发现事情有点复杂。 入门应用程序遵循我们将使用的最佳实践。 看一下main.swift,您会发现没有路由配置。 main.swift处理日志记录并启动服务器,这就是它应该做的所有事情。 所有艰苦的工作都在Controller类中完成,该类为main.swift公开了一个端口和一个路由器对象,以启动Kitura服务器。

将SwiftCron软件包添加到Package.swift: .Package(url: "https://github.com/TheCodedSelf/SwiftCron.git", majorVersion: 0 。现在,我们可以复制本地的功能我们运行的项目,在Controller.swift中, import SwiftCron将以下内容添加到init()

 router.get("/:cron", handler: getCron) 

现在,在Controller.swift中,使用与本地项目中相同的逻辑创建getCron函数。 您将看到getHellogetJSON函数作为我们正在尝试执行的示例。

  1. 声明一个getCron函数:
 public func getCron(request: RouterRequest, response: RouterResponse, next: @escaping () -> Void) throws { } 
  1. 在函数顶部添加一条日志消息:
 Log.debug("GET - /:cron route handler…") 
 response.headers["Content-Type"] = "text/plain; charset=utf-8” 
  1. 实现与本地SwiftCronServer项目中相同的功能,以便最终获得以下请求处理程序:
 public func getCron(request: RouterRequest, response: RouterResponse, next: @escaping () -> Void) throws { 
defer { next() }

Log.debug("GET - /:cron route handler...")
response.headers["Content-Type"] = "text/plain; charset=utf-8"

guard let cronString = request.parameters["cron"],
let cronExpression = SwiftCron.CronExpression(cronString: cronString) else {
response.status(.badRequest).send("Invalid cron expression.")
return
}
  response.status(.OK).send(cronExpression.longDescription) 
}

大。 您的Controller.swift应该在Github上查看以下示例:https://github.com/TheCodedSelf/SwiftCronServer-1482253378221/blob/0ef375dce8b18197faec29ebc9445b34cf354d90/Sources/Kitura-Starter/Controller.swift

提交并推送代码。 您的持续交付工具链应自动构建应用程序。 如果有任何问题,请点击右侧“操作”下的“重新启动”按钮。

注意:如果遇到任何问题(例如服务器崩溃),则可能需要尾随日志。 我发现执行此操作的最简单方法是从命令行。 请遵循“入门”说明以通过命令行界面进行部署:

遵循的最重要步骤是页面上登录到Bluemix的步骤。 获得了CLI工具并通过命令行登录后,请执行cf logs MyAppName以接收Bluemix和应用程序发出的所有日志。

现在,访问您的应用程序的路由。 我的是https://swiftcronserver.mybluemix.net/。 在该URL上附加一个cron字符串以查看您的工作情况(例如, 30 * * * * *为https://swiftcronserver.mybluemix.net/30%20%20%20%20%20 *)。

恭喜—功能正常且半有用的Swift Server Side应用程序。

我们已经学习了以下内容:—如何使用Swift软件包管理器— Kitura的基础知识—使用Bluemix轻松部署Swift Server Side应用程序

希望这些知识会激发您使用新的,令人兴奋的工具集来执行您的下一个好主意。 玩得开心!