聚合部署
Midway 针对 HTTP 场景,提供了一种聚合部署的方式,在开发时和传统 Web 应用类似,在部署时将多个路由部署在同一个函数容器中,可以节省冷启动时间,节省费用。
聚合部署模式特别适合用于传统中后台服务。
创建代码
创建聚合部署的代码示例。
$ npm -v
# 如果是 npm v6
$ npm init midway --type=faas-aggr my_midway_app
# 如果是 npm v7
$ npm init midway -- --type=faas-aggr my_midway_app
也可以执行 npm init midway
,选择 faas-aggr
脚手架。
信息
该脚手架针对 HTTP 的场景做了特殊处理,会将所有的 HTTP 接口部署为同一个函数(聚合部署)。
目录结构
以下就是一个函数的最精简的结构,核心会包括一个 f.yml
标准化函数文件,以及 TypeScript 的项目结构。
.
├── f.yml # 标准化 spec 文件
├── package.json # 项目依赖
├── src
│ └── index.ts # 函数入口
└── tsconfig.json
我们来简单了解一下文件内容。
f.yml
函数定义文件tsconfig.json
tsc 配置文件(没有 IDE 会报错)src
函数源码目录src/index.ts
示例函数文件
函数文件
我们首先来看看函数文件,传统的函数是一个 function
,为了更符合 midway 体系,以及使用我们的依赖注入,这里将它变成了 Class。
和传统应用相同,我们依旧使用 @Controller
装饰器来开发聚合的 HTTP 函数。
如下代码,我们暴露了三个路由,在聚合部署模式下,会只部署成一个 HTTP 函数:
import { Inject, Provide, Controller, Get, Post } from '@midwayjs/decorator';
import { Context } from '@midwayjs/faas';
@Provide()
@Controller('/')
export class APIService {
@Inject()
ctx: Context;
@Get('/')
async hello() {
return 'Hello Midwayjs';
}
@Get('/get')
async get() {
return this.ctx.query;
}
@Post('/post')
async post() {
return this.ctx.method;
}
}
函数定义文件
f.yml
是函数的定义文件,通过这个文件,在构建时生成不同平台所能认识的文件,示例中的文件内容如下。
service:
name: midway-faas-examples ## 函数组名,可以理解为应用名
provider:
name: aliyun ## 发布的平台,这里是阿里云
aggregation: ## 对 HTTP 函数使用聚合模式部署
all: ## 部署的函数名
functionsPattern: ## 匹配的函数规则
- '*'