Hexaville

codebeat badge

Hexaville - 使用 AWS Lambda + ApiGateway 等作为后端的无服务器框架。构建由微服务组成的应用,这些微服务响应事件运行,为您自动扩展,并且仅在运行时收费。 这降低了维护应用程序的总成本,使您能够更快地开发更多内容。

这是帮助许多 Swift 和移动应用程序开发者快速进行服务器端开发和低成本运维的最大动力。

支持的云服务

前提条件

部署引擎

插件

推荐的数据库客户端

Hexaville 的示例应用程序

HexavilleTODOExample 包含以下 Hexaville 应用程序的实际示例。

快速开始

安装 Docker for mac

如果您尚未安装,请从这里安装 Docker for mac。

通过脚本安装 Hexaville (强烈推荐)

curl -L https://rawgit.com/noppoMan/Hexaville/master/install.sh | bash

该脚本将 hexaville 仓库克隆到 ~/.hexaville,并将 source 行添加到您的 profile 文件(~/.zshrc 或 ~/.bashrc)。

export PATH="$PATH:$HOME/.hexaville"

source 您的 profile 文件,然后输入 hexaville

source ~/.bashrc
hexaville

从源码安装 Hexaville

git clone https://github.com/noppoMan/Hexaville.git
cd Hexaville
swift build

然后,应将 Hexaville 可执行文件路径链接到 /usr/local/bin 或类似的目录。

创建一个项目

用法: hexaville generate <projectName>

hexaville generate Hello --dest /path/to/your/app

swift-tools-version

您可以使用 --swift-tools-version 选项为新项目指定 swift-tools-version。当前默认工具版本为 5.1

如果工具版本高于 3.1,则 Package.swift 的布局和定义将得到优化。

例如:

# swift.version will be 5.1
hexaville generate Hello

# swift.version will be 5.0
hexaville generate Hello --swift-tools-version 5.0

# swift.version will be swift-4.0-DEVELOPMENT-SNAPSHOT-2017-08-04-a
hexaville generate Hello --swift-tools-version swift-4.0-DEVELOPMENT-SNAPSHOT-2017-08-04-a

使用 Xcode 打开您的项目

swift package generate-xcodeproj
open *.xcodeproj

项目中创建的代码是 https://github.com/noppoMan/HexavilleFramework 的示例代码片段

HexavilleFramework 是一个类似于 Express 的 Hexaville 微框架。

语法如下。

import HexavilleFramework

let app = HexavilleFramework()

app.use(RandomNumberGenerateMiddleware())

let router = Router()

router.use(.GET, "/") { request, context in
    let htmlString = "<html><head><title>Hexaville</title></head><body>Welcome to Hexaville!</body></html>"
    return Response(headers: ["Content-Type": "text/html"], body: htmlString)
}

app.use(router)

try app.run()

部署您的项目

Hexaville 在部署时依赖于 serverless

请参阅安装指南: https://serverless.com/framework/docs/getting-started/

打包 hexaville 应用程序

hexaville package 命令执行以下操作。

cd /path/to/your/app
hexaville package

部署到云端

serverless deploy --stage staging

hexaville generate 创建的默认 serverless.yml 仅包含 staging 和 production 环境。如果您想添加其他环境,请手动编辑 severless.yml。

问题排查

1. Hexavillefile.yml 中的 executableTarget 是什么?

executableTarget 是在 Package.swift 的 products(name: 'executableTarget') 中指定的名称。在以下情况下,它是 my-app 而不是 MyApp

let package = Package(
    name: "MyApp",
    products: [
        .executable(name: "my-app", targets: ["MyApp"])
    ],
    ....
)

访问您的 API 资源

curl https://xxxxxx.execute-api.ap-northeast-1.amazonaws.com/staging/

或从浏览器访问端点。

二进制媒体类型

当前 Hexaville 支持以下二进制媒体类型

如何获取二进制内容?

在路由处理程序中响应二进制内容有两个规则。

router.use(.get, "/some_image") { request, context in
    let imageData = Data(contentsOf: URL(string: "file:///path/to/your/image.jpeg")!)
    return Response(headers: ["Content-Type": "image/jpeg"], body: imageData.base64EncodedData())
}

从 Hexaville 获取二进制内容,需要发送包含 Content-Type: {BinaryMediaType}Accept: {BinaryMediaType} 头的请求

curl --request GET -H "Accept: image/jpeg" -H "Content-Type: image/jpeg" https://yourdomain.com/staging/random_image

# ????JFIF``??;CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 70
# ??C
#
#
#
#
#
# #%$""!&+7/&)4)!"0A149;>>>%.DIC<H7=>;??C
#
#
# ;("(;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;???"??
# ............

如何调试?

您可以使用 HexavilleFramework 的内置 Web 服务器和 serve 命令来调试您的应用程序。

/path/to/your/app/.build/debug/Hello serve
# => Hexaville Builtin Server started at 0.0.0.0:3000

高级设置

环境变量

请参阅: https://serverless.com/framework/docs/providers/aws/guide/variables/

VPC 和安全组

请参阅: https://serverless.com/framework/docs/providers/aws/guide/functions#vpc-configuration

Swift 版本控制和构建配置

您可以在 swift 指令中配置 Swift 版本控制和构建配置

swift:
  version: 5.1 #format should be major.minor.[patch] or valid SWIFT DEVELOPMENT-SNAPSHOT name
  buildOptions:
    configuration: release

使用 SWIFT DEVELOPMENT-SNAPSHOT

您还可以指定 SWIFT DEVELOPMENT-SNAPSHOT 作为内部 Swift 版本使用。
格式与 swiftenv version 相同

例如:

swift:
  version: swift-4.0-DEVELOPMENT-SNAPSHOT-2017-08-04-a

静态资源

您还可以上传静态资源。只需将您的资源放入项目根目录的 assets 目录中。

在应用程序中加载静态资源

您可以使用 AssetLoader 从本地文件系统加载静态资源

import HexavilleFramework

let data = try AssetLoader.shared.load(fileInAssets: "/html/index.html")

针对 Serverless 的弱点

Serverless 函数和 RDB、缓存服务器之间将创建过多连接

几乎所有 Web 开发者都通过应用程序中的连接池访问 RDB、缓存服务器。这是减少连接的最佳实践之一。但是,在 Serverless 上调用的函数就像 Pre-Folk。这意味着无法进行连接池,并且数据库的连接数与并行执行的函数数相同。

在这种情况下,Hexaville 为您提供使用 hexaville-tcp-proxy-server 的连接池机制。

hexaville-tcp-proxy-server 不仅是代理服务器,还是连接池服务器。有关详细信息,请参阅 README

冷启动

GitHub 上有几个第三方库用于对抗冷启动。

主要的库是 serverless-plugin-warmup

如何更新 Hexaville CLI 版本?

$ rm -rf ~/.hexaville
$ curl -L https://rawgit.com/noppoMan/Hexaville/master/install.sh | bash
$ hexaville version

贡献

欢迎并鼓励所有开发者为 Hexaville 做出贡献,请参阅我们的入门文档以参与进来。

要为 Hexaville 贡献功能或想法,请提交 issue 并填写模板。如果请求获得批准,您可以或社区成员之一可以开始着手处理。

如果您发现 bug,请提交包含展示 bug 的失败测试用例的 pull request 或创建 issue。

如果您发现安全漏洞,请尽快联系 yuki@miketokyo.com。我们认真对待这些问题。

相关文章

许可证

Hexaville 在 MIT 许可证下发布。有关详细信息,请参阅 LICENSE。