多少年后当眼前的一切成为结局,时间改变了我,改变了村里的一切。整个老掉的一代人,坐在黄昏里感叹岁月流逝、沧桑巨变。没人知道有些东西是被我改变的。在时间经过这个小村庄的时候,我帮了时间的忙,让该变的一切都有了变迁。我老的时候,我会说:我是在时光中老的。
——刘亮程《一个人的村庄》
简介
- Perfect是一组完整、强大的工具箱、软件框架体系和Web应用服务器,可以在
Linux
和macOS
(OS X)上使用。该软件体系为Swift工程师
量身定制了一整套用于开发轻量、易维护、规模可扩展的Web应用
及其它REST服务
的解决方案,这样Swift工程师就可以实现同时在服务器和客户端上采用同一种语言开发软件项目。 由于建立在一个高性能异步网络引擎基础上,Perfect还能够在
FastCGI
上运行,支持安全套接字加密(SSL
)。该软件体系还包含很多其它互联网服务器所需要的特点,包括WebSockets
和iOS消息推送
,而且很快会有更多强大的功能支持。- Swift开发服务端(二):使用Parallels Desktop虚拟机安装Ubuntu系统及相关配置
正文
- 有很多小伙伴肯定在想,我为什么会把第一次给了
Perfect
🌝,那是因为Perfect
有官方中文文档,虽然不是非常完善的中文文档,但有胜于无,减少了入门的难度。 - 什么,为什么叫再次初体验。那是因为上次的初体验不算。为什么不算、因为我说的🌚🌚。
- 本篇完全基于Mac系统,为什么不基于上一篇安装的
Ubuntu
系统呢,因为相较于Mac,在Ubuntu
下只是多了Swift安装环境配置和其他需要的服务安装,都特别简单,更重要的是我们需要使用到Xcode进行编码、编译。 - Perfect官方文档在这里
Ubuntu安装Swift
- 关于在Ubuntu系统下载安装Swift,参考Swift官方文档,已经介绍的非常详细了。
- 如果你不想看英文官方文档,好吧,那我就再总结(复制)一下:
安装Git
- 首先检查系统有没有安装Git,如果没有安装,直接使用包管理器安装:
1 | sudo apt-get install git |
安装Swift依赖组件
- 确保您的系统上的包管理器是最新的:
1 | sudo apt-get update |
- 安装
Swift
必要的依赖组件,如clang
和Python
等。openssh-server
我们在安装Ubuntu一章中已经安装过,所以不用重复安装了。
1 | sudo apt-get install clang libicu-dev libpython2.7 |
安装Swift
- 下载最新的
Swift二进制
文件,可以手动下载,也可以使用wget
下载。- 根据自己的Ubuntu系统版本和需要的swift版本选择,在这里下载。
.tar.gz
后缀的是工具链二进制文件.sig
后缀的是数字签名文件。
1 | wget https://swift.org/builds/swift-4.0-release/ubuntu1604/swift-4.0-RELEASE/swift-4.0-RELEASE-ubuntu16.04.tar.gz |
- 如果你是
第一次
下载安装Swift包,需要将Swift的PGP密钥导入您的密钥环,密钥将用于验证下载的文件有无被被损坏或篡改。
1 | gpg --keyserver hkp://pool.sks-keyservers.net \ |
- 导入密钥之后,下载对应Swift版本的签名文件:
1 | wget https://swift.org/builds/swift-4.0-release/ubuntu1604/swift-4.0-RELEASE/swift-4.0-RELEASE-ubuntu16.04.tar.gz.sig |
- 验证签名文件:
- 如果出现警告信息,可忽略;如果出现错误信息,就需要重新下载Swift二进制文件。
1 | gpg --verify swift-4.0-RELEASE-ubuntu16.04.tar.gz.sig |
- 安装完成密钥和签名文件,现在就可以安装Swift。 执行以下命令来提取之前下载的二进制文件:
1 | tar xzf swift-4.0-RELEASE-ubuntu16.04.tar.gz |
- 将Swift工具链添加到环境变量中,以便运行swift命令:
1 | export PATH=swift-4.0-RELEASE-ubuntu16.04/usr/bin:"${PATH}" |
- 这个命令只会将swift命令添加到
当前shell会话
路径中,如果要确保它在以后的会话中自动添加,要将其添加到.bashrc
文件中。- 打开
.bashrc
文件 - 文件尾部添加环境变量
- 保存退出
- 打开
1 | vi ~/.bashrc // 也可以使用nano |
- 在终端输入
swift
,如果输出Welcome to Apple Swift version xxx
则表示安装swift成功。
Perfect服务端
使用工具新建Perfect项目
- 想体验一个新技术,最简便的方法莫过于GUI工具,简单的点几下就可以运行起来。
Perfect Assistant
专门用于服务器端Swift应用的启动、管理、编译、测试和部署,极大简化了上述工作的操作过程。无论是初次接触服务器的Swift程序员还是企业级的服务器Swift高级工程师,相信都可以从中受益。- 使用
Perfect
搭建服务端之所以比较强大的原因之一:提供了可视化的工具帮助快速入门体验一个服务端软件的搭建。 - 而且她不仅支持自家的
Perfect
库,还支持另一个Swift服务端开发库Vapor
。 - 更更更加支持新款MBP的
Touch Bar
,,恩,我的还是不支持Touch Bar
的15款的MBP🌚。
Perfect Assistant 功能
- 新建Swift服务器工程,或者从现有项目模板中新建工程
- 管理组件依存关系
- 同步交叉编译——即在您的mac计算机上同步编译同一个服务器应用在macOS和Ubuntu操作系统上的二进制程序
- 配置亚马逊弹性计算或者谷歌云应用
- 将项目部署为亚马逊EC2弹性云计算服务器例程,或者谷歌云应用引擎服务器例程
下载Perfect Assistant
- 官方下载地址在这里
- 点击下载、安装即可。(注意需要科学上网,否则可能很慢)
- 安装完成后打开界面如下:
- 关于
docker
Perfect Assistant
是支持使用docker
进行编译和部署到Linux上的,安装docker
后就可以在本地对代码进行linux环境的编译后直接部署到linux服务器上。更重要的是
:使用docker
可以打包应用以及依赖包到一个可移植的容器
中,然后发布到任何
流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。以后需要其他linux上部署,只需要将制作好的docker镜像
拉取下来就可以运行,不需要再配置环境和依赖。- 安装docker大概需要15G左右的磁盘空间,我因为系统盘磁盘空间有限,就没有安装。之前试了下安装大概需要几分钟时间(前提网速够快)。 需要安装的小伙伴,直接点击如图所示的
立即安装docker
、等待安装完成即可。 - 关于想了解更多docker知识的,官网在这里。
使用Perfect Assistant创建项目
- 安装好
Perfect Assistant
后,快速创建一个服务端应用,只需要点击创建项目窗口的Perfect模板App
:
- 选择项目需要放置的文件目录及项目名称(我这里还是以最早体验服务端项目的名字命名)。
- 红框选项可选可不选,勾选后在Xcode编译项目的时候会,会运行及反馈一些linux环境的编译信息,后面需要的时候可以再重新勾选,现在的电脑配置其实勾选了也并不会增加太长的编译时间。
配置处理项目依赖
- 项目依赖都是通过
Swift的包管理器
处理的,Swift包依赖管理请参考官方文档. - 创建项目完成会默认先拉取模板应用的相关依赖,在默认应用中默认已经配置过HTTPServer依赖了,处理窗口如下:
后期需要添加自己的依赖库时候,如数据库、打印等等,只需要在下面的
可用依赖
窗口中选择需要依赖直接拖拽到上面项目依赖
窗口即可。如果在
可用依赖
窗口没有找到我们需要的,也可以点项目依赖
窗口右边的+
号按钮,添加自定义的项目依赖:其实就是添加依赖的Package Manager
地址及功能类别。更多
Perfect Assistant
工具使用及功能介绍,请参考官方文档。
编译运行项目
- 项目依赖处理完成,就可以找到我们创建的项目目录下的
iNoteServer.xcodeproj
文件,具体名称请参考你创建项目的名称,通过Xcode
打开。 - 注意,在项目Scheme中选择可执行文件,默认选中的的是
项目名称-Package
。
- 然后直接编译运行,就可以看到控制台输出:
1 | [INFO] Starting HTTP server localhost on 0.0.0.0:8181 |
- 此时就已经开了一个本地端口
8181
的服务,直接在浏览器输入上述地址及端口,就可以看到令人兴奋的Hello, world!
了。
使用终端新建Perfect项目
- 使用终端命令创建项目也不是很复杂,重要的是可以自己把控项目创建的细节,创建出来的项目更加的干净,我比较喜欢使用终端创建项目。
使用终端新建项目
- 创建一个存放项目的文件夹
iNote
,后续服务端对应的客户端项目iNoteClient
也可以放在这个文件夹内。 - 在
iNote
文件夹下创建一个存放服务端项目的文件夹iNoteServer
。 - 将
iNoteServer
目录初始化为一个Git仓库
。 - 创建
Package.swift
文件,该文件是用Swift包管理器(SPM)管理依赖需要的,用来管理整个项目的依赖。我们可以使用Xcode打开该文件,编辑添加需要的项目依赖。如:
1 | import PackageDescription |
- 回到终端,创建
Sources
目录,该目录用于存放我们自己写的项目源代码。 - 创建一个程序入口文件,并在空文件中插入一个打印函数:
1 | echo 'print("hello world!")' >> Sources/main.swift |
配置处理项目依赖
- 项目依赖已经配置完成,此时需要处理项目依赖并生成可执行文件:
- 处理过程会在终端输出对应的信息,时间长短取决于在
Package.swift
文件中配置的依赖库多少及每个库大小。 - 生成的可执行文件在项目的根目录的
debug目录
下。
1 | swift build |
- 默认是生成的Debug版本的可执行文件,如果是正式部署服务器的可执行文件,可使用如下指令生成发布版本可执行文件:
- 生成的可执行文件在项目的根目录的
release目录
下。
1 | swift build -c release |
- 一般很快就可以处理完成,处理完成就会在终端输出信息可以看到生成了一个由项目名称命名的可执行文件,根据提示信息执行对应的可执行文件,就可以输出我们的打印信息了:
1 | ./build/debug/iNoteServer // debug模式 |
- 可以使用Swift包管理器创建一个
xxx.xcodeproj
文件用于使用Xcode来管理和编辑调试项目,执行下面的指令,生成Xcode项目管理文件:
1 | swift package generate-xcodeproj |
- 配置项目文件的搜索目录为整个项目目录:
$(SRCROOT)
代表的时项目根目录下$(PROJECT_DIR)
代表的是整个项目
1 | (PROJECT_DIR) |
- 如果添加新的项目依赖库后只需要重新
swift build
或者swift build -c release
等待完成即可。 - 如果添加新的依赖后出现未知错误,可尝试删除项目根目录下的
xxx.xcodeproj
文件,然后使用swift package generate-xcodeproj
重新生成项目文件即可。
搭建HTTP服务器
- 创建iNoteAIP文件,用于管理所有的
路由
。大概分为用户及笔记两类。
1 | enum iNoteAIP: String { |
- 创建一个
NetworkServerManager
文件用于服务器的相关操作,如服务器开启及停止,端口监控、路由监控及处理等等。 - 关于服务器API设计及命名,请参考服务端指南 | 良好的 API 设计指南这一篇文章,写的很不错。
- 首先实例化一个
HTTPServer
对象,绑定指定的端口,并添加项目需要用到的路由。
1 | // 导入需要的头文件 |
- 具体的项目添加的路由(以注册为例子)以及配置系统的日志工具(日志信息记录到本地文件)。
1 | extension NetworkServerManager { |
- 处理路由绑定的回调,即当用户触发的对应接口会在这个地方处理,以
注册
路由绑定的回调为例子:
1 | //MARK: 处理路由回调 |
- 创建一个
UserMediator
文件作为用户逻辑的中间层,用于管理用户的相关的逻辑,如用户是否重名、参数是否合法,响应数据格式处理等等:
1 | enum ResponseStatus: String { |
MySQL数据库
MySQL
数据库的安装,请参考之前的文章,本文开头有跳转连接。
创建数据库和表
- 创建并配置
MySQL
数据库,本文以Navicat Premium
为例子。 - 打开
Navicat Premium
软件,点击左上角的连接,选择MySQL,在弹出的窗口中输入对应的信息:如我的连接名称为iNote
,其他选项如Host
、Port
、User Name
保持默认,密码即为你的安装的MySQL密码。
- 配置完服务器信息,就可以创建一个数据库,例如我创建一个名字为
iNoteDB
的数据库。 - 在
iNoteDB
数据库中简单的新建了两张表,一张是用户表T_Users
, 一张是笔记表T_Note
。表结构如下: - 我的字符集选
utf-8
,排序规则utf8_general_ci
。
- 我们也可以手动在表中插入数据,如我们在用户表中插入一条数据,用户名
西门抽血
,密码1234567
。
数据库管理工具
- 创建
DataBaseManager
文件,用户管理数据库的连接、关闭及数据CRUD操作。 - 数据库的连接配置文件如下:
1 | //MARK: 数据库信息 |
- 创建数据库管理者
1 | class DataBaseManager { |
操作数据库进行常规的CURD
isExist方法
用于查询特定的用户是否存在store方法
用于缓存一条用户记录到本地users方法
用于查询特定的一条用户数据记录
Perfect
对MySQL
的支持还不是很完善,写出来的代码比较丑陋,可以尝试下使用其他的数据或者配套的对象管理函数库(ORM
),总的来说支持的服务器种类
还是比较完善的,总能找到你中意的一款。
1 | //MARK: User |
启动及测试服务器
- 在程序入口
Main.swift
文件配置启动服务器,因为上面我们已经在服务器管理者这个文件中封装好了启动方法,此时就可以一行搞定:
1 | // 启动服务器 |
- 运行项目,等待控制台输出如下信息代表启动服务器成功,然后测试注册服务器接口了,以
post请求的注册接口
为例子:- 我们这里使用
Paw
工具测试网络接口,当然你们也可以使用Post Man
测试,甚至你想的话可以自己写网络接口调用测试。 - 如果是get请求,你可以直接在浏览器就可以测试,如果你想改下本例子的请求方式,只需要在路由配置方法中把
.get
改为.post
即可。
- 我们这里使用
1 | [INFO] Starting HTTP server on 0.0.0.0:8181 |
- 例如我们测试,用户名
西门抽血
,密码1234567
进行注册,因为之前我们在数据库中手动添加了一条相同记录,所以注册结果如下图:接口调用成功,服务器返回注册失败信息。
结尾
- 本文只是对使用Perfect搭建服务器的一个概要性总结,希望大家通过本文可以对Swift开发服务器整个流程有一个认识,具体的细节和注意点都待完善。
- 至于项目Demo,肯定是有的,但是目前是不可能给到大家了,因为我还没有写完啊,目前只是写了一个粗略的注册接口,并且逻辑还没写完😂。
- 其实项目的完善部分就集中在接口响应处理的对服务器CRUD部分了,因为使用Mysql服务器用的很不顺手,可能会换用其他比较完善的数据库再完善这一部分。
- 等服务端写完,在开坑对应的客户端,客户端就不用说了,大家估计都快写吐了😂。至于什么时候能写完,我自己都不知道,毕竟我这么懒🌚🌝!
参考
官方文档
Perfect官方文档在这里
Swift官方文档
Swift包管理器.
服务端指南 | 良好的 API 设计指南
服务端写Swift体验 (Perfect框架)
Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)