Project 规范

两个最低要求:

  • packages 目录
  • project.yml

packages 目录规范

packages 的目录规范与你的 Function 的目录规范是一致的,例如我创建了这么一个 Function:

图 1:An Digital Ocean Function Creation

那么对应的 package 目录就为:

  1. [root@liqiang.io]# tree
  2. .
  3. ├── packages
  4. └── test-package
  5. └── functiona
  6. └── main.go
  7. └── project.yml

packages 目录允许包含多个 Functions 的,按照这个标准来就可以了。

project.yml 规范

这里直接先放一个又所有属性的 project 配置文件:

  1. parameters:
  2. param1: value
  3. environment:
  4. env1: value
  5. packages:
  6. - name: package1
  7. parameters: {}
  8. environment: {}
  9. annotations: {}
  10. actions:
  11. - name: function1
  12. parameters: {}
  13. environment: {}
  14. limits: {}
  15. runtime: 'go:default'
  16. main: ''

可以看到整体是三层结构:

  • 第一层:project 级别,一个 project 包含多个 package。在 project 层级定义的属性都将被 package 继承;
  • 第二层:package 级别,一个 package 包含多个 function。在 package 级别定义的属性也将被 function 继承(当然包括从 project 继承的属性);
  • 第三层:function 级别,定义属于这个 function 的特殊属性。

通用函数

可以看到,三层都有参数 parameters 和 environment。

parameters

定义在 parameters 的属性都会作为参数传递给 Function,例如 Function 的入口接口如下:

  1. func Main(args map[string]interface{}) map[string]interface{} {

那么这些定义的参数都是 args 的一部分。

environment

这个就是老生常谈的环境变量的,就不多做介绍了。

Function 参数

main

main 这个参数定义了 Function 的入口,你可能会奇怪,不是说入口是 Main 的么,为什么又需要自定义?其实也很简单,Main 是默认入口,如果你不定义,那么就用它,如果你需要自定义,就可以通过 main 参数来定义。

runtime

runtime 是用来定义应用运行时的,例如我用的是 go,那么就定义 go 作为 runtime,但是 go 也有不同版本啊,所以你可以指定 go 的版本,默认就使用 go:default,指定版本就类似于:go:1.18

limits

limits 字段是用于限制 Function 的一些属性,当前支持以下属性:

  • timeout:单位:ms,用于限制 API 的响应时间;
  • memory:单位:MB,用于限制程序的使用内存;
  • logs:单位:KB,用于限制程序的日志大小;

一些经验

  • Function 代码只能在单个目录下
    • 我猜测:Function 定位为function,而不是一个 project,所以规模不应该很大,单层目录可以满足要求
    • 我猜测:Function 是一个业务单元,当需要分层构造更复杂的结构时,需要组合不同的 Function 来完成
  • 感觉就是 Digital Ocean 的这个 Function 功能实在还是比较年轻,首先公开的功能还是很局限的,但是我知道他支持的肯定不是只有这么多,但是事实上也只有这么多能知道怎么用。