ironFunctions 测试 FaaS
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论