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。

  1. npm install @midwayjs/faas-cli -g

安装完成之后,在全局就拥有了 f 命令,你可以使用 f -h 查看拥有的能力。

:::info @midwayjs/faas-cli 是当前最新的函数开发命令行工具,包含了本地调用,调试,mock 发布等一系列能力。 :::

windows 下的问题

如果你是windows 开发,也可以将此工具安装在项目中,使用 npx f 来调用后续的其他命令。

创建一个标准函数

执行下面的命令。

  1. f create

你会看到以下脚手架选择,选择 faas-standard

  1. Generating boerplate...
  2. ? Hello, traveller.
  3. Which template do you like?
  4. Boilerplate
  5. faas-standard - A serverless boilerplate for aliyun fc, tencent scf and so on
  6. faas-layer - A serverless runtime layer boilerplate
  7. Examples
  8. faas-react - A serverless example with react
  9. faas-vue - A serverless example with vue

如图所示。

image.png

安装依赖。

  1. npm install

目录结构

以下就是一个函数的最精简的结构,核心会包括一个 f.yml 标准化函数文件,以及 TypeScript 的项目结构。

  1. .
  2. ├── f.yml # 标准化 spec 文件
  3. ├── package.json # 项目依赖
  4. ├── src
  5. └── index.ts # 函数入口
  6. └── tsconfig.json

我们来简单了解一下文件内容。

  • f.yml 函数定义文件
  • tsconfig.json tsc 配置文件(没有 IDE 会报错)
  • src 函数源码目录
  • src/index.ts 示例函数文件

函数文件

我们首先来看看函数文件,传统的函数是一个 function ,为了更符合 midway 体系,以及使用我们的依赖注入,这里将它变成了 class。

  1. import { Func, Inject, Provide } from '@midwayjs/decorator';
  2. import { FaaSContext, FunctionHandler } from '@midwayjs/faas';
  3. @Provide() // 提供 IoC 容器扫描标识
  4. @Func('index.handler') // 标注函数
  5. export class IndexService implements FunctionHandler {
  6. @Inject()
  7. ctx: FaaSContext; // 函数执行上下文
  8. async handler() { // 函数体
  9. return 'hello world'; // 函数返回值
  10. }
  11. }

函数定义文件

f.yml 是函数的定义文件,midway faas 通过这个文件,在构建时生成不同平台所能认识的文件,示例中的文件内容如下。

  1. service:
  2. name: serverless-hello-world ## 函数组名,可以理解为应用名
  3. provider:
  4. name: aliyun ## 发布的平台,这里是阿里云
  5. functions: ## 函数的定义
  6. index: ## 第一个函数名,名叫 index
  7. handler: index.handler ## 函数的入口为 index.handler
  8. events: ## 绑定的触发器,这里为 http 触发器,用到的方法为 get
  9. - http:
  10. method: get
  11. package: ## 构建出来的压缩包文件名
  12. artifact: code.zip

开发函数

本地调用

脚手架代码创建完毕后,我们可以尝试调用一下。

输入以下命令。

  1. $ f invoke -f index

:::info invoke 命令是用于本地简单的调用一下函数, -f 参数用于指定一个函数名,第一次调用时,会让用户选择需要发布到哪个平台。 :::

由于我们的示例为 http 触发器,所以输出结果如下,我们的 hello world 会被包裹在一个大 JSON 中。

  1. --------- result start --------
  2. {"headers":{"Content-Type":["application/json; charset=utf-8"],"content-type":"text/plain"},"statusCode":200,"body":"hello world","base64Encoded":false}
  3. --------- result end --------

部署函数

部署函数分为两步,一是打包(package)二是部署发布(deploy),直接使用发布命令即可打包并部署函数:

  1. $ f deploy

支持所有 package 命令的参数

参数 释义
—resetConfig 修改账户、部署区域等配置

部署到阿里云云函数(FC)

账号配置

阿里云部署首次需要配置 accountIdaccountKeyaccountSecret
Getting Started - 标准函数 - 图2

相关配置获取,可参照下方图片:
Getting Started - 标准函数 - 图3
点击此处跳转阿里云安全设置页


Getting Started - 标准函数 - 图4
点击跳转阿里云个人 AccessKey 页面

HTTP 触发器域名

现阶段,阿里云发布的 HTTP 函数为了方便用户测试,会自动绑定一个临时域名。

部署到腾讯云云函数(SCF)

  1. 用户信息认证:
    • 腾讯云在部署时,如果是首次部署,则控制台会展示相应二维码,扫码即可完成认证,后续会默认复用该配置
    • 后续如想修改部署时的使用的用户,可手动在 serverless.yml 中设置当前用户的认证信息,教程:https://cloud.tencent.com/document/product/1154/38811
  2. 部署网关设置
    • 腾讯云在部署时,会为函数默认创建网关触发器
    • 如果想避免重复创建,可按下列教程操作

发布完成后,控制台会默认显示腾讯云此次创建的网关 serviceId(如下图所示)
Getting Started - 标准函数 - 图5

此时需要修改 serverless.yml 的配置文件,serviceId 可以配在以下两处:

  1. provider

此处配置则对所有函数生效,所有函数共享一个网关 serviceId

  1. provider:
  2. name: tencent
  3. serviceId: <控制台返回的 ServiceId>
  1. events/http

此处配置则对指定函数生效

  1. functions:
  2. index:
  3. initializer: index.initializer
  4. handler: index.handler
  5. events:
  6. - http:
  7. method: get
  8. serviceId: <控制台返回的 ServiceId>

=========

最后大家如果遇到什么问题,或者希望追加什么功能,或者学习内部实现,可以关注我们的仓库地址:
(👇,点赞,分享…三连)
https://github.com/midwayjs/midway