Midway Serverless 是用于构建 Node.js 云函数的 Serverless 框架。帮助您在云原生时代大幅降低维护成本,更专注于产品研发。



Midway Serverless 是阿里巴巴集团发起的开源项目,由一个专业的 Node.js 架构团队进行维护。已大规模应用于阿里集团各 BU 线上业务,稳定承载了数千万的流量。


本项目 Github: https://github.com/midwayjs/midway, 开源是为了给前端和 Node.js 的发展献一份力,还请到 Github 体验一下,并且帮忙点个 Star~ 🙇‍♂️感谢~

安装


国内用户建议使用 cnpm 加速 npm

比如 npm install -g cnpm --registry=https://registry.npm.taobao.org

然后将之后所有的 npm 命令替换为 cnpm


windows 用户请使用 git bash 执行命令。


首先,你需要安装 Node(> 10.9),以及 npm。


npm install @midwayjs/faas-cli -g


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


@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


如图所示。


image.png


安装依赖。


npm install


目录结构


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


.
├── f.yml           # 标准化 spec 文件
├── package.json    # 项目依赖
├── src
│   └── index.ts    # 函数入口
└── tsconfig.json



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



函数文件


我们首先来看看函数文件,传统的函数是一个 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


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)

账号配置

阿里云部署首次需要配置 accountIdaccountKeyaccountSecret

image


相关配置获取,可参照下方图片:

image

点击此处跳转阿里云安全设置页


image

点击跳转阿里云个人 AccessKey 页面


HTTP 触发器域名


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


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


  1. 用户信息认证:
  1. 部署网关设置


发布完成后,控制台会默认显示腾讯云此次创建的网关 serviceId(如下图所示)

image


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


  1. provider


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


provider:
  name: tencent
  serviceId: <控制台返回的 ServiceId>


  1. events/http


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


functions:
  index:
    initializer: index.initializer
    handler: index.handler
    events:
      - http:
          method: get
          serviceId: <控制台返回的 ServiceId>



最后


本项目 Github: https://github.com/midwayjs/midway, 开源是为了给前端和 Node.js 的发展献一份力,还请到 Github 体验一下,并且帮忙点个 Star~ 🙇‍♂️感谢~