midway serverless 已经合并到 midway 主库,后续都请查看 midway 主文档
Midway Serverless 是用于构建 Node.js 云函数的 Serverless 框架。帮助您在云原生时代大幅降低维护成本,更专注于产品研发。
- 跨云厂商:一份代码可在多个云平台间快速部署,不用担心你的产品会被云厂商所绑定。
- 云端一体化:提供了多套和社区前端 React、Vue 等融合一体化开发的方案。
- 代码复用:通过框架的依赖注入能力,让每一部分逻辑单元都天然可复用,可以快速方便地组合以生成复杂的应用。
- 传统迁移:通过框架的运行时扩展能力,让 Egg.js 、Koa、Express.js 等传统应用无缝迁移至各云厂商的云函数。
Midway Serverless 是阿里巴巴集团发起的开源项目,由一个专业的 Node.js 架构团队进行维护。已大规模应用于阿里集团各 BU 线上业务,稳定承载了数千万的流量。
安装
国内用户建议使用 cnpm 加速 npm 比如 npm install -g cnpm —registry=https://registry.npm.taobao.org 然后将之后所有的 npm 命令替换为 cnpm
:::warning windows 用户请使用 git bash 执行命令。 :::
首先,你需要安装 Node(> 10.9),以及 npm。
npm install @midwayjs/faas-cli -g
安装完成之后,在全局就拥有了 f
命令,你可以使用 f -h
查看拥有的能力。
:::info
@midwayjs/faas-cli
是当前最新的函数开发命令行工具,包含了本地调用,调试,mock 发布等一系列能力。
:::
windows 下的问题
如果你是windows 开发,也可以将此工具安装在项目中,使用 npx f
来调用后续的其他命令。
创建一个标准函数
执行下面的命令。
f create
你会看到以下脚手架选择,选择 faas-standard
。
Generating boerplate...
? Hello, traveller.
Which template do you like? …
⊙ Boilerplate
❯ faas-standard - A serverless boilerplate for aliyun fc, tencent scf and so on
faas-layer - A serverless runtime layer boilerplate
⊙ Examples
faas-react - A serverless example with react
faas-vue - A serverless example with vue
如图所示。
安装依赖。
npm install
目录结构
以下就是一个函数的最精简的结构,核心会包括一个 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。
import { Func, Inject, Provide } from '@midwayjs/decorator';
import { FaaSContext, FunctionHandler } from '@midwayjs/faas';
@Provide() // 提供 IoC 容器扫描标识
@Func('index.handler') // 标注函数
export class IndexService implements FunctionHandler {
@Inject()
ctx: FaaSContext; // 函数执行上下文
async handler() { // 函数体
return 'hello world'; // 函数返回值
}
}
函数定义文件
f.yml
是函数的定义文件,midway faas 通过这个文件,在构建时生成不同平台所能认识的文件,示例中的文件内容如下。
service:
name: serverless-hello-world ## 函数组名,可以理解为应用名
provider:
name: aliyun ## 发布的平台,这里是阿里云
functions: ## 函数的定义
index: ## 第一个函数名,名叫 index
handler: index.handler ## 函数的入口为 index.handler
events: ## 绑定的触发器,这里为 http 触发器,用到的方法为 get
- http:
method: get
package: ## 构建出来的压缩包文件名
artifact: code.zip
开发函数
本地调用
脚手架代码创建完毕后,我们可以尝试调用一下。
输入以下命令。
$ f invoke -f index
:::info
invoke 命令是用于本地简单的调用一下函数, -f
参数用于指定一个函数名,第一次调用时,会让用户选择需要发布到哪个平台。
:::
由于我们的示例为 http 触发器,所以输出结果如下,我们的 hello world
会被包裹在一个大 JSON 中。
--------- result start --------
{"headers":{"Content-Type":["application/json; charset=utf-8"],"content-type":"text/plain"},"statusCode":200,"body":"hello world","base64Encoded":false}
--------- result end --------
部署函数
部署函数分为两步,一是打包(package)二是部署发布(deploy),直接使用发布命令即可打包并部署函数:
$ f deploy
支持所有 package
命令的参数
参数 | 释义 |
---|---|
—resetConfig | 修改账户、部署区域等配置 |
部署到阿里云云函数(FC)
账号配置
阿里云部署首次需要配置 accountId
、accountKey
、accountSecret
相关配置获取,可参照下方图片:
点击此处跳转阿里云安全设置页。
点击跳转阿里云个人 AccessKey 页面。
HTTP 触发器域名
现阶段,阿里云发布的 HTTP 函数为了方便用户测试,会自动绑定一个临时域名。
部署到腾讯云云函数(SCF)
- 用户信息认证:
- 腾讯云在部署时,如果是首次部署,则控制台会展示相应二维码,扫码即可完成认证,后续会默认复用该配置
- 后续如想修改部署时的使用的用户,可手动在 serverless.yml 中设置当前用户的认证信息,教程:https://cloud.tencent.com/document/product/1154/38811
- 部署网关设置
- 腾讯云在部署时,会为函数默认创建网关触发器
- 如果想避免重复创建,可按下列教程操作
发布完成后,控制台会默认显示腾讯云此次创建的网关 serviceId(如下图所示)
此时需要修改 serverless.yml 的配置文件,serviceId 可以配在以下两处:
- provider
此处配置则对所有函数生效,所有函数共享一个网关 serviceId
provider:
name: tencent
serviceId: <控制台返回的 ServiceId>
- events/http
此处配置则对指定函数生效
functions:
index:
initializer: index.initializer
handler: index.handler
events:
- http:
method: get
serviceId: <控制台返回的 ServiceId>
=========
最后大家如果遇到什么问题,或者希望追加什么功能,或者学习内部实现,可以关注我们的仓库地址:
(👇,点赞,分享…三连)
https://github.com/midwayjs/midway