ironFunctions 测试 FaaS

发布于 2021-04-07 21:06:55 字数 6052 浏览 1267 评论 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

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

文章
评论
84963 人气
更多

推荐作者

紫罗兰の梦幻

文章 0 评论 0

-2134

文章 0 评论 0

liuxuanli

文章 0 评论 0

意中人

文章 0 评论 0

○愚か者の日

文章 0 评论 0

xxhui

文章 0 评论 0

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