4

Digital Ocean Function 开发

 2 years ago
source link: https://liqiang.io/post/digitalocean-serverless-functions-develop?lang=ZH_CN
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Project 规范

两个最低要求:

  • packages 目录
  • project.yml

packages 目录规范

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

图 1:An Digital Ocean Function Creation
d33a9ce00940

那么对应的 package 目录就为:



  1. [[email protected]]# 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 这个参数定义了 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 功能实在还是比较年轻,首先公开的功能还是很局限的,但是我知道他支持的肯定不是只有这么多,但是事实上也只有这么多能知道怎么用。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK