ironFunctions 测试 FaaS

发布于 2021-04-07 21:06:55 字数 6052 浏览 1259 评论 0

https://github.com/iron-io/functions

本测试中使用的各种语言 hello world 程序位于 github 项目的 example/hello 目录下。

首先启动一个 ironFunctions 的服务器,后面执行 curl 会用到:

docker run --rm -it --name functions --privileged -v ${PWD}/data:/app/data -p 8080:8080 iron/functions

命令行 fn

执行下列脚本,会下载和安装命令行工具 fn。

$ curl -sSL http://get.iron.io/fn | sh
$ whereis fn
fn: /usr/local/bin/fn
$ mkdir /opt/iron && cd /opt/iron

go 语言测试

需要准备 go 语言的运行环境。 在当前目录下创建一个 func.go 文件:

package main

import (
    "encoding/json"
    "fmt"
    "os"
)

type Person struct {
    Name string
}

func main() {
    p := &Person{Name: "World"}
    json.NewDecoder(os.Stdin).Decode(p)
    fmt.Printf("Hello %v!", p.Name)
}

初始化,我的 $USERNAME=wbwang,执行下列脚本会创建 func.yaml 文件。

$ fn init $USERNAME/hello

查看 func.yaml 的文件内容,可以看到 fn 自动识别语言为 go。 然后构建 docker 镜像:

$ fn build
Running prebuild command: docker run --rm -v /opt/iron:/go/src/github.com/x/y -w /go/src/github.com/x/y iron/go:dev go build -o func

在构建时,fn 先启动一个镜像为 iron/go:dev 的 docker 容器来编译 func.go,然后把编译后的可执行程序打包为 docker 镜像 wbwang/hello:0.0.1。执行 func.go:

$ fn run
Hello World!

也可以直接执行构建出来的 docker 镜像:

$ docker run wbwang/hello:0.0.1
Hello World!

python 语言测试

删除 func.go,创建一个 func.py 的文件,文件内容:

print ("python hello world!!")

需要额外创建一个空文件 requirements.txt,否则报错。需要先安装 pip(apt-get install python-pip)。 重新初始化、构建、执行:

$ fn init wbwang/hello -f
$ fn build
Running prebuild command: docker run --rm -v /opt/iron:/worker -w /worker iron/python:2-dev pip install -t packages -r requirements.txt
(略)
$ fn run
python hello world!!

nodejs 测试

删除 func.py,创建 func.js:

name = "World";
fs = require('fs');
try {
    obj = JSON.parse(fs.readFileSync('/dev/stdin').toString())
    if (obj.name != "") {
        name = obj.name
    }
} catch(e) {}
console.log("Hello", name, "from Node!");

构建、运行:

$ fn build
Sending build context to Docker daemon 4.608 kB
Step 1 : FROM iron/node
 ---> 9ca501065d18
Step 2 : WORKDIR /function
 ---> Using cache
 ---> 78d86313bd0c
Step 3 : ADD . /function/
 ---> Using cache
 ---> ea27340f45dc
Step 4 : ENTRYPOINT node func.js
 ---> Using cache
 ---> ad07428e2aaf
Successfully built ad07428e2aaf
Function wbwang/hello:0.0.1 built successfully.
$ fn fun
Hello World from Node!

push 镜像

fn push 把构建出的 docker 镜像推送到 docker hub 中。在执行 push 命令前应使用 docker login 登录 docker hub:

$ docker login -u wbwang
Password:
Login Succeeded
$ fn push
The push refers to a repository [docker.io/wbwang/hello]
1c39755406e8: Pushed
fe696dc00a19: Pushed
e67f7ef625c5: Mounted from iron/python
321db514ef85: Mounted from iron/python
6102f0d2ad33: Mounted from iron/python
0.0.1: digest: sha256:d880817fc614a072e2333150e0f2670c230c7185c52f375c6995e9515291ae1d size: 1364
Function wbwang/hello:0.0.1 pushed successfully to Docker Hub.

创建应用和路由

$ fn apps create myapp
myapp created
$ fn routes create myapp /hello
/hello created with wbwang/hello:0.0.1
$ fn call myapp /hello
python hello world!!
$ curl http://localhost:8080/r/myapp/hello
python hello world!!

利用 fn 创建的 docker 镜像的默认 tag 是 0.0.1,而不是 docker 默认的 latest,要注意。

创建路由前,可以直接通过 docker run 命令来运行 wbwang/hello:0.0.1 这个镜像,但无法通过浏览器来启动它。创建路由后,就可以通过 http 协议来启动了。serverless 应用的典型运行方式启动、处理数据、数据结果、停止。所以前面用了 启动 而不是一般说的 请求

API 测试

获取应用列表。应用是功能的集合。jq 是一个 json 格式化显示工具。监听 8080 端口的 server 就是本文一开始 docker run 的那个。

$ curl localhost:8080/v1/apps | jq
{
  "message": "Successfully listed applications",
  "apps": [
    {
      "name": "myapp",
      "config": null
    }
  ]
}

创建路由。hello-world 镜像是 docker 的官方测试镜像。请求中 config 对象中的键值对会被放入环境变量。

$ curl -H "Content-Type: application/json" -X POST -d '{
    "route": {
        "path":"/hello1",
        "image":"wbwang/hello:0.0.1"
    }
}' http://localhost:8080/v1/apps/myapp/routes

{
  "message": "Route successfully created",
  "route": {
    "app_name": "myapp",
    "path": "/hello1",
    "image": "wbwang/hello:0.0.1",
    "memory": 128,
    "headers": {},
    "type": "sync",
    "format": "default",
    "max_concurrency": 1,
    "timeout": 30,
    "config": {}
  }
}

执行功能:

$ fn call myapp /hello1
$ curl localhost:8080/r/myapp/hello

同一个功能建了两个路由/hello/hello1,访问这两个路由的任何一个都可以。

第一次调用功能的时候,由于要从docker hub上拉镜像下来,可能耗时比较长。第二次调用就快了。

其他镜像测试

ironFuntions 还可以运行普通的 docker 镜像。docker 官方提供的 hello-world 镜像,通过标准输出(STDOUT)输出一些文本欢迎词。下面用ironFunctions 去运行它。首先创建路由:

curl -H "Content-Type: application/json" -X POST -d '{
    "route": {
        "path":"/helloworld",
        "image":"hello-world"
    }
}' http://localhost:8080/v1/apps/myapp/routes

然后执行:

$ curl localhost:8080/r/myapp/helloworld
(很多欢迎词,省略)

ironFunctions 很擅长把标准输出转换成 http 响应。

实测看,ironFunctions 的 docker 镜像在本地没有缓存,如果 iron/functions 服务重启,则需要重新从 docker hub 拉取镜像。对于本地 docker 镜像库的支持尚在开发中。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84960 人气
更多

推荐作者

无远思近则忧

文章 0 评论 0

久伴你

文章 0 评论 0

萌无敌

文章 0 评论 0

新一帅帅

文章 0 评论 0

莫多说

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文